{"version":3,"file":"mapsvg-front.umd.js","sources":["../js/mapsvg/Core/globals.js","../js/mapsvg/Map/default-options.ts","../js/mapsvg/Vendor/tinycolor.js","../js/mapsvg/Infrastructure/Server/Server.ts","../js/mapsvg/Core/Events.ts","../js/mapsvg/Core/ArrayIndexed.ts","../js/mapsvg/Infrastructure/Server/SchemaField.ts","../js/mapsvg/Infrastructure/Server/Schema.ts","../js/mapsvg/Infrastructure/Server/Query.ts","../js/mapsvg/Location/LocationAddress.ts","../js/mapsvg/Location/Location.ts","../js/mapsvg/Object/CustomObject.ts","../js/mapsvg/Core/Repository.ts","../js/mapsvg/Map/MapsRepository.ts","../js/mapsvg/Map/MapsV2Repository.ts","../js/mapsvg/Map/Converter.ts","../js/mapsvg/Core/ResizeSensor.ts","../js/mapsvg/Map/MapOptionsInterface.ts","../js/mapsvg/MapObject/MapObject.ts","../js/mapsvg/Marker/Marker.ts","../js/mapsvg/MarkerCluster/MarkerCluster.ts","../js/mapsvg/Region/Region.ts","../js/mapsvg/Infrastructure/Server/SchemaRepository.ts","../js/mapsvg/Core/Controller.ts","../js/mapsvg/Directory/Directory.ts","../js/mapsvg/Details/Details.ts","../js/mapsvg/FormBuilder/FormElements/FormElement.ts","../js/mapsvg/FormBuilder/FormElements/Checkbox/CheckboxFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Checkboxes/CheckboxesFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Date/DateFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Distance/DistanceFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Empty/EmptyFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Id/IdFormElement.ts","../js/vendor/sortable/sortable.min.js","../js/mapsvg/FormBuilder/FormElements/Images/ImagesFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Location/LocationFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Modal/ModalFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Post/PostFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Radio/RadioFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Regions/RegionsFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Save/SaveFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Search/SearchFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Select/SelectFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Status/StatusFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Textarea/TextareaFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Text/TextFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Title/TitleFormElement.ts","../js/mapsvg/FormBuilder/FormElements/Colorpicker/ColorPickerFormElement.ts","../js/mapsvg/FormBuilder/FormElements/FormElementFactory.ts","../js/mapsvg/FormBuilder/FormBuilder.ts","../js/mapsvg/Filters/Filters.ts","../js/mapsvg/Popover/Popover.ts","../js/mapsvg/Tooltips/Tooltip.ts","../js/mapsvg/Map/Map.ts"],"sourcesContent":["/**\n * Global MapSVG class. It contains all other MapSVG classes and some static methods.\n * @constructor\n * @example\n * var mapsvg = MapSVG.get(0); // get first map instance\n * var mapsvg2 = MapSVG.get(1); // get second map instance\n * var mapsvg3 = MapSVG.getById(123); // get map by ID\n *\n * var mapsvg = new MapSVG.Map(\"my-container\",{\n *   source: \"/path/to/map.svg\"\n * });\n *\n * var marker = new MapSVG.Marker({\n *   location: location,\n *   mapsvg: mapsvg\n * });\n *\n * if(MapSVG.isPhone){\n *  // do something special for mobile devices\n * }\n *\n *\n */\nvar MapSVG = function () {};\nconst $ = jQuery;\n\nMapSVG.formBuilder = {};\nMapSVG.mediaUploader = {};\n\nif (typeof wp !== \"undefined\" && typeof wp.media !== \"undefined\") {\n    MapSVG.mediaUploader = wp.media({\n        title: \"Choose images\",\n        button: {\n            text: \"Choose images\",\n        },\n        multiple: true,\n    });\n}\n\n/**\n * Keeps loaded HBS templates\n * @type {Array}\n * @private\n * @static\n * @property\n */\nMapSVG.templatesLoaded = {};\n\n/**\n * Keeps URLs\n * @type {Array}\n * @private\n * @static\n * @property\n */\nif (typeof mapsvg_paths !== \"undefined\") {\n    MapSVG.urls = mapsvg_paths;\n} else {\n    MapSVG.urls = {};\n}\nif (typeof ajaxurl !== \"undefined\") {\n    MapSVG.urls.ajaxurl = ajaxurl;\n}\n\n/**\n * Keeps map instances\n * @type {Array}\n * @private\n * @static\n * @property\n */\nMapSVG.instances = [];\n\nMapSVG.userAgent = navigator.userAgent.toLowerCase();\n\n/**\n * Determines if current device is touch-device\n * @type {boolean}\n * @static\n * @property\n */\nMapSVG.touchDevice =\n    \"ontouchstart\" in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;\n// (MapSVG.userAgent.indexOf(\"ipad\") > -1) ||\n// (MapSVG.userAgent.indexOf(\"iphone\") > -1) ||\n// (MapSVG.userAgent.indexOf(\"ipod\") > -1) ||\n// (MapSVG.userAgent.indexOf(\"android\") > -1);\n\n/**\n * Determines if current device is iOS-device\n * @type {boolean}\n * @static\n * @property\n */\nMapSVG.ios =\n    MapSVG.userAgent.indexOf(\"ipad\") > -1 ||\n    MapSVG.userAgent.indexOf(\"iphone\") > -1 ||\n    MapSVG.userAgent.indexOf(\"ipod\") > -1;\n\n/**\n * Determines if current device is Android-device\n * @type {boolean}\n * @static\n * @property\n */\nMapSVG.android = MapSVG.userAgent.indexOf(\"android\");\n\n/**\n * Determines if current device is mobile-device\n * @type {boolean}\n * @static\n * @property\n */\nMapSVG.isPhone = window.matchMedia(\"only screen and (max-width: 812px)\").matches;\n\n/**\n * Keeps browser information\n * @type {object}\n * @static\n * @property\n */\nMapSVG.browser = {};\nMapSVG.browser.ie =\n    MapSVG.userAgent.indexOf(\"msie\") > -1 ||\n    MapSVG.userAgent.indexOf(\"trident\") > -1 ||\n    MapSVG.userAgent.indexOf(\"edge\") > -1\n        ? {}\n        : false;\nMapSVG.browser.firefox = MapSVG.userAgent.indexOf(\"firefox\") > -1;\nMapSVG.browser.safari =\n    MapSVG.userAgent.indexOf(\"safari\") > -1 && MapSVG.userAgent.indexOf(\"chrome\") === -1;\n\n/**\n * Contains device information\n * @type {object}\n * @static\n * @property\n */\nvar ua = window.navigator.userAgent;\nMapSVG.device = {};\nMapSVG.device.ios = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);\nMapSVG.device.android = !!ua.match(/Android/i);\n\nif (!String.prototype.trim) {\n    String.prototype.trim = function () {\n        return this.replace(/^\\s+|\\s+$/g, \"\");\n    };\n}\n\n/**\n * Converts mouse event object to x/y coordinates\n * @param e\n * @returns {{x: *, y: *}}\n */\nMapSVG.mouseCoords = function (e) {\n    if (e.clientX) {\n        return { x: e.clientX + $(document).scrollLeft(), y: e.clientY + $(document).scrollTop() };\n    }\n    if (e.pageX) {\n        return { x: e.pageX, y: e.pageY };\n    } else if (MapSVG.touchDevice) {\n        e = e.originalEvent || e;\n        return e.touches && e.touches[0]\n            ? { x: e.touches[0].pageX, y: e.touches[0].pageY }\n            : { x: e.changedTouches[0].pageX, y: e.changedTouches[0].pageY };\n    }\n};\n\n/**\n * Adds new instance of the map\n * @param {MapSVG.Map} mapsvg\n */\nMapSVG.addInstance = function (mapsvg) {\n    MapSVG.instances.push(mapsvg);\n};\n\nMapSVG.get = function (index) {\n    return MapSVG.instances[index];\n};\n\nMapSVG.getById = function (id) {\n    var instance = MapSVG.instances.filter(function (i) {\n        return i.id == id;\n    });\n    if (instance.length > 0) {\n        return instance[0];\n    }\n};\n\nMapSVG.getByContainerId = function (id) {\n    var instance = MapSVG.instances.filter(function (i) {\n        return i.$map.attr(\"id\") == id;\n    });\n    if (instance.length > 0) {\n        return instance[0];\n    }\n};\n\nMapSVG.extend = function (sub, base) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n};\n\nMapSVG.ucfirst = function (string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n};\nMapSVG.parseBoolean = function (string) {\n    switch (String(string).toLowerCase()) {\n        case \"on\":\n        case \"true\":\n        case \"1\":\n        case \"yes\":\n        case \"y\":\n            return true;\n        case \"off\":\n        case \"false\":\n        case \"0\":\n        case \"no\":\n        case \"n\":\n            return false;\n        default:\n            return undefined;\n    }\n};\nMapSVG.isNumber = function (n) {\n    return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nMapSVG.safeURL = function (url) {\n    if (url.indexOf(\"http://\") == 0 || url.indexOf(\"https://\") == 0)\n        url = \"//\" + url.split(\"://\").pop();\n    return url.replace(/^.*\\/\\/[^\\/]+/, \"\");\n};\n\nMapSVG.convertToText = function (obj) {\n    //create an array that will later be joined into a string.\n    var string = [];\n\n    //is object\n    //    Both arrays and objects seem to return \"object\"\n    //    when typeof(obj) is applied to them. So instead\n    //    I am checking to see if they have the property\n    //    join, which normal objects don't have but\n    //    arrays do.\n    if (obj === null) {\n        return null;\n    }\n    if (obj === undefined) {\n        return '\"\"';\n    } else if (typeof obj == \"object\" && obj.join == undefined) {\n        var prop;\n        for (prop in obj) {\n            if (obj.hasOwnProperty(prop)) {\n                var key = '\"' + prop.replace(/\\\"/g, '\\\\\"') + '\"'; //prop.search(/[^a-zA-Z]+/) === -1 ?  prop : ...\n                string.push(key + \": \" + MapSVG.convertToText(obj[prop]));\n            }\n        }\n        return \"{\" + string.join(\",\") + \"}\";\n\n        //is array\n    } else if (typeof obj == \"object\" && !(obj.join == undefined)) {\n        var prop;\n        for (prop in obj) {\n            string.push(MapSVG.convertToText(obj[prop]));\n        }\n        return \"[\" + string.join(\",\") + \"]\";\n\n        //is function\n    } else if (typeof obj == \"function\") {\n        return obj.toString().replace(\"function anonymous\", \"function\");\n        // string.push(obj.toString().replace('function anonymous','function'));\n\n        //all other values can be done with JSON.stringify\n    } else {\n        return JSON.stringify(obj);\n        // var s = JSON.stringify(obj);\n        // string.push(s);\n    }\n\n    return string.join(\",\");\n};\n\n// Create Element.remove() function if not exists\nif (!(\"remove\" in Element.prototype)) {\n    Element.prototype.remove = function () {\n        if (this.parentNode) {\n            this.parentNode.removeChild(this);\n        }\n    };\n}\n\nMath.hypot =\n    Math.hypot ||\n    function () {\n        var y = 0;\n        var length = arguments.length;\n\n        for (var i = 0; i < length; i++) {\n            if (arguments[i] === Infinity || arguments[i] === -Infinity) {\n                return Infinity;\n            }\n            y += arguments[i] * arguments[i];\n        }\n        return Math.sqrt(y);\n    };\nSVGElement.prototype.getTransformToElement =\n    SVGElement.prototype.getTransformToElement ||\n    function (toElement) {\n        let value;\n        try {\n            value = toElement.getScreenCTM().inverse().multiply(this.getScreenCTM());\n        } catch (e) {\n            return;\n        }\n        return value;\n    };\n\nMap.prototype.toArray = function () {\n    return Array.from(this, ([name, value]) => value);\n};\n\nMapSVG.ResizeSensor = class ResizeSensor {\n    constructor(element, callback) {\n        var _this = this;\n        _this.element = element;\n        _this.callback = callback;\n        var style = getComputedStyle(element);\n        var zIndex = parseInt(style.zIndex);\n        if (isNaN(zIndex)) {\n            zIndex = 0;\n        }\n        zIndex--;\n        _this.expand = document.createElement(\"div\");\n        _this.expand.style.position = \"absolute\";\n        _this.expand.style.left = \"0px\";\n        _this.expand.style.top = \"0px\";\n        _this.expand.style.right = \"0px\";\n        _this.expand.style.bottom = \"0px\";\n        _this.expand.style.overflow = \"hidden\";\n        _this.expand.style.zIndex = zIndex.toString();\n        _this.expand.style.visibility = \"hidden\";\n        var expandChild = document.createElement(\"div\");\n        expandChild.style.position = \"absolute\";\n        expandChild.style.left = \"0px\";\n        expandChild.style.top = \"0px\";\n        expandChild.style.width = \"10000000px\";\n        expandChild.style.height = \"10000000px\";\n        _this.expand.appendChild(expandChild);\n        _this.shrink = document.createElement(\"div\");\n        _this.shrink.style.position = \"absolute\";\n        _this.shrink.style.left = \"0px\";\n        _this.shrink.style.top = \"0px\";\n        _this.shrink.style.right = \"0px\";\n        _this.shrink.style.bottom = \"0px\";\n        _this.shrink.style.overflow = \"hidden\";\n        _this.shrink.style.zIndex = zIndex.toString();\n        _this.shrink.style.visibility = \"hidden\";\n        var shrinkChild = document.createElement(\"div\");\n        shrinkChild.style.position = \"absolute\";\n        shrinkChild.style.left = \"0px\";\n        shrinkChild.style.top = \"0px\";\n        shrinkChild.style.width = \"200%\";\n        shrinkChild.style.height = \"200%\";\n        _this.shrink.appendChild(shrinkChild);\n        _this.element.appendChild(_this.expand);\n        _this.element.appendChild(_this.shrink);\n        var size = element.getBoundingClientRect();\n        _this.currentWidth = size.width;\n        _this.currentHeight = size.height;\n        _this.setScroll();\n        _this.expand.addEventListener(\"scroll\", function () {\n            _this.onScroll();\n        });\n        _this.shrink.addEventListener(\"scroll\", function () {\n            _this.onScroll();\n        });\n    }\n    onScroll() {\n        var _this = this;\n        var size = _this.element.getBoundingClientRect();\n        var newWidth = size.width;\n        var newHeight = size.height;\n        if (newWidth != _this.currentWidth || newHeight != _this.currentHeight) {\n            _this.currentWidth = newWidth;\n            _this.currentHeight = newHeight;\n            _this.callback();\n        }\n        this.setScroll();\n    }\n    setScroll() {\n        this.expand.scrollLeft = 10000000;\n        this.expand.scrollTop = 10000000;\n        this.shrink.scrollLeft = 10000000;\n        this.shrink.scrollTop = 10000000;\n    }\n    destroy() {\n        this.expand.remove();\n        this.shrink.remove();\n    }\n};\n\nMapSVG.nonce = function () {\n    return mapsvg_runtime_vars.nonce;\n};\n\n/**\n * Adds # hash at the beginning of HEX color value\n * @param {String} color\n * @returns {String}\n * @private\n */\nMapSVG.fixColorHash = (color) => {\n    const hexColorNoHash = new RegExp(/^([0-9a-f]{3}|[0-9a-f]{6})$/i);\n    if (color && color.match(hexColorNoHash) !== null) {\n        color = \"#\" + color;\n    }\n    return color;\n};\n\n/**\n * Delays method execution.\n * For example, it can be used in search input fields to prevent sending\n * an ajax request on each key press.\n * @param {Function} method\n * @param {number} delay\n * @param {object} scope\n * @param {array} params\n * @private\n */\nMapSVG.throttle = (method, delay, scope, params) => {\n    clearTimeout(method._tId);\n    method._tId = setTimeout(function () {\n        method.apply(scope, params);\n    }, delay);\n};\nMapSVG.geocode = (query, callback) => {\n    if (!window.google) {\n        console.error(\"MapSVG: can't do Geocoding - Google Maps API is not loaded.\");\n        jQuery.growl.error({\n            title: \"Error\",\n            message: \"Google Maps API files are not loaded\",\n        });\n        return false;\n    }\n    // if (!MapSVG.options.google_api_key) {\n    //     jQuery.growl.error({\n    //         title: \"Error\",\n    //         message: \"Google Maps API key is not provided\",\n    //     });\n    //     return false;\n    // }\n    if (!MapSVG.geocoder) {\n        MapSVG.geocoder = new google.maps.Geocoder();\n    }\n\n    MapSVG.throttle(MapSVG.geocoder.geocode, 500, MapSVG.geocoder, [\n        query,\n        function (results, status) {\n            if (status === \"OK\") {\n                callback(results);\n            } else {\n                jQuery.growl.error({\n                    title: \"Error: \" + status,\n                    message:\n                        \"There is some problem with Google API keys. See browser's console for more details\",\n                });\n            }\n        },\n    ]);\n};\n\nMapSVG.handleFailedRequest = (response) => {\n    var message = \"\";\n\n    if (response.status === 403) {\n        if (response.responseText.indexOf(\"Wordfence\") !== -1) {\n            message +=\n                \"The request has been blocked by Wordfence. \" +\n                'Switch Wordfence to \"Learning mode\", and save the map settings again. ' +\n                \"If the settings are saved successfully, you can switch Wordfence back to normal mode.\";\n        } else {\n            message +=\n                \"The request has been blocked by your server. \" +\n                \"Do you have mod_sec Apache's module enabled? If that's the case you need to change its settings.\";\n        }\n    } else {\n        if (response && response.responseText) {\n            try {\n                var _response = JSON.parse(response.responseText);\n                if (_response && _response.data && _response.data.error) {\n                    message = _response.data.error;\n                }\n            } catch (e) {\n                null;\n            }\n        }\n    }\n\n    $.growl.error({\n        title: \"Error: \" + response.status + \" \" + response.statusText,\n        message: message,\n        duration: 30000,\n    });\n};\n\nif (!Object.values) {\n    Object.values = function (object) {\n        return Object.keys(object).map(function (k) {\n            return object[k];\n        });\n    };\n}\n\nwindow.MapSVG = MapSVG;\n\nexport { MapSVG };\n","const defRegionTemplate =\n    \"<div>\\n\" +\n    \"  <p>This is the demo content of the <strong>Region %templateType%</strong>.</p>\\n\" +\n    '  <p>How to edit it: if you are in mapsvg control panel now, click on the following link to open the template editor for this view: <a href=\"#\" class=\"mapsvg-template-link\" data-template=\"%templateTypeSnake%Region\">Menu > Templates > Region %templateType%</a>.</p>\\n' +\n    '  <p>More information about templates: <a href=\"https://mapsvg.com/docs/map-editor/templates\" target=\"_blank\">mapsvg.com/docs/map-editor/templates</a></p>\\n' +\n    \"</div>\\n\" +\n    \"<hr />\\n\\n\" +\n    \"<!-- Region fields are available in this template -->\\n\" +\n    \"<h5>{{#if title}} {{title}} {{else}} {{id}} {{/if}}</h5>\\n\" +\n    \"<p>Status: {{status_text}}</p>\\n\\n\" +\n    \"<!-- Show all linked Database Objects: -->\\n\" +\n    \"{{#each objects}}\\n\\n\" +\n    \"  <!-- DB Object are available inside of this block -->\\n\\n\" +\n    \"  <h5>{{title}}</h5>\\n\" +\n    \"  <!-- When you need to render a field as HTML, use 3 curly braces instead of 2:-->\\n\" +\n    \"  <p>{{{description}}}</p>\\n\" +\n    \"  <p><em>{{location.address.formatted}}</em></p>\\n\\n\" +\n    \"  <!-- Show all images: -->\\n\" +\n    \"  {{#each images}}\\n\" +\n    '    <!-- Image fields \"thumbnail\", \"medium\", \"full\" -->\\n' +\n    \"    <!-- are available in this block                -->\\n\" +\n    '    <img src=\"{{thumbnail}}\" />\\n' +\n    \"  {{/each}}\\n\\n\" +\n    \"{{/each}}\";\n\nconst defDBTemplate =\n    \"<div>\\n\" +\n    \"  <p>This is the demo content of the <strong>DB Object %templateType%</strong>.</p>\\n\" +\n    '  <p>How to edit it: if you are in mapsvg control panel now, click on the following link to open the template editor for this view: <a href=\"#\" class=\"mapsvg-template-link\" data-template=\"%templateTypeSnake%\">Menu > Templates > DB Object %templateType%</a>.</p>\\n' +\n    '  <p>More information about templates: <a href=\"https://mapsvg.com/docs/map-editor/templates\" target=\"_blank\">mapsvg.com/docs/map-editor/templates</a></p>\\n' +\n    \"</div>\\n\" +\n    \"<hr />\\n\\n\" +\n    \"<!-- DB Object fields are available in this template. -->\\n\" +\n    \"<h5>{{title}}</h5>\\n\" +\n    \"<!-- When you need to render a fields as HTML, use 3 curly braces instead of 2:-->\\n\" +\n    \"<p>{{{description}}}</p>\\n\" +\n    \"<p><em>{{location.address.formatted}}</em></p>\\n\\n\" +\n    \"<!-- Show all images: -->\\n\" +\n    \"{{#each images}}\\n\" +\n    '  <!-- Image fields \"thumbnail\", \"medium\", \"full\" -->\\n' +\n    \"  <!-- are available in this block                -->\\n\" +\n    '  <img src=\"{{thumbnail}}\" />\\n' +\n    \"{{/each}}\\n\\n\" +\n    \"<!-- Show all linked Regions, comma-separated: -->\\n\" +\n    \"<p> Regions: \\n\" +\n    \"  {{#each regions}}\\n\" +\n    \"    <!-- Region fields are available in this block -->\\n\" +\n    \"    {{#if title}}\\n\" +\n    \"      {{title}}\\n\" +\n    \"    {{else}}\\n\" +\n    \"      {{id}}\\n\" +\n    \"    {{/if}}{{#unless @last}}, {{/unless}}\\n\" +\n    \"  {{/each}}\\n\" +\n    \"</p>\";\n\nconst dirItemItemTemplate =\n    \"<!-- If Directory Source = Database: DB Object fields are available in this template -->\\n\" +\n    \"<!-- If Directory Source = Regions: Region fields are available in this template -->\\n\" +\n    \"{{title}}\";\n\nconst DefaultOptions = {\n    source: \"\",\n    markerLastID: 0,\n    regionLastID: 0,\n    dataLastID: 1,\n    disableAll: false,\n    width: null,\n    height: null,\n    lockAspectRatio: false,\n    padding: { top: 0, left: 0, right: 0, bottom: 0 },\n    maxWidth: null,\n    maxHeight: null,\n    minWidth: null,\n    minHeight: null,\n    loadingText: \"Loading map...\",\n    //colors              : {base: \"#E1F1F1\", background: \"#eeeeee\", hover: \"#548eac\", selected: \"#065A85\", stroke: \"#7eadc0\"},\n    colorsIgnore: false,\n    colors: {\n        baseDefault: \"#000000\",\n        background: \"#eeeeee\",\n        selected: 40,\n        hover: 20,\n        directory: \"#fafafa\",\n        detailsView: \"\",\n        status: {},\n        clusters: \"\",\n        clustersBorders: \"\",\n        clustersText: \"\",\n        clustersHover: \"\",\n        clustersHoverBorders: \"\",\n        clustersHoverText: \"\",\n        markers: {\n            base: { opacity: 100, saturation: 100 },\n            hovered: { opacity: 100, saturation: 100 },\n            unhovered: { opacity: 40, saturation: 100 },\n            active: { opacity: 100, saturation: 100 },\n            inactive: { opacity: 40, saturation: 100 },\n        },\n    },\n    regions: {},\n    clustering: { on: false },\n    viewBox: [],\n    cursor: \"default\",\n    manualRegions: false,\n    onClick: null,\n    mouseOver: null,\n    mouseOut: null,\n    menuOnClick: null,\n    beforeLoad: null,\n    afterLoad: null,\n    zoom: {\n        on: true,\n        limit: [0, 22],\n        delta: 2,\n        buttons: { on: true, location: \"right\" },\n        mousewheel: true,\n        fingers: true,\n        hideSvg: false,\n        hideSvgZoomLevel: 7,\n    },\n    scroll: { on: true, limit: false, background: false, spacebar: false },\n    responsive: true,\n    tooltips: { on: false, position: \"bottom-right\", template: \"\", maxWidth: \"\", minWidth: 100 },\n    popovers: {\n        on: false,\n        position: \"top\",\n        template: \"\",\n        centerOn: true,\n        width: 300,\n        maxWidth: 50,\n        maxHeight: 50,\n    },\n    multiSelect: false,\n    regionStatuses: {\n        \"1\": { label: \"Enabled\", value: \"1\", color: \"\", disabled: false },\n        \"0\": { label: \"Disabled\", value: \"0\", color: \"\", disabled: true },\n    },\n    events: {\n        afterLoad:\n            \"function(){\\n\" +\n            \"  // var mapsvg = this;\\n\" +\n            \"  // var regions = mapsvg.regions;\\n\" +\n            \"  // var dbObjects = mapsvg.database.getLoaded();\\n\" +\n            \"}\",\n        beforeLoad:\n            \"function(){\\n\" +\n            \"  // var mapsvg = this;\\n\" +\n            \"  // var settings = mapsvg.options;\\n\" +\n            \"  // console.log(settings);\\n\" +\n            \"}\",\n        databaseLoaded:\n            \"function (){\\n\" +\n            \"  // var mapsvg = this;\\n\" +\n            \"  // var dbObjects = mapsvg.database.getLoaded();\\n\" +\n            \"}\",\n        \"click.region\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var region = this;\\n\" +\n            \"  // console.log(region);\\n\" +\n            \"}\",\n        \"mouseover.region\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var region = this;\\n\" +\n            \"  // console.log(region);\\n\" +\n            \"}\",\n        \"mouseout.region\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var region = this;\\n\" +\n            \"  // console.log(region);\\n\" +\n            \"}\",\n        \"click.marker\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var marker = this;\\n\" +\n            \"  // console.log(marker);\\n\" +\n            \"}\",\n        \"mouseover.marker\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var marker = this;\\n\" +\n            \"  // console.log(marker);\\n\" +\n            \"}\",\n        \"mouseout.marker\":\n            \"function (e, mapsvg){\\n\" +\n            \"  // var marker = this;\\n\" +\n            \"  // console.log(marker);\\n\" +\n            \"}\",\n        \"click.directoryItem\":\n            \"function (e, regionOrObject, mapsvg){\\n\" + \"  // var itemjQueryObject = this;\\n\" + \"}\",\n        \"mouseover.directoryItem\":\n            \"function (e, regionOrObject, mapsvg){\\n\" + \"  // var itemjQueryObject = this;\\n\" + \"}\",\n        \"mouseout.directoryItem\":\n            \"function (e, regionOrObject, mapsvg){\\n\" + \"  // var itemjQueryObject = this;\\n\" + \"}\",\n        \"shown.popover\": \"function (mapsvg){\\n\" + \"  // var popoverjQueryObject = this;\\n\" + \"}\",\n        \"closed.popover\": \"function (mapsvg){\\n\" + \"  // var popoverjQueryObject = this;\\n\" + \"}\",\n        \"closed.detailsView\":\n            \"function (mapsvg){\\n\" + \"  // var detailsjQueryObject = this;\\n\" + \"}\",\n        \"shown.detailsView\":\n            \"function (mapsvg){\\n\" + \"  // var detailsjQueryObject = this;\\n\" + \"}\",\n    },\n    css:\n        \"#mapsvg-map-%id% .mapsvg-tooltip {\\n\\n}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-popover {\\n\\n}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-details-container {\\n\\n}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-directory-item {\\n\\n}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-region-label {\\n\" +\n        \"  /* background-color: rgba(255,255,255,.6); */\\n\" +\n        \"  font-size: 11px;\\n\" +\n        \"  padding: 3px 5px;\\n\" +\n        \"  border-radius: 4px;\\n\" +\n        \"}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-marker-label {\\n\" +\n        \"  padding: 3px 5px;\\n\" +\n        \"  /*\\n\" +\n        \"  border-radius: 4px;\\n\" +\n        \"  background-color: white;\\n\" +\n        \"  margin-top: -4px;\\n\" +\n        \"  */\\n}\\n\" +\n        \"#mapsvg-map-%id% .mapsvg-filters-wrap {\\n\\n}\\n\" +\n        \"\\n\\n\\n\\n\\n\\n\",\n    templates: {\n        popoverRegion: defRegionTemplate\n            .replace(/%templateType%/g, \"Popover\")\n            .replace(/%templateTypeSnake%/g, \"popover\"),\n        popoverMarker: defDBTemplate\n            .replace(/%templateType%/g, \"Popover\")\n            .replace(/%templateTypeSnake%/g, \"popover\"),\n        tooltipRegion: \"<!-- Region fields are available in this template -->\\n{{id}} - {{title}}\",\n        tooltipMarker: \"<!-- DB Object fields are available in this template -->\\n{{title}}\",\n        directoryItem: dirItemItemTemplate,\n        directoryCategoryItem:\n            '<!-- Available fields: \"label\", \"value\", \"counter\" -->\\n<span class=\"mapsvg-category-label\">{{label}}</span>\\n<span class=\"mapsvg-category-counter\">{{counter}}</span>\\n<span class=\"mapsvg-chevron\"></span>',\n        detailsView: defDBTemplate\n            .replace(/%templateType%/g, \"Details View\")\n            .replace(/%templateTypeSnake%/g, \"detailsView\"),\n        detailsViewRegion: defRegionTemplate\n            .replace(/%templateType%/g, \"Details View\")\n            .replace(/%templateTypeSnake%/g, \"detailsView\"),\n        labelMarker: \"<!-- DB Object fields are available in this template -->\\n{{title}}\",\n        labelRegion: \"<!-- Region fields are available in this template -->\\n{{title}}\",\n        labelLocation: \"You are here!\",\n    },\n    choropleth: {\n        on: false,\n        source: \"regions\",\n        sourceFieldSelect: {\n            on: false,\n            variants: [],\n        },\n        bubbleMode: false,\n        bubbleSize: {\n            min: 20,\n            max: 40,\n        },\n        labels: { low: \"low\", high: \"high\" },\n        colors: { lowRGB: null, highRGB: null, low: \"#550000\", high: \"#ee0000\", noData: \"#333333\" },\n        min: 0,\n        max: 0,\n        coloring: {\n            mode: \"gradient\",\n            noData: {\n                color: \"#999999\",\n                description: \"No data\",\n            },\n            gradient: {\n                colors: {\n                    lowRGB: null,\n                    highRGB: null,\n                    diffRGB: null,\n                    low: \"#550000\",\n                    high: \"#ee0000\",\n                },\n                labels: {\n                    low: \"low\",\n                    high: \"high\",\n                },\n                values: {\n                    min: null,\n                    max: null,\n                    maxAdjusted: null,\n                },\n            },\n            palette: {\n                outOfRange: {\n                    color: \"#ececec\",\n                    description: \"Out of range\",\n                },\n                colors: [\n                    {\n                        color: \"#550000\",\n                        valueFrom: 0,\n                        valueTo: 50,\n                        description: \"\",\n                    },\n                ],\n            },\n            legend: {\n                on: true,\n                layout: \"vertical\",\n                container: \"bottom-left\",\n                title: \"Choropleth map\",\n                text: \"\",\n                description: \"\",\n                width: \"20%\",\n                height: \"20%\",\n            },\n        },\n    },\n    filters: {\n        on: true,\n        source: \"database\",\n        location: \"header\",\n        modalLocation: \"map\",\n        width: \"100%\",\n        hide: false,\n        showButtonText: \"Filters\",\n        clearButtonText: \"Clear all\",\n        clearButton: false,\n        searchButton: false,\n        searchButtonText: \"Search\",\n        padding: \"\",\n    },\n    menu: {\n        on: false,\n        hideOnMobile: true,\n        location: \"leftSidebar\",\n        locationMobile: \"leftSidebar\",\n        search: false,\n        containerId: \"\",\n        searchPlaceholder: \"Search...\",\n        searchFallback: false,\n        source: \"database\",\n        showFirst: \"map\",\n        showMapOnClick: true,\n        minHeight: \"400\",\n        sortBy: \"id\",\n        sortDirection: \"desc\",\n        categories: {\n            on: false,\n            groupBy: \"\",\n            hideEmpty: true,\n            collapse: true,\n            collapseOther: true,\n        },\n        clickActions: {\n            region: \"default\",\n            marker: \"default\",\n            directoryItem: {\n                triggerClick: true,\n                showPopover: false,\n                showDetails: true,\n            },\n        },\n        detailsViewLocation: \"overDirectory\",\n        noResultsText: \"No results found\",\n        filterout: { field: \"\", cond: \"=\", val: \"\" },\n    },\n    database: {\n        pagination: {\n            on: true,\n            perpage: 30,\n            next: \"Next\",\n            prev: \"Prev.\",\n            showIn: \"both\",\n        },\n        loadOnStart: true,\n        table: \"\",\n    },\n    actions: {\n        map: {\n            afterLoad: {\n                selectRegion: false,\n            },\n        },\n        region: {\n            mouseover: {\n                showTooltip: false,\n            },\n            click: {\n                addIdToUrl: false,\n                showDetails: true,\n                showDetailsFor: \"region\",\n                filterDirectory: false,\n                loadObjects: false,\n                showPopover: false,\n                showPopoverFor: \"region\",\n                goToLink: false,\n                linkField: \"Region.link\",\n            },\n            touch: {\n                showPopover: false,\n            },\n        },\n        marker: {\n            mouseover: {\n                showTooltip: false,\n            },\n            click: {\n                showDetails: true,\n                showPopover: false,\n                goToLink: false,\n                linkField: \"Object.link\",\n            },\n            touch: {\n                showPopover: false,\n            },\n        },\n        directoryItem: {\n            click: {\n                showDetails: true,\n                showPopover: false,\n                goToLink: false,\n                selectRegion: true,\n                fireRegionOnClick: true,\n                linkField: \"Object.link\",\n            },\n            hover: {\n                centerOnMarker: false,\n            },\n        },\n    },\n    detailsView: {\n        location: \"map\",\n        containerId: \"\",\n        width: \"100%\",\n        mobileFullscreen: true,\n    },\n    mobileView: {\n        labelMap: \"Map\",\n        labelList: \"List\",\n        labelClose: \"Close\",\n    },\n    googleMaps: {\n        on: false,\n        apiKey: \"\",\n        loaded: false,\n        center: \"auto\", // or {lat: 12, lon: 13}\n        type: \"roadmap\",\n        minZoom: 1,\n        style: \"default\",\n        styleJSON: [],\n        language: \"en\",\n    },\n    groups: [],\n    floors: [],\n    layersControl: {\n        on: false,\n        position: \"top-left\",\n        label: \"Show on map\",\n        expanded: true,\n        maxHeight: \"100%\",\n    },\n    floorsControl: {\n        on: false,\n        position: \"top-left\",\n        label: \"Floors\",\n        expanded: false,\n        maxHeight: \"100%\",\n    },\n    containers: {\n        leftSidebar: { on: false, width: \"250px\" },\n        rightSidebar: { on: false, width: \"250px\" },\n        header: { on: true, height: \"auto\" },\n        footer: { on: false, height: \"auto\" },\n    },\n    labelsMarkers: { on: false },\n    labelsRegions: { on: false },\n    svgFileVersion: 1,\n    fitMarkers: false,\n    fitMarkersOnStart: false,\n    fitSingleMarkerZoom: 20,\n    controls: {\n        location: \"right\",\n        zoom: true,\n        zoomReset: false,\n        userLocation: false,\n        previousMap: false,\n    },\n    previousMapsIds: [],\n};\n\nexport { DefaultOptions };\n","// TinyColor v1.4.1\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\n//(function(Math) {\n\nvar trimLeft = /^\\s+/,\n    trimRight = /\\s+$/,\n    tinyCounter = 0,\n    mathRound = Math.round,\n    mathMin = Math.min,\n    mathMax = Math.max,\n    mathRandom = Math.random;\n\nfunction tinycolor(color, opts) {\n    color = color ? color : \"\";\n    opts = opts || {};\n\n    // If input is already a tinycolor, return itself\n    if (color instanceof tinycolor) {\n        return color;\n    }\n    // If we are called as a function, call using new instead\n    if (!(this instanceof tinycolor)) {\n        return new tinycolor(color, opts);\n    }\n\n    var rgb = inputToRGB(color);\n    (this._originalInput = color),\n        (this._r = rgb.r),\n        (this._g = rgb.g),\n        (this._b = rgb.b),\n        (this._a = rgb.a),\n        (this._roundA = mathRound(100 * this._a) / 100),\n        (this._format = opts.format || rgb.format);\n    this._gradientType = opts.gradientType;\n\n    // Don't let the range of [0,255] come back in [0,1].\n    // Potentially lose a little bit of precision here, but will fix issues where\n    // .5 gets interpreted as half of the total, instead of half of 1\n    // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n    if (this._r < 1) {\n        this._r = mathRound(this._r);\n    }\n    if (this._g < 1) {\n        this._g = mathRound(this._g);\n    }\n    if (this._b < 1) {\n        this._b = mathRound(this._b);\n    }\n\n    this._ok = rgb.ok;\n    this._tc_id = tinyCounter++;\n}\n\ntinycolor.prototype = {\n    isDark: function () {\n        return this.getBrightness() < 128;\n    },\n    isLight: function () {\n        return !this.isDark();\n    },\n    isValid: function () {\n        return this._ok;\n    },\n    getOriginalInput: function () {\n        return this._originalInput;\n    },\n    getFormat: function () {\n        return this._format;\n    },\n    getAlpha: function () {\n        return this._a;\n    },\n    getBrightness: function () {\n        //http://www.w3.org/TR/AERT#color-contrast\n        var rgb = this.toRgb();\n        return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n    },\n    getLuminance: function () {\n        //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n        var rgb = this.toRgb();\n        var RsRGB, GsRGB, BsRGB, R, G, B;\n        RsRGB = rgb.r / 255;\n        GsRGB = rgb.g / 255;\n        BsRGB = rgb.b / 255;\n\n        if (RsRGB <= 0.03928) {\n            R = RsRGB / 12.92;\n        } else {\n            R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n        }\n        if (GsRGB <= 0.03928) {\n            G = GsRGB / 12.92;\n        } else {\n            G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n        }\n        if (BsRGB <= 0.03928) {\n            B = BsRGB / 12.92;\n        } else {\n            B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n        }\n        return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n    },\n    setAlpha: function (value) {\n        this._a = boundAlpha(value);\n        this._roundA = mathRound(100 * this._a) / 100;\n        return this;\n    },\n    toHsv: function () {\n        var hsv = rgbToHsv(this._r, this._g, this._b);\n        return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n    },\n    toHsvString: function () {\n        var hsv = rgbToHsv(this._r, this._g, this._b);\n        var h = mathRound(hsv.h * 360),\n            s = mathRound(hsv.s * 100),\n            v = mathRound(hsv.v * 100);\n        return this._a == 1\n            ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\"\n            : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n    },\n    toHsl: function () {\n        var hsl = rgbToHsl(this._r, this._g, this._b);\n        return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n    },\n    toHslString: function () {\n        var hsl = rgbToHsl(this._r, this._g, this._b);\n        var h = mathRound(hsl.h * 360),\n            s = mathRound(hsl.s * 100),\n            l = mathRound(hsl.l * 100);\n        return this._a == 1\n            ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\"\n            : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n    },\n    toHex: function (allow3Char) {\n        return rgbToHex(this._r, this._g, this._b, allow3Char);\n    },\n    toHexString: function (allow3Char) {\n        return \"#\" + this.toHex(allow3Char);\n    },\n    toHex8: function (allow4Char) {\n        return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n    },\n    toHex8String: function (allow4Char) {\n        return \"#\" + this.toHex8(allow4Char);\n    },\n    toRgb: function () {\n        return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n    },\n    toRgbString: function () {\n        return this._a == 1\n            ? \"rgb(\" +\n                  mathRound(this._r) +\n                  \", \" +\n                  mathRound(this._g) +\n                  \", \" +\n                  mathRound(this._b) +\n                  \")\"\n            : \"rgba(\" +\n                  mathRound(this._r) +\n                  \", \" +\n                  mathRound(this._g) +\n                  \", \" +\n                  mathRound(this._b) +\n                  \", \" +\n                  this._roundA +\n                  \")\";\n    },\n    toPercentageRgb: function () {\n        return {\n            r: mathRound(bound01(this._r, 255) * 100) + \"%\",\n            g: mathRound(bound01(this._g, 255) * 100) + \"%\",\n            b: mathRound(bound01(this._b, 255) * 100) + \"%\",\n            a: this._a,\n        };\n    },\n    toPercentageRgbString: function () {\n        return this._a == 1\n            ? \"rgb(\" +\n                  mathRound(bound01(this._r, 255) * 100) +\n                  \"%, \" +\n                  mathRound(bound01(this._g, 255) * 100) +\n                  \"%, \" +\n                  mathRound(bound01(this._b, 255) * 100) +\n                  \"%)\"\n            : \"rgba(\" +\n                  mathRound(bound01(this._r, 255) * 100) +\n                  \"%, \" +\n                  mathRound(bound01(this._g, 255) * 100) +\n                  \"%, \" +\n                  mathRound(bound01(this._b, 255) * 100) +\n                  \"%, \" +\n                  this._roundA +\n                  \")\";\n    },\n    toName: function () {\n        if (this._a === 0) {\n            return \"transparent\";\n        }\n\n        if (this._a < 1) {\n            return false;\n        }\n\n        return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n    },\n    toFilter: function (secondColor) {\n        var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n        var secondHex8String = hex8String;\n        var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n        if (secondColor) {\n            var s = tinycolor(secondColor);\n            secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n        }\n\n        return (\n            \"progid:DXImageTransform.Microsoft.gradient(\" +\n            gradientType +\n            \"startColorstr=\" +\n            hex8String +\n            \",endColorstr=\" +\n            secondHex8String +\n            \")\"\n        );\n    },\n    toString: function (format) {\n        var formatSet = !!format;\n        format = format || this._format;\n\n        var formattedString = false;\n        var hasAlpha = this._a < 1 && this._a >= 0;\n        var needsAlphaFormat =\n            !formatSet &&\n            hasAlpha &&\n            (format === \"hex\" ||\n                format === \"hex6\" ||\n                format === \"hex3\" ||\n                format === \"hex4\" ||\n                format === \"hex8\" ||\n                format === \"name\");\n\n        if (needsAlphaFormat) {\n            // Special case for \"transparent\", all other non-alpha formats\n            // will return rgba when there is transparency.\n            if (format === \"name\" && this._a === 0) {\n                return this.toName();\n            }\n            return this.toRgbString();\n        }\n        if (format === \"rgb\") {\n            formattedString = this.toRgbString();\n        }\n        if (format === \"prgb\") {\n            formattedString = this.toPercentageRgbString();\n        }\n        if (format === \"hex\" || format === \"hex6\") {\n            formattedString = this.toHexString();\n        }\n        if (format === \"hex3\") {\n            formattedString = this.toHexString(true);\n        }\n        if (format === \"hex4\") {\n            formattedString = this.toHex8String(true);\n        }\n        if (format === \"hex8\") {\n            formattedString = this.toHex8String();\n        }\n        if (format === \"name\") {\n            formattedString = this.toName();\n        }\n        if (format === \"hsl\") {\n            formattedString = this.toHslString();\n        }\n        if (format === \"hsv\") {\n            formattedString = this.toHsvString();\n        }\n\n        return formattedString || this.toHexString();\n    },\n    clone: function () {\n        return tinycolor(this.toString());\n    },\n\n    _applyModification: function (fn, args) {\n        var color = fn.apply(null, [this].concat([].slice.call(args)));\n        this._r = color._r;\n        this._g = color._g;\n        this._b = color._b;\n        this.setAlpha(color._a);\n        return this;\n    },\n    lighten: function () {\n        return this._applyModification(lighten, arguments);\n    },\n    brighten: function () {\n        return this._applyModification(brighten, arguments);\n    },\n    darken: function () {\n        return this._applyModification(darken, arguments);\n    },\n    desaturate: function () {\n        return this._applyModification(desaturate, arguments);\n    },\n    saturate: function () {\n        return this._applyModification(saturate, arguments);\n    },\n    greyscale: function () {\n        return this._applyModification(greyscale, arguments);\n    },\n    spin: function () {\n        return this._applyModification(spin, arguments);\n    },\n\n    _applyCombination: function (fn, args) {\n        return fn.apply(null, [this].concat([].slice.call(args)));\n    },\n    analogous: function () {\n        return this._applyCombination(analogous, arguments);\n    },\n    complement: function () {\n        return this._applyCombination(complement, arguments);\n    },\n    monochromatic: function () {\n        return this._applyCombination(monochromatic, arguments);\n    },\n    splitcomplement: function () {\n        return this._applyCombination(splitcomplement, arguments);\n    },\n    triad: function () {\n        return this._applyCombination(triad, arguments);\n    },\n    tetrad: function () {\n        return this._applyCombination(tetrad, arguments);\n    },\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n    if (typeof color == \"object\") {\n        var newColor = {};\n        for (var i in color) {\n            if (color.hasOwnProperty(i)) {\n                if (i === \"a\") {\n                    newColor[i] = color[i];\n                } else {\n                    newColor[i] = convertToPercentage(color[i]);\n                }\n            }\n        }\n        color = newColor;\n    }\n\n    return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n//     \"red\"\n//     \"#f00\" or \"f00\"\n//     \"#ff0000\" or \"ff0000\"\n//     \"#ff000000\" or \"ff000000\"\n//     \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n//     \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n//     \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n//     \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n//     \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n//     \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n//     \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n    var rgb = { r: 0, g: 0, b: 0 };\n    var a = 1;\n    var s = null;\n    var v = null;\n    var l = null;\n    var ok = false;\n    var format = false;\n\n    if (typeof color == \"string\") {\n        color = stringInputToObject(color);\n    }\n\n    if (typeof color == \"object\") {\n        if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n            rgb = rgbToRgb(color.r, color.g, color.b);\n            ok = true;\n            format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n        } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n            s = convertToPercentage(color.s);\n            v = convertToPercentage(color.v);\n            rgb = hsvToRgb(color.h, s, v);\n            ok = true;\n            format = \"hsv\";\n        } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n            s = convertToPercentage(color.s);\n            l = convertToPercentage(color.l);\n            rgb = hslToRgb(color.h, s, l);\n            ok = true;\n            format = \"hsl\";\n        }\n\n        if (color.hasOwnProperty(\"a\")) {\n            a = color.a;\n        }\n    }\n\n    a = boundAlpha(a);\n\n    return {\n        ok: ok,\n        format: color.format || format,\n        r: mathMin(255, mathMax(rgb.r, 0)),\n        g: mathMin(255, mathMax(rgb.g, 0)),\n        b: mathMin(255, mathMax(rgb.b, 0)),\n        a: a,\n    };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n    return {\n        r: bound01(r, 255) * 255,\n        g: bound01(g, 255) * 255,\n        b: bound01(b, 255) * 255,\n    };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n    r = bound01(r, 255);\n    g = bound01(g, 255);\n    b = bound01(b, 255);\n\n    var max = mathMax(r, g, b),\n        min = mathMin(r, g, b);\n    var h,\n        s,\n        l = (max + min) / 2;\n\n    if (max == min) {\n        h = s = 0; // achromatic\n    } else {\n        var d = max - min;\n        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n        switch (max) {\n            case r:\n                h = (g - b) / d + (g < b ? 6 : 0);\n                break;\n            case g:\n                h = (b - r) / d + 2;\n                break;\n            case b:\n                h = (r - g) / d + 4;\n                break;\n        }\n\n        h /= 6;\n    }\n\n    return { h: h, s: s, l: l };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n    var r, g, b;\n\n    h = bound01(h, 360);\n    s = bound01(s, 100);\n    l = bound01(l, 100);\n\n    function hue2rgb(p, q, t) {\n        if (t < 0) t += 1;\n        if (t > 1) t -= 1;\n        if (t < 1 / 6) return p + (q - p) * 6 * t;\n        if (t < 1 / 2) return q;\n        if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n        return p;\n    }\n\n    if (s === 0) {\n        r = g = b = l; // achromatic\n    } else {\n        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n        var p = 2 * l - q;\n        r = hue2rgb(p, q, h + 1 / 3);\n        g = hue2rgb(p, q, h);\n        b = hue2rgb(p, q, h - 1 / 3);\n    }\n\n    return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n    r = bound01(r, 255);\n    g = bound01(g, 255);\n    b = bound01(b, 255);\n\n    var max = mathMax(r, g, b),\n        min = mathMin(r, g, b);\n    var h,\n        s,\n        v = max;\n\n    var d = max - min;\n    s = max === 0 ? 0 : d / max;\n\n    if (max == min) {\n        h = 0; // achromatic\n    } else {\n        switch (max) {\n            case r:\n                h = (g - b) / d + (g < b ? 6 : 0);\n                break;\n            case g:\n                h = (b - r) / d + 2;\n                break;\n            case b:\n                h = (r - g) / d + 4;\n                break;\n        }\n        h /= 6;\n    }\n    return { h: h, s: s, v: v };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n    h = bound01(h, 360) * 6;\n    s = bound01(s, 100);\n    v = bound01(v, 100);\n\n    var i = Math.floor(h),\n        f = h - i,\n        p = v * (1 - s),\n        q = v * (1 - f * s),\n        t = v * (1 - (1 - f) * s),\n        mod = i % 6,\n        r = [v, q, p, p, t, v][mod],\n        g = [t, v, v, q, p, p][mod],\n        b = [p, p, t, v, v, q][mod];\n\n    return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n    var hex = [\n        pad2(mathRound(r).toString(16)),\n        pad2(mathRound(g).toString(16)),\n        pad2(mathRound(b).toString(16)),\n    ];\n\n    // Return a 3 character hex if possible\n    if (\n        allow3Char &&\n        hex[0].charAt(0) == hex[0].charAt(1) &&\n        hex[1].charAt(0) == hex[1].charAt(1) &&\n        hex[2].charAt(0) == hex[2].charAt(1)\n    ) {\n        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n    }\n\n    return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n    var hex = [\n        pad2(mathRound(r).toString(16)),\n        pad2(mathRound(g).toString(16)),\n        pad2(mathRound(b).toString(16)),\n        pad2(convertDecimalToHex(a)),\n    ];\n\n    // Return a 4 character hex if possible\n    if (\n        allow4Char &&\n        hex[0].charAt(0) == hex[0].charAt(1) &&\n        hex[1].charAt(0) == hex[1].charAt(1) &&\n        hex[2].charAt(0) == hex[2].charAt(1) &&\n        hex[3].charAt(0) == hex[3].charAt(1)\n    ) {\n        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n    }\n\n    return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n    var hex = [\n        pad2(convertDecimalToHex(a)),\n        pad2(mathRound(r).toString(16)),\n        pad2(mathRound(g).toString(16)),\n        pad2(mathRound(b).toString(16)),\n    ];\n\n    return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n    if (!color1 || !color2) {\n        return false;\n    }\n    return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\n\ntinycolor.random = function () {\n    return tinycolor.fromRatio({\n        r: mathRandom(),\n        g: mathRandom(),\n        b: mathRandom(),\n    });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction desaturate(color, amount) {\n    amount = amount === 0 ? 0 : amount || 10;\n    var hsl = tinycolor(color).toHsl();\n    hsl.s -= amount / 100;\n    hsl.s = clamp01(hsl.s);\n    return tinycolor(hsl);\n}\n\nfunction saturate(color, amount) {\n    amount = amount === 0 ? 0 : amount || 10;\n    var hsl = tinycolor(color).toHsl();\n    hsl.s += amount / 100;\n    hsl.s = clamp01(hsl.s);\n    return tinycolor(hsl);\n}\n\nfunction greyscale(color) {\n    return tinycolor(color).desaturate(100);\n}\n\nfunction lighten(color, amount) {\n    amount = amount === 0 ? 0 : amount || 10;\n    var hsl = tinycolor(color).toHsl();\n    hsl.l += amount / 100;\n    hsl.l = clamp01(hsl.l);\n    return tinycolor(hsl);\n}\n\nfunction brighten(color, amount) {\n    amount = amount === 0 ? 0 : amount || 10;\n    var rgb = tinycolor(color).toRgb();\n    rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));\n    rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));\n    rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));\n    return tinycolor(rgb);\n}\n\nfunction darken(color, amount) {\n    amount = amount === 0 ? 0 : amount || 10;\n    var hsl = tinycolor(color).toHsl();\n    hsl.l -= amount / 100;\n    hsl.l = clamp01(hsl.l);\n    return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction spin(color, amount) {\n    var hsl = tinycolor(color).toHsl();\n    var hue = (hsl.h + amount) % 360;\n    hsl.h = hue < 0 ? 360 + hue : hue;\n    return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction complement(color) {\n    var hsl = tinycolor(color).toHsl();\n    hsl.h = (hsl.h + 180) % 360;\n    return tinycolor(hsl);\n}\n\nfunction triad(color) {\n    var hsl = tinycolor(color).toHsl();\n    var h = hsl.h;\n    return [\n        tinycolor(color),\n        tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),\n        tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }),\n    ];\n}\n\nfunction tetrad(color) {\n    var hsl = tinycolor(color).toHsl();\n    var h = hsl.h;\n    return [\n        tinycolor(color),\n        tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),\n        tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),\n        tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }),\n    ];\n}\n\nfunction splitcomplement(color) {\n    var hsl = tinycolor(color).toHsl();\n    var h = hsl.h;\n    return [\n        tinycolor(color),\n        tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),\n        tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }),\n    ];\n}\n\nfunction analogous(color, results, slices) {\n    results = results || 6;\n    slices = slices || 30;\n\n    var hsl = tinycolor(color).toHsl();\n    var part = 360 / slices;\n    var ret = [tinycolor(color)];\n\n    for (hsl.h = (hsl.h - ((part * results) >> 1) + 720) % 360; --results; ) {\n        hsl.h = (hsl.h + part) % 360;\n        ret.push(tinycolor(hsl));\n    }\n    return ret;\n}\n\nfunction monochromatic(color, results) {\n    results = results || 6;\n    var hsv = tinycolor(color).toHsv();\n    var h = hsv.h,\n        s = hsv.s,\n        v = hsv.v;\n    var ret = [];\n    var modification = 1 / results;\n\n    while (results--) {\n        ret.push(tinycolor({ h: h, s: s, v: v }));\n        v = (v + modification) % 1;\n    }\n\n    return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n    amount = amount === 0 ? 0 : amount || 50;\n\n    var rgb1 = tinycolor(color1).toRgb();\n    var rgb2 = tinycolor(color2).toRgb();\n\n    var p = amount / 100;\n\n    var rgba = {\n        r: (rgb2.r - rgb1.r) * p + rgb1.r,\n        g: (rgb2.g - rgb1.g) * p + rgb1.g,\n        b: (rgb2.b - rgb1.b) * p + rgb1.b,\n        a: (rgb2.a - rgb1.a) * p + rgb1.a,\n    };\n\n    return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n    var c1 = tinycolor(color1);\n    var c2 = tinycolor(color2);\n    return (\n        (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) /\n        (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05)\n    );\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n//      the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n//      the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n//    tinycolor.isReadable(\"#000\", \"#111\") => false\n//    tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n    var readability = tinycolor.readability(color1, color2);\n    var wcag2Parms, out;\n\n    out = false;\n\n    wcag2Parms = validateWCAG2Parms(wcag2);\n    switch (wcag2Parms.level + wcag2Parms.size) {\n        case \"AAsmall\":\n        case \"AAAlarge\":\n            out = readability >= 4.5;\n            break;\n        case \"AAlarge\":\n            out = readability >= 3;\n            break;\n        case \"AAAsmall\":\n            out = readability >= 7;\n            break;\n    }\n    return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n//    tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n//    tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString();  // \"#ffffff\"\n//    tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n//    tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n    var bestColor = null;\n    var bestScore = 0;\n    var readability;\n    var includeFallbackColors, level, size;\n    args = args || {};\n    includeFallbackColors = args.includeFallbackColors;\n    level = args.level;\n    size = args.size;\n\n    for (var i = 0; i < colorList.length; i++) {\n        readability = tinycolor.readability(baseColor, colorList[i]);\n        if (readability > bestScore) {\n            bestScore = readability;\n            bestColor = tinycolor(colorList[i]);\n        }\n    }\n\n    if (\n        tinycolor.isReadable(baseColor, bestColor, { level: level, size: size }) ||\n        !includeFallbackColors\n    ) {\n        return bestColor;\n    } else {\n        args.includeFallbackColors = false;\n        return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n    }\n};\n\n// Big List of Colors\n// ------------------\n// <http://www.w3.org/TR/css3-color/#svg-color>\nvar names = (tinycolor.names = {\n    aliceblue: \"f0f8ff\",\n    antiquewhite: \"faebd7\",\n    aqua: \"0ff\",\n    aquamarine: \"7fffd4\",\n    azure: \"f0ffff\",\n    beige: \"f5f5dc\",\n    bisque: \"ffe4c4\",\n    black: \"000\",\n    blanchedalmond: \"ffebcd\",\n    blue: \"00f\",\n    blueviolet: \"8a2be2\",\n    brown: \"a52a2a\",\n    burlywood: \"deb887\",\n    burntsienna: \"ea7e5d\",\n    cadetblue: \"5f9ea0\",\n    chartreuse: \"7fff00\",\n    chocolate: \"d2691e\",\n    coral: \"ff7f50\",\n    cornflowerblue: \"6495ed\",\n    cornsilk: \"fff8dc\",\n    crimson: \"dc143c\",\n    cyan: \"0ff\",\n    darkblue: \"00008b\",\n    darkcyan: \"008b8b\",\n    darkgoldenrod: \"b8860b\",\n    darkgray: \"a9a9a9\",\n    darkgreen: \"006400\",\n    darkgrey: \"a9a9a9\",\n    darkkhaki: \"bdb76b\",\n    darkmagenta: \"8b008b\",\n    darkolivegreen: \"556b2f\",\n    darkorange: \"ff8c00\",\n    darkorchid: \"9932cc\",\n    darkred: \"8b0000\",\n    darksalmon: \"e9967a\",\n    darkseagreen: \"8fbc8f\",\n    darkslateblue: \"483d8b\",\n    darkslategray: \"2f4f4f\",\n    darkslategrey: \"2f4f4f\",\n    darkturquoise: \"00ced1\",\n    darkviolet: \"9400d3\",\n    deeppink: \"ff1493\",\n    deepskyblue: \"00bfff\",\n    dimgray: \"696969\",\n    dimgrey: \"696969\",\n    dodgerblue: \"1e90ff\",\n    firebrick: \"b22222\",\n    floralwhite: \"fffaf0\",\n    forestgreen: \"228b22\",\n    fuchsia: \"f0f\",\n    gainsboro: \"dcdcdc\",\n    ghostwhite: \"f8f8ff\",\n    gold: \"ffd700\",\n    goldenrod: \"daa520\",\n    gray: \"808080\",\n    green: \"008000\",\n    greenyellow: \"adff2f\",\n    grey: \"808080\",\n    honeydew: \"f0fff0\",\n    hotpink: \"ff69b4\",\n    indianred: \"cd5c5c\",\n    indigo: \"4b0082\",\n    ivory: \"fffff0\",\n    khaki: \"f0e68c\",\n    lavender: \"e6e6fa\",\n    lavenderblush: \"fff0f5\",\n    lawngreen: \"7cfc00\",\n    lemonchiffon: \"fffacd\",\n    lightblue: \"add8e6\",\n    lightcoral: \"f08080\",\n    lightcyan: \"e0ffff\",\n    lightgoldenrodyellow: \"fafad2\",\n    lightgray: \"d3d3d3\",\n    lightgreen: \"90ee90\",\n    lightgrey: \"d3d3d3\",\n    lightpink: \"ffb6c1\",\n    lightsalmon: \"ffa07a\",\n    lightseagreen: \"20b2aa\",\n    lightskyblue: \"87cefa\",\n    lightslategray: \"789\",\n    lightslategrey: \"789\",\n    lightsteelblue: \"b0c4de\",\n    lightyellow: \"ffffe0\",\n    lime: \"0f0\",\n    limegreen: \"32cd32\",\n    linen: \"faf0e6\",\n    magenta: \"f0f\",\n    maroon: \"800000\",\n    mediumaquamarine: \"66cdaa\",\n    mediumblue: \"0000cd\",\n    mediumorchid: \"ba55d3\",\n    mediumpurple: \"9370db\",\n    mediumseagreen: \"3cb371\",\n    mediumslateblue: \"7b68ee\",\n    mediumspringgreen: \"00fa9a\",\n    mediumturquoise: \"48d1cc\",\n    mediumvioletred: \"c71585\",\n    midnightblue: \"191970\",\n    mintcream: \"f5fffa\",\n    mistyrose: \"ffe4e1\",\n    moccasin: \"ffe4b5\",\n    navajowhite: \"ffdead\",\n    navy: \"000080\",\n    oldlace: \"fdf5e6\",\n    olive: \"808000\",\n    olivedrab: \"6b8e23\",\n    orange: \"ffa500\",\n    orangered: \"ff4500\",\n    orchid: \"da70d6\",\n    palegoldenrod: \"eee8aa\",\n    palegreen: \"98fb98\",\n    paleturquoise: \"afeeee\",\n    palevioletred: \"db7093\",\n    papayawhip: \"ffefd5\",\n    peachpuff: \"ffdab9\",\n    peru: \"cd853f\",\n    pink: \"ffc0cb\",\n    plum: \"dda0dd\",\n    powderblue: \"b0e0e6\",\n    purple: \"800080\",\n    rebeccapurple: \"663399\",\n    red: \"f00\",\n    rosybrown: \"bc8f8f\",\n    royalblue: \"4169e1\",\n    saddlebrown: \"8b4513\",\n    salmon: \"fa8072\",\n    sandybrown: \"f4a460\",\n    seagreen: \"2e8b57\",\n    seashell: \"fff5ee\",\n    sienna: \"a0522d\",\n    silver: \"c0c0c0\",\n    skyblue: \"87ceeb\",\n    slateblue: \"6a5acd\",\n    slategray: \"708090\",\n    slategrey: \"708090\",\n    snow: \"fffafa\",\n    springgreen: \"00ff7f\",\n    steelblue: \"4682b4\",\n    tan: \"d2b48c\",\n    teal: \"008080\",\n    thistle: \"d8bfd8\",\n    tomato: \"ff6347\",\n    turquoise: \"40e0d0\",\n    violet: \"ee82ee\",\n    wheat: \"f5deb3\",\n    white: \"fff\",\n    whitesmoke: \"f5f5f5\",\n    yellow: \"ff0\",\n    yellowgreen: \"9acd32\",\n});\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = (tinycolor.hexNames = flip(names));\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n    var flipped = {};\n    for (var i in o) {\n        if (o.hasOwnProperty(i)) {\n            flipped[o[i]] = i;\n        }\n    }\n    return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n    a = parseFloat(a);\n\n    if (isNaN(a) || a < 0 || a > 1) {\n        a = 1;\n    }\n\n    return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n    if (isOnePointZero(n)) {\n        n = \"100%\";\n    }\n\n    var processPercent = isPercentage(n);\n    n = mathMin(max, mathMax(0, parseFloat(n)));\n\n    // Automatically convert percentage into number\n    if (processPercent) {\n        n = parseInt(n * max, 10) / 100;\n    }\n\n    // Handle floating point rounding errors\n    if (Math.abs(n - max) < 0.000001) {\n        return 1;\n    }\n\n    // Convert into [0, 1] range if it isn't already\n    return (n % max) / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n    return mathMin(1, mathMax(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n    return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n    return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n    return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n    return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n    if (n <= 1) {\n        n = n * 100 + \"%\";\n    }\n\n    return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n    return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n    return parseIntFromHex(h) / 255;\n}\n\nvar matchers = (function () {\n    // <http://www.w3.org/TR/css3-values/#integers>\n    var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n    // <http://www.w3.org/TR/css3-values/#number-value>\n    var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n    // Allow positive/negative integer/number.  Don't capture the either/or, just the entire outcome.\n    var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n    // Actual matching.\n    // Parentheses and commas are optional, but not required.\n    // Whitespace can take the place of commas or opening paren\n    var PERMISSIVE_MATCH3 =\n        \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n    var PERMISSIVE_MATCH4 =\n        \"[\\\\s|\\\\(]+(\" +\n        CSS_UNIT +\n        \")[,|\\\\s]+(\" +\n        CSS_UNIT +\n        \")[,|\\\\s]+(\" +\n        CSS_UNIT +\n        \")[,|\\\\s]+(\" +\n        CSS_UNIT +\n        \")\\\\s*\\\\)?\";\n\n    return {\n        CSS_UNIT: new RegExp(CSS_UNIT),\n        rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n        rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n        hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n        hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n        hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n        hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n        hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n        hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n        hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n        hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n    };\n})();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n    return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing.  Take in a number of formats, and output an object\n// based on detected format.  Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n    color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n    var named = false;\n    if (names[color]) {\n        color = names[color];\n        named = true;\n    } else if (color == \"transparent\") {\n        return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n    }\n\n    // Try to match string input using regular expressions.\n    // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n    // Just return an object and let the conversion functions handle that.\n    // This way the result will be the same whether the tinycolor is initialized with string or object.\n    var match;\n    if ((match = matchers.rgb.exec(color))) {\n        return { r: match[1], g: match[2], b: match[3] };\n    }\n    if ((match = matchers.rgba.exec(color))) {\n        return { r: match[1], g: match[2], b: match[3], a: match[4] };\n    }\n    if ((match = matchers.hsl.exec(color))) {\n        return { h: match[1], s: match[2], l: match[3] };\n    }\n    if ((match = matchers.hsla.exec(color))) {\n        return { h: match[1], s: match[2], l: match[3], a: match[4] };\n    }\n    if ((match = matchers.hsv.exec(color))) {\n        return { h: match[1], s: match[2], v: match[3] };\n    }\n    if ((match = matchers.hsva.exec(color))) {\n        return { h: match[1], s: match[2], v: match[3], a: match[4] };\n    }\n    if ((match = matchers.hex8.exec(color))) {\n        return {\n            r: parseIntFromHex(match[1]),\n            g: parseIntFromHex(match[2]),\n            b: parseIntFromHex(match[3]),\n            a: convertHexToDecimal(match[4]),\n            format: named ? \"name\" : \"hex8\",\n        };\n    }\n    if ((match = matchers.hex6.exec(color))) {\n        return {\n            r: parseIntFromHex(match[1]),\n            g: parseIntFromHex(match[2]),\n            b: parseIntFromHex(match[3]),\n            format: named ? \"name\" : \"hex\",\n        };\n    }\n    if ((match = matchers.hex4.exec(color))) {\n        return {\n            r: parseIntFromHex(match[1] + \"\" + match[1]),\n            g: parseIntFromHex(match[2] + \"\" + match[2]),\n            b: parseIntFromHex(match[3] + \"\" + match[3]),\n            a: convertHexToDecimal(match[4] + \"\" + match[4]),\n            format: named ? \"name\" : \"hex8\",\n        };\n    }\n    if ((match = matchers.hex3.exec(color))) {\n        return {\n            r: parseIntFromHex(match[1] + \"\" + match[1]),\n            g: parseIntFromHex(match[2] + \"\" + match[2]),\n            b: parseIntFromHex(match[3] + \"\" + match[3]),\n            format: named ? \"name\" : \"hex\",\n        };\n    }\n\n    return false;\n}\n\nfunction validateWCAG2Parms(parms) {\n    // return valid WCAG2 parms for isReadable.\n    // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n    var level, size;\n    parms = parms || { level: \"AA\", size: \"small\" };\n    level = (parms.level || \"AA\").toUpperCase();\n    size = (parms.size || \"small\").toLowerCase();\n    if (level !== \"AA\" && level !== \"AAA\") {\n        level = \"AA\";\n    }\n    if (size !== \"small\" && size !== \"large\") {\n        size = \"small\";\n    }\n    return { level: level, size: size };\n}\n/*\n// Node: Export function\n    if (typeof module !== \"undefined\" && module.exports) {\n        module.exports = tinycolor;\n    }\n// AMD/requirejs: Define the module\n    else if (typeof define === 'function' && define.amd) {\n        define(function () {return tinycolor;});\n    }\n// Browser: Expose to window\n    else {\n        window.tinycolor = tinycolor;\n    }\n\n */\n\n//})(Math);\n\nexport { tinycolor };\n","const $ = jQuery;\nimport { MapSVG } from \"../../Core/globals.js\";\n\nexport class Server {\n    apiUrl: string;\n    completeChunks: number;\n\n    constructor() {\n        this.apiUrl = MapSVG.urls.api;\n    }\n    getUrl(path) {\n        return this.apiUrl + path;\n    }\n    get(path: string, data?: any): JQueryPromise<any> {\n        return $.ajax({\n            url: this.apiUrl + path,\n            type: \"GET\",\n            data: data,\n            beforeSend: function (xhr) {\n                if (MapSVG.nonce()) {\n                    xhr.setRequestHeader(\"X-WP-Nonce\", MapSVG.nonce());\n                }\n            },\n        });\n    }\n    post(path: string, data?: any): JQueryPromise<any> {\n        const ajaxParams = {\n            url: this.apiUrl + path,\n            type: \"POST\",\n            data: data,\n            beforeSend: function (xhr) {\n                if (MapSVG.nonce()) {\n                    xhr.setRequestHeader(\"X-WP-Nonce\", MapSVG.nonce());\n                }\n            },\n        };\n\n        if (data instanceof FormData) {\n            ajaxParams[\"processData\"] = false;\n            ajaxParams[\"contentType\"] = false;\n        }\n\n        return $.ajax(ajaxParams);\n    }\n    put(path: string, data?: any): JQueryPromise<any> {\n        const ajaxParams = {\n            url: this.apiUrl + path,\n            type: \"POST\",\n            data: data,\n            beforeSend: function (xhr) {\n                if (MapSVG.nonce()) {\n                    xhr.setRequestHeader(\"X-WP-Nonce\", MapSVG.nonce());\n                }\n                xhr.setRequestHeader(\"X-HTTP-Method-Override\", \"PUT\");\n            },\n        };\n\n        if (data instanceof FormData) {\n            ajaxParams[\"processData\"] = false;\n            ajaxParams[\"contentType\"] = false;\n        }\n\n        return $.ajax(ajaxParams);\n    }\n    delete(path: string, data?: any): JQueryPromise<any> {\n        return $.ajax({\n            url: this.apiUrl + path,\n            type: \"POST\",\n            data: data,\n            beforeSend: function (xhr) {\n                if (MapSVG.nonce()) {\n                    xhr.setRequestHeader(\"X-WP-Nonce\", MapSVG.nonce());\n                }\n                xhr.setRequestHeader(\"X-HTTP-Method-Override\", \"DELETE\");\n            },\n        });\n    }\n    ajax(\n        path: string,\n        data: { type: string; data: any; processData?: boolean; contentType?: boolean }\n    ): JQueryPromise<any> {\n        // @ts-ignore\n        data.url = this.getUrl(path);\n        // @ts-ignore\n        data.beforeSend = function (xhr) {\n            if (MapSVG.nonce()) {\n                xhr.setRequestHeader(\"X-WP-Nonce\", MapSVG.nonce());\n            }\n        };\n        // @ts-ignore\n        return $.ajax(data);\n    }\n}\n","export class Events {\n    context: any;\n    events: { [key: string]: Function[] };\n\n    constructor(context?: any) {\n        this.events = {};\n        this.context = context;\n    }\n\n    on(event: string, callbackOrObjectType: Function | string, callback?: Function) {\n        if (!this.events[event]) this.events[event] = [];\n\n        let objectType, callbackFunction;\n\n        if (typeof callbackOrObjectType === \"string\") {\n            objectType = callbackOrObjectType;\n            callbackFunction = callback;\n        } else {\n            objectType = \"\";\n            callbackFunction = callbackOrObjectType;\n        }\n\n        // let duplicatedEvent = false;\n        // this.events[event].forEach(function (existingCallback) {\n        //     if (existingCallback.toString() === callbackFunction.toString()) {\n        //         duplicatedEvent = true;\n        //     }\n        // });\n        //\n        // if (duplicatedEvent === false) {\n        this.events[event].push(callbackFunction);\n        // }\n\n        return this;\n    }\n\n    off(event: string, callback?: Function) {\n        const _this = this;\n        if (this.events[event] && this.events[event].length) {\n            this.events[event].forEach(function (_callback, index) {\n                if (typeof callback === \"undefined\") {\n                    _this.events[event].splice(index, 1);\n                } else if (_callback === callback) {\n                    _this.events[event].splice(index, 1);\n                }\n            });\n        }\n        return this;\n    }\n\n    trigger(event: string, thisArg?: any, args?: Array<any>) {\n        if (this.events[event] && this.events[event].length)\n            this.events[event].forEach((callback) => {\n                try {\n                    callback && callback.apply(thisArg || this.context, args || [this.context]);\n                } catch (err) {\n                    console.error(err);\n                }\n            });\n        return this;\n    }\n}\n","class ArrayIndexed<T> extends Array {\n    dict: { [key: string]: any };\n    key: string;\n    options: { autoId: boolean; unique: boolean };\n    nextId: number;\n\n    constructor(indexKey: string, items?: any[], options?: { autoId: boolean; unique: boolean }) {\n        if (items) {\n            super(...items);\n        } else {\n            super();\n        }\n        this.key = indexKey;\n        this.dict = {};\n        this.nextId = 1;\n        if (options) {\n            this.options = options;\n        } else {\n            this.options = { autoId: false, unique: false };\n        }\n        if (this.length > 0) {\n            let i = 0;\n            const _this = this;\n\n            if (this.options.autoId) {\n                let maxId = 0;\n                let missingIds = false;\n                this.forEach(function (item) {\n                    if (item[_this.key] != null) {\n                        if (item[_this.key] > maxId) {\n                            maxId = item[_this.key];\n                        }\n                    } else {\n                        missingIds = true;\n                    }\n                });\n                this.nextId = ++maxId;\n                if (missingIds) {\n                    this.forEach(function (item) {\n                        if (item[_this.key] == null) {\n                            item[_this.key] = _this.nextId;\n                            _this.nextId++;\n                        }\n                    });\n                }\n            }\n\n            this.forEach(function (item) {\n                _this.dict[item[_this.key]] = i;\n                i++;\n            });\n        }\n    }\n\n    push(item: any): number {\n        const length = super.push(item);\n        if (this.options.autoId === true) {\n            item[this.key] = this.nextId;\n            this.nextId++;\n        }\n        this.dict[item[this.key]] = length - 1;\n        return length;\n    }\n\n    pop(): T | undefined {\n        const item = this[this.length - 1];\n        const id = item[this.key];\n        const length = super.pop();\n        delete this.dict[id];\n        this.reindex();\n        return super.pop();\n    }\n\n    update(data: { [key: string]: any }): T | boolean {\n        if (data[this.key] != null) {\n            const obj = this.get(data[this.key]);\n            for (const i in data) {\n                obj[i] = data[i];\n            }\n            return obj;\n        }\n        return false;\n    }\n\n    get(id: number | string): any {\n        return this.findById(id);\n    }\n    findById(id: number | string): any {\n        return this[this.dict[id]];\n    }\n\n    deleteById(id: number | string): void {\n        const index = this.dict[id];\n        if (typeof index !== \"undefined\") {\n            delete this.dict[id];\n            this.splice(index, 1);\n        }\n    }\n\n    delete(id: number | string): void {\n        this.deleteById(id);\n    }\n\n    clear(): void {\n        this.length = 0;\n        this.reindex();\n    }\n\n    reindex(): void {\n        const _this = this;\n        this.dict = {};\n        this.forEach(function (item, index) {\n            _this.dict[item[_this.key]] = index;\n        });\n    }\n\n    sort(compareFn?: (a: T, b: T) => number): this {\n        super.sort(compareFn);\n        this.reindex();\n        return this;\n    }\n\n    splice(start: number, deleteCount?: number): T[] {\n        const res = super.splice(start, deleteCount);\n        this.reindex();\n        return res;\n    }\n}\n\nexport { ArrayIndexed };\n","import { MapSVG } from \"../../Core/globals.js\";\nimport { ArrayIndexed } from \"../../Core/ArrayIndexed\";\n\nexport class SchemaField {\n    type: string;\n    label?: string;\n    name?: string;\n    help?: string;\n    options?: ArrayIndexed<{ [key: string]: any }>;\n    visible?: boolean;\n    readonly?: boolean;\n    protected?: boolean;\n    searchable?: boolean;\n    value?: any;\n    placeholder?: string;\n    parameterName?: string;\n    parameterNameShort?: string;\n    db_type?: string;\n    db_default?: number | boolean | string;\n    [key: string]: any;\n\n    constructor(field: { [key: string]: any }) {\n        const booleans = [\"visible\", \"searchable\", \"readonly\", \"protected\"];\n\n        for (const key in field) {\n            this[key] = field[key];\n        }\n\n        booleans.forEach((paramName) => {\n            if (typeof this[paramName] !== \"undefined\") {\n                this[paramName] = MapSVG.parseBoolean(this[paramName]);\n            } else {\n                this[paramName] = false;\n            }\n        });\n\n        if (typeof this.options !== \"undefined\") {\n            if (!(this.options instanceof ArrayIndexed)) {\n                this.options = new ArrayIndexed(\"value\", this.options);\n            }\n        }\n\n        // TODO move this outside of the Schema class:\n        // if(field.type == 'region'){\n        //     field.options = new Map();\n        //     _this.mapsvg.regions.forEach(function(region){\n        //         field.options.set(region.id, {id: region.id, title: region.title});\n        //     });\n        // }\n    }\n}\n","import { MapSVG } from \"../../Core/globals.js\";\nimport { Events } from \"../../Core/Events\";\nimport { SchemaField } from \"./SchemaField\";\nimport { ArrayIndexed } from \"../../Core/ArrayIndexed\";\n\nexport class Schema {\n    id: number;\n    type: string;\n    name: string;\n    title?: string;\n    fields?: ArrayIndexed<SchemaField>;\n    lastChangeTime: number;\n    events: Events;\n\n    constructor(options: {\n        id?: number;\n        type?: string;\n        name?: string;\n        title?: string;\n        fields?: Array<{ [key: string]: any }>;\n    }) {\n        this.fields = new ArrayIndexed(\"name\");\n\n        this.build(options);\n\n        this.lastChangeTime = Date.now();\n        this.events = new Events(this);\n    }\n\n    build(options) {\n        const allowedParams = [\"id\", \"title\", \"type\", \"name\", \"fields\"];\n        allowedParams.forEach((paramName) => {\n            const setter = \"set\" + MapSVG.ucfirst(paramName);\n            if (typeof options[paramName] !== \"undefined\" && typeof this[setter] == \"function\") {\n                this[setter](options[paramName]);\n            }\n        });\n    }\n\n    update(options) {\n        this.build(options);\n    }\n\n    setId(id: number) {\n        this.id = id;\n    }\n    setTitle(title: string) {\n        this.title = title;\n    }\n    setName(name: string) {\n        this.name = name;\n    }\n\n    loaded() {\n        return this.fields.length !== 0;\n    }\n\n    setFields(fields: any[]) {\n        if (fields) {\n            this.fields.clear();\n\n            fields.forEach((fieldParams) => {\n                this.fields.push(new SchemaField(fieldParams));\n\n                // TODO move this outside of the Schema class:\n                // if(field.type == 'region'){\n                //     field.options = new Map();\n                //     _this.mapsvg.regions.forEach(function(region){\n                //         field.options.set(region.id, {id: region.id, title: region.title});\n                //     });\n                // }\n            });\n        }\n    }\n\n    getFields(): ArrayIndexed<SchemaField> {\n        return this.fields;\n    }\n    getFieldsAsArray(): Array<SchemaField> {\n        // let res: Array<SchemaFieldInterface>;\n        // res = [];\n        // this.fields.forEach((field) => {\n        //     res.push(field);\n        // })\n        // return res;\n        return this.fields;\n    }\n    getFieldNames(): Array<string> {\n        return this.fields.map((f) => f.name);\n    }\n    getField(field) {\n        // if(field === 'id'){\n        //     return {name: 'id', visible: true, type: 'id'};\n        // }\n        return this.fields.findById(field);\n    }\n    getFieldByType(type) {\n        let f = null;\n        this.fields.forEach(function (field) {\n            if (field.type === type) f = field;\n        });\n        return f;\n    }\n    getColumns(filters) {\n        filters = filters || {};\n\n        const columns = this.fields;\n\n        const needfilters = Object.keys(filters).length !== 0;\n        let results = [];\n\n        if (needfilters) {\n            let filterpass;\n            columns.forEach(function (obj) {\n                filterpass = true;\n                for (const param in filters) {\n                    filterpass = obj[param] == filters[param];\n                }\n                filterpass && results.push(obj);\n            });\n        } else {\n            results = columns;\n        }\n\n        return results;\n    }\n\n    getData() {\n        const data = {\n            id: this.id,\n            title: this.title,\n            name: this.name,\n            fields: this.fields,\n            type: this.type,\n        };\n        return data;\n    }\n}\n","interface QueryInterface {\n    sort?: Array<{ field: string; order: string }>;\n    sortBy?: string;\n    sortDir?: string;\n    page?: number;\n    lastpage?: boolean;\n    perpage?: number;\n    search?: string;\n    searchField?: string;\n    searchFallback?: boolean;\n    filters?: { regions?: { table_name: string; region_ids: string[] }; [key: string]: any };\n    filterout?: { [key: string]: string | number };\n    withSchema?: boolean;\n}\n\nexport class Query implements QueryInterface {\n    sort?: Array<{ field: string; order: string }>;\n    sortBy?: string;\n    sortDir?: string;\n    page?: number;\n    lastpage?: boolean;\n    perpage?: number;\n    search?: string;\n    searchField?: string;\n    searchFallback?: boolean;\n    filters?: { regions?: { table_name: string; region_ids: string[] }; [key: string]: any };\n    filterout?: { [key: string]: string | number };\n    withSchema?: boolean;\n\n    constructor(options?: QueryInterface) {\n        this.filters = {};\n        this.filterout = {};\n        this.page = 1;\n        if (options) {\n            for (const i in options) {\n                if (typeof options[i] !== \"undefined\") {\n                    this[i] = options[i];\n                }\n            }\n        }\n    }\n\n    setFields(fields) {\n        const _this = this;\n        for (const key in fields) {\n            if (key == \"filters\") {\n                _this.setFilters(fields[key]);\n            } else {\n                _this[key] = fields[key];\n            }\n        }\n    }\n\n    update(query: QueryInterface) {\n        for (const i in query) {\n            if (typeof query[i] !== \"undefined\") {\n                if (i === \"filters\") {\n                    this.setFilters(query[i]);\n                } else {\n                    this[i] = query[i];\n                }\n            }\n        }\n    }\n\n    get() {\n        return {\n            search: this.search,\n            searchField: this.searchField,\n            searchFallback: this.searchFallback,\n            filters: this.filters,\n            filterout: this.filterout,\n            page: this.page,\n            sort: this.sort,\n            perpage: this.perpage,\n            lastpage: this.lastpage,\n        };\n    }\n\n    clearFilters() {\n        this.resetFilters();\n    }\n    setFilters(fields: { [key: string]: string | number }) {\n        const _this = this;\n        for (const key in fields) {\n            if (fields[key] === null || fields[key] === \"\" || fields[key] === undefined) {\n                if (_this.filters[key]) {\n                    delete _this.filters[key];\n                }\n            } else {\n                _this.filters[key] = fields[key];\n            }\n        }\n    }\n    setSearch(search: string) {\n        this.search = search;\n    }\n    setFilterOut(fields: { [key: string]: string | number } | null): void {\n        if (fields === null) {\n            delete this.filterout;\n        } else {\n            this.filterout = fields;\n        }\n    }\n    resetFilters(fields?: { [key: string]: string | number }) {\n        this.filters = {};\n        this.setSearch(\"\");\n    }\n    setFilterField(field: string, value: string | number) {\n        this.filters[field] = value;\n    }\n    hasFilters(): boolean {\n        return Object.keys(this.filters).length > 0 || this.search.length > 0;\n    }\n    removeFilter(fieldName: string): void {\n        this.filters[fieldName] = null;\n        delete this.filters[fieldName];\n    }\n    requestSchema(requestSchema: boolean) {\n        this.withSchema = requestSchema ? requestSchema : true;\n    }\n}\n","/**\n * LocationAddress class stores address field from Google Geocoding service\n * @param {object} fields\n * @constructor\n */\nexport class LocationAddress {\n    route?: string;\n    address_formatted?: string;\n    administrative_area_level_1?: string;\n    administrative_area_level_1_short?: string;\n    administrative_area_level_2?: string;\n    administrative_area_level_2_short?: string;\n    country?: string;\n    country_short?: string;\n    postal_code?: string;\n\n    constructor(fields: object) {\n        for (const i in fields) {\n            this[i] = fields[i];\n        }\n    }\n\n    getData(): { [key: string]: string } {\n        const copy: { [key: string]: string } = {};\n\n        [\n            \"route\",\n            \"address_formatted\",\n            \"administrative_area_level_1\",\n            \"administrative_area_level_1_short\",\n            \"administrative_area_level_2\",\n            \"administrative_area_level_2_short\",\n            \"country\",\n            \"country_short\",\n            \"postal_code\",\n        ].forEach((field) => {\n            if (this[field]) {\n                copy[field] = this[field];\n            }\n        });\n        return copy;\n    }\n\n    get state() {\n        return this.country_short === \"US\" ? this.administrative_area_level_1 : null;\n    }\n\n    get state_short() {\n        return this.country_short === \"US\" ? this.administrative_area_level_1_short : null;\n    }\n\n    get county() {\n        return this.country_short === \"US\" ? this.administrative_area_level_2 : null;\n    }\n\n    get zip() {\n        return this.postal_code;\n    }\n}\n","import { LocationAddress } from \"./LocationAddress\";\nimport { MapSVG } from \"../Core/globals.js\";\nimport { Marker } from \"../Marker/Marker\";\nimport { CustomObject } from \"../Object/CustomObject\";\n\nexport class ScreenPoint {\n    x: number;\n    y: number;\n    constructor(x: number, y: number) {\n        this.x = x;\n        this.y = y;\n    }\n}\n\nexport class SVGPoint {\n    x: number;\n    y: number;\n    constructor(\n        x: number | string | { x: number | string; y: number | string },\n        y?: number | string\n    ) {\n        let _x, _y;\n        if (typeof x === \"object\") {\n            if (x.x && x.y) {\n                _x = parseFloat(x.x + \"\");\n                _y = parseFloat(x.y + \"\");\n            } else {\n                console.error(\"MapSVG: incorrect format of {x, y} object for SVGPoint.\");\n                _x = 0;\n                _y = 0;\n            }\n        } else {\n            _x = parseFloat(x + \"\");\n            _y = parseFloat(y + \"\");\n        }\n        this.x = _x;\n        this.y = _y;\n    }\n\n    toString() {\n        return this.x + \",\" + this.y;\n    }\n}\n\nexport class GeoPoint {\n    lat: number;\n    lng: number;\n    constructor(\n        lat: number | string | { lat: number | string; lng: number | string },\n        lng?: number | string\n    ) {\n        let _lat, _lng;\n        if (typeof lat === \"object\") {\n            if (lat.lat && lat.lng) {\n                _lat = parseFloat(lat.lat + \"\");\n                _lng = parseFloat(lat.lng + \"\");\n            } else {\n                console.error(\"MapSVG: incorrect format of {lat, lng} object for GeoPoint.\");\n                _lat = 0;\n                _lng = 0;\n            }\n        } else {\n            _lat = parseFloat(lat + \"\");\n            _lng = parseFloat(lng + \"\");\n        }\n        this.lat = _lat;\n        this.lng = _lng;\n    }\n\n    toString() {\n        return this.lat + \",\" + this.lng;\n    }\n}\n\nexport interface LocationOptionsInterface {\n    img: string;\n    object?: CustomObject;\n    svgPoint?: SVGPoint;\n    geoPoint?: GeoPoint;\n    address?: LocationAddress;\n}\n\n/**\n * Location class. Contains lat/lon, x/y coordinates, image, address and marker.\n * @param {object} options\n * @param {MapSVG.Map} mapsvg\n * @constructor\n *\n * @example\n * var location = new MapSVG.Location({\n *   geoPoint: {\n *     lat: 55.22,\n *     lng: 64.12,\n *   },\n *   img: \"/path/to/image.png\"\n *  });\n *\n * var marker = new MapSVG.Marker({\n *   location: location,\n *   mapsvg: mapsvgInstance\n * });\n *\n */\nexport class Location {\n    img: string;\n    imagePath: string;\n    object?: CustomObject;\n    address?: LocationAddress;\n    marker?: Marker;\n    geoPoint?: GeoPoint;\n    svgPoint?: SVGPoint;\n\n    constructor(options: LocationOptionsInterface) {\n        this.update(options);\n    }\n\n    update(options: LocationOptionsInterface): void {\n        if (options.object) {\n            this.setObject(options.object);\n        }\n        if (options.img) {\n            this.setImage(options.img);\n        }\n        if (options.address) {\n            this.setAddress(options.address);\n        }\n        if (options.svgPoint) {\n            this.setSvgPoint(options.svgPoint);\n        }\n        if (options.geoPoint) {\n            this.setGeoPoint(options.geoPoint);\n        }\n    }\n\n    /**\n     * Sets parent object\n     */\n    setObject(object: CustomObject): void {\n        this.object = object;\n    }\n    /**\n     * Sets image of the location\n     * @param {string} imgUrl - URL of the image\n     * @private\n     */\n    setImage(imgUrl: string): void {\n        if (typeof imgUrl !== \"string\") {\n            return;\n        }\n        let src = imgUrl.split(\"/\").pop();\n        if (imgUrl.indexOf(\"uploads\") !== -1) {\n            src = \"uploads/\" + src;\n        }\n        this.img = src;\n        this.imagePath = this.getImageUrl();\n        this.marker && this.marker && this.marker.setImage(this.imagePath);\n    }\n\n    /**\n     * Returns full image path\n     * @return string URL path\n     */\n    getImageUrl(): string {\n        if (this.img && this.img.indexOf(\"uploads/\") === 0) {\n            return MapSVG.urls.uploads + \"markers/\" + this.img.replace(\"uploads/\", \"\");\n        } else {\n            return MapSVG.urls.root + \"markers/\" + (this.img || \"_pin_default.png\");\n        }\n    }\n\n    setAddress(address: { [key: string]: any }): void {\n        this.address = new LocationAddress(address);\n    }\n\n    /**\n     * Sets SvgPoint of the location (x/y coordinates)\n     * @returns void\n     */\n    setSvgPoint(svgPoint: SVGPoint | { x: number; y: number }): void {\n        this.svgPoint = svgPoint instanceof SVGPoint ? svgPoint : new SVGPoint(svgPoint);\n        if (this.marker) {\n            this.marker.setSvgPointFromLocation();\n        }\n    }\n\n    /**\n     * Sets GeoPoint of the location (lat/lng coordinates)\n     * @returns void\n     */\n    setGeoPoint(geoPoint: GeoPoint | { lat: number; lng: number }): void {\n        this.geoPoint = geoPoint instanceof GeoPoint ? geoPoint : new GeoPoint(geoPoint);\n        if (this.marker) {\n            this.marker.setSvgPointFromLocation();\n        }\n    }\n\n    /**\n     * Returns full marker image URL\n     * @returns {string} image URL\n     */\n    getMarkerImage(): string {\n        if (this.img && this.img.indexOf(\"uploads/\") === 0) {\n            return MapSVG.urls.uploads + \"markers/\" + this.img.replace(\"uploads/\", \"\");\n        } else {\n            return MapSVG.urls.root + \"markers/\" + (this.img || \"_pin_default.png\");\n        }\n    }\n\n    /**\n     * Returns only essential data of the location\n     * @returns {img: string, geoPoint?: {lat: number, lng: number}, svgPoint?: {x: number, y: number}, address: LocationAddress}\n     */\n    getData(): {\n        img: string;\n        imagePath: string;\n        markerImagePath: string;\n        geoPoint?: { lat: number; lng: number };\n        svgPoint?: { x: number; y: number };\n        address: LocationAddress;\n    } {\n        const data: {\n            img: string;\n            imagePath: string;\n            markerImagePath: string;\n            geoPoint?: { lat: number; lng: number };\n            svgPoint?: { x: number; y: number };\n            address: LocationAddress;\n        } = {\n            img: this.img,\n            imagePath: this.imagePath,\n            markerImagePath:\n                this.marker && this.marker.object\n                    ? this.marker.object.getMarkerImage()\n                    : this.imagePath,\n            address: this.address,\n        };\n        if (this.geoPoint) {\n            data.geoPoint = { lat: this.geoPoint.lat, lng: this.geoPoint.lng };\n        }\n        if (this.svgPoint) {\n            data.svgPoint = { x: this.svgPoint.x, y: this.svgPoint.y };\n        }\n        return data;\n    }\n}\n","import { Schema } from \"../Infrastructure/Server/Schema.js\";\nimport { GeoPoint, Location, LocationOptionsInterface, SVGPoint } from \"../Location/Location.js\";\nimport { LocationAddress } from \"../Location/LocationAddress.js\";\nimport { Region } from \"../Region/Region.js\";\nimport { MapSVG } from \"../Core/globals\";\nimport { LocationFormElement } from \"../FormBuilder/FormElements\";\nimport { SchemaField } from \"../Infrastructure/Server/SchemaField\";\n\nexport class CustomObject {\n    id: number;\n    fields: Array<string>;\n    schema: Schema;\n    location?: Location;\n    regions?: Array<{ id: string; title: string; tableName: string }>;\n    private _regions?: { [key: string]: Array<{ id: string; title: string }> };\n    dirtyFields: string[];\n    [key: string]: any;\n    initialLoad = true;\n    private locationField: SchemaField;\n\n    constructor(params: any, schema: Schema) {\n        this.setSchema(schema);\n        this.dirtyFields = [];\n        this.regions = [];\n        this._regions = {};\n        if (params.id !== undefined) {\n            this.id = params.id;\n        }\n        this.initialLoad = true;\n        this.build(params);\n        this.initialLoad = false;\n        if (this.id) {\n            this.clearDirtyFields();\n        }\n    }\n\n    private setSchema(schema: Schema): void {\n        this.schema = schema;\n        this.schema.events.on(\"changed\", () => this.setLocationField());\n        this.fields = schema.getFieldNames();\n        this.setLocationField();\n    }\n\n    build(params: any): void {\n        for (const fieldName in params) {\n            const field = this.schema.getField(fieldName);\n            if (field) {\n                if (!this.initialLoad) {\n                    this.dirtyFields.push(fieldName);\n                }\n                switch (field.type) {\n                    case \"region\":\n                        this.regions = params[fieldName];\n\n                        // if(params[fieldName].hasOwnProperty('length')){\n                        //     // If got regions just for current regions table\n                        //     // this._regions[this.schema.name] = this.regions;\n                        // } else {\n                        //     // If got regions for multiple tables\n                        //     // this._regions = params[fieldName];\n                        //     this.regions = typeof this._regions[this.schema.name] != null ? this._regions[this.schema.name] : [];\n                        // }\n                        break;\n                    case \"location\":\n                        if (\n                            params[fieldName] != null &&\n                            params[fieldName] != \"\" &&\n                            Object.keys(params[fieldName]).length !== 0\n                        ) {\n                            const data: LocationOptionsInterface = {\n                                img: this.isMarkersByFieldEnabled()\n                                    ? this.getMarkerImage()\n                                    : params[fieldName].img,\n                                address: new LocationAddress(params[fieldName].address),\n                            };\n                            if (\n                                params[fieldName].geoPoint &&\n                                params[fieldName].geoPoint.lat &&\n                                params[fieldName].geoPoint.lng\n                            ) {\n                                data.geoPoint = new GeoPoint(params[fieldName].geoPoint);\n                            } else if (\n                                params[fieldName].svgPoint &&\n                                params[fieldName].svgPoint.x &&\n                                params[fieldName].svgPoint.y\n                            ) {\n                                data.svgPoint = new SVGPoint(params[fieldName].svgPoint);\n                            }\n                            if (this.location != null) {\n                                this.location.update(data);\n                            } else {\n                                this.location = new Location(data);\n                            }\n                        } else {\n                            this.location = null;\n                        }\n                        break;\n                    case \"post\":\n                        if (params.post) {\n                            this.post = params.post;\n                        }\n                        break;\n                    case \"select\":\n                        this[fieldName] = params[fieldName];\n                        if (!field.multiselect) {\n                            this[fieldName + \"_text\"] = this.getEnumLabel(field, params, fieldName);\n                        }\n                        break;\n                    case \"radio\":\n                        this[fieldName] = params[fieldName];\n                        this[fieldName + \"_text\"] = this.getEnumLabel(field, params, fieldName);\n                        break;\n                    default:\n                        this[fieldName] = params[fieldName];\n                        break;\n                }\n            }\n        }\n        const locationField = this.getLocationField();\n        if (locationField && this.isMarkersByFieldEnabled() && this.isMarkerFieldChanged(params)) {\n            this.reloadMarkerImage();\n        }\n    }\n\n    isMarkerFieldChanged(params: { [key: string]: any }): boolean {\n        return Object.keys(params).indexOf(this.getLocationField().markerField) !== -1;\n    }\n\n    setLocationField(): void {\n        // this.locationField = this.schema.getFieldByType(\"location\");\n        // if (this.locationField) {\n        //     this.getLocationField().markerField = this.locationField.markerField;\n        // }\n    }\n\n    getLocationField(): SchemaField {\n        return this.schema.getFieldByType(\"location\");\n    }\n\n    reloadMarkerImage(): void {\n        this.location && this.location.setImage(this.getMarkerImage());\n    }\n\n    getMarkerImage(): string {\n        let fieldValue;\n\n        if (this.isMarkersByFieldEnabled()) {\n            // @ts-ignore\n            const locationField = this.getLocationField();\n            fieldValue = this[locationField.markerField];\n            if (!fieldValue) {\n                return locationField.defaultMarkerPath || MapSVG.defaultMarkerImage;\n            } else {\n                if (locationField.markerField === \"regions\") {\n                    fieldValue = fieldValue[0] && fieldValue[0].id;\n                } else if (typeof fieldValue === \"object\" && fieldValue.length) {\n                    fieldValue = fieldValue[0].value;\n                }\n                // @ts-ignore\n                return (\n                    locationField.markersByField[fieldValue] ||\n                    locationField.defaultMarkerPath ||\n                    MapSVG.defaultMarkerImage\n                );\n            }\n        } else {\n            return this.location.imagePath;\n        }\n    }\n\n    isMarkersByFieldEnabled(): boolean {\n        const locationField = this.getLocationField();\n        if (!locationField) {\n            return false;\n        }\n        // @ts-ignore\n        if (\n            locationField.markersByFieldEnabled &&\n            locationField.markerField &&\n            Object.values(locationField.markersByField).length > 0\n        ) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    clone(): CustomObject {\n        const data = this.getData();\n        return new CustomObject(data, this.schema);\n    }\n\n    private getEnumLabel(field, params: any, fieldName: string): string {\n        const value = field.options.get(params[fieldName]);\n        if (typeof value !== \"undefined\") {\n            return value.label;\n        } else {\n            return \"\";\n        }\n    }\n\n    update(params: { [key: string]: any }): void {\n        this.build(params);\n    }\n\n    getDirtyFields(): { [key: string]: any } {\n        const data: any = {};\n        this.dirtyFields.forEach((field) => {\n            data[field] = this[field];\n        });\n        data.id = this.id;\n        if (data.location != null && data.location instanceof Location) {\n            data.location = data.location.getData();\n        }\n        if (this.schema.getFieldByType(\"region\")) {\n            data.regions = this.regions;\n        }\n        return data;\n    }\n    clearDirtyFields(): void {\n        this.dirtyFields = [];\n    }\n\n    getData(): { [key: string]: any } {\n        const data: { [key: string]: any } = {};\n\n        const fields = this.schema.getFields();\n        fields.forEach((field) => {\n            switch (field.type) {\n                case \"region\":\n                    data[field.name] = this[field.name];\n                    // data.regions = this.getRegions(regionsTableName);\n                    break;\n                case \"select\":\n                    data[field.name] = this[field.name];\n                    if (!field.multiselect) {\n                        data[field.name + \"_text\"] = this[field.name + \"_text\"];\n                    }\n                    break;\n                case \"post\":\n                    data[field.name] = this[field.name];\n                    data[\"post\"] = this.post;\n                    break;\n                case \"status\":\n                case \"radio\":\n                    data[field.name] = this[field.name];\n                    data[field.name + \"_text\"] = this[field.name + \"_text\"];\n                    break;\n                case \"location\":\n                    data[field.name] = this[field.name] ? this[field.name].getData() : null;\n                    break;\n                default:\n                    data[field.name] = this[field.name];\n                    break;\n            }\n        });\n        return data;\n    }\n\n    getRegions(regionsTableName: string): Array<{ id: string; title: string }> {\n        return this.regions;\n    }\n    getRegionsForTable(regionsTableName: string): Array<{ id: string; title: string }> {\n        return this.regions\n            ? this.regions.filter(\n                  // !region.tableName is a fix for broken settings after v6 release\n                  (region) => !region.tableName || region.tableName === regionsTableName\n              )\n            : [];\n    }\n}\n","import { Server } from \"../Infrastructure/Server/Server\";\nimport { Schema } from \"../Infrastructure/Server/Schema\";\nimport { Query } from \"../Infrastructure/Server/Query\";\nimport { CustomObject } from \"../Object/CustomObject\";\nimport { Events } from \"./Events\";\nimport { ArrayIndexed } from \"./ArrayIndexed\";\nimport { MapSVGMap } from \"../Map/Map\";\nconst $ = jQuery;\n\nexport interface RepositoryInterface {\n    server: Server;\n    query: Query;\n    hasMoreRecords: boolean;\n    className: string;\n\n    path: string;\n    loaded: boolean;\n    schema: Schema;\n    objects: ArrayIndexed<CustomObject>;\n    completeChunks: number;\n\n    objectNameSingle: string;\n    objectNameMany: string;\n\n    events: Events;\n\n    noFiltersNoLoad: boolean;\n\n    setSchema(schema: Schema): void;\n    getSchema(): Schema;\n\n    getLoaded(): ArrayIndexed<CustomObject>;\n    getLoadedAsArray(): ArrayIndexed<CustomObject>;\n    create(object: any): JQueryDeferred<any>;\n    find(params?: Query): JQueryDeferred<any>;\n    findById(id: number | string): JQueryDeferred<any>;\n    getLoadedObject(id: number | string): CustomObject;\n    update(object: any): JQueryDeferred<any>;\n    delete(id: string | number): JQueryDeferred<any>;\n\n    loadDataFromResponse(data: { [key: string]: any } | string): void;\n    reload(): void;\n\n    encodeData(params: any): { [key: string]: any };\n    decodeData(dataJSON: string): { [key: string]: any };\n\n    onFirstPage(): boolean;\n    onLastPage(): boolean;\n}\n\nexport class Repository implements RepositoryInterface {\n    server: Server;\n    query: Query;\n    hasMoreRecords: boolean;\n    className: string;\n\n    objectNameSingle: string;\n    objectNameMany: string;\n\n    path: string;\n    loaded: boolean;\n    schema: Schema;\n    objects: ArrayIndexed<CustomObject>;\n    completeChunks: number;\n\n    noFiltersNoLoad: boolean;\n\n    events: Events;\n\n    constructor(objectName: string, path: string) {\n        this.server = new Server();\n        this.query = new Query();\n        this.events = new Events(this);\n        this.className = \"\";\n        this.objectNameSingle = objectName;\n        this.objectNameMany = objectName + \"s\";\n        this.setPath(path);\n        this.objects = new ArrayIndexed(\"id\");\n        this.completeChunks = 0;\n    }\n\n    setNoFiltersNoLoad(value: boolean): void {\n        this.noFiltersNoLoad = value;\n    }\n\n    setDataSource(path: string) {\n        this.setPath(path);\n        this.query = new Query({ withSchema: true });\n        return this.find().done(() => {\n            this.query.update({ withSchema: false });\n        });\n    }\n\n    setPath(path: string) {\n        this.path = path.replace(/\\/+$/, \"\") + \"/\";\n    }\n\n    setSchema(schema: Schema): void {\n        this.schema = schema;\n    }\n    getSchema(): Schema {\n        return this.schema;\n    }\n\n    loadDataFromResponse(response: { [key: string]: any } | string): void {\n        let data: any;\n        data = this.decodeData(response);\n        this.objects.clear();\n\n        if (data[this.objectNameMany] && data[this.objectNameMany].length) {\n            this.hasMoreRecords =\n                this.query.perpage && data[this.objectNameMany].length > this.query.perpage;\n            if (this.hasMoreRecords) {\n                data[this.objectNameMany].pop();\n            }\n            data[this.objectNameMany].forEach((obj) => {\n                this.objects.push(obj);\n            });\n        } else {\n            this.hasMoreRecords = false;\n        }\n\n        this.loaded = true;\n        this.events.trigger(\"loaded\");\n    }\n    reload(): JQueryDeferred<any> {\n        return this.find();\n    }\n\n    create(object: object): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = {};\n        data[this.objectNameSingle] = this.encodeData(object);\n\n        this.server\n            .post(this.path, data)\n            .done((response: any) => {\n                const data = this.decodeData(response);\n                const object = data[this.objectNameSingle];\n                this.objects.push(object);\n                defer.resolve(object);\n                this.events.trigger(\"created\", this, [object]);\n            })\n            .fail((response) => {\n                defer.reject(response);\n            });\n\n        return defer;\n    }\n\n    findById(id: number | string, nocache = false): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        let object;\n\n        if (!nocache) {\n            object = this.objects.findById(id.toString());\n        }\n        if (!nocache && object) {\n            defer.resolve(object);\n        } else {\n            this.server\n                .get(this.path + id)\n                .done((response: string) => {\n                    const data = this.decodeData(response);\n                    defer.resolve(data[this.objectNameSingle]);\n                })\n                .fail((response) => {\n                    defer.reject(response);\n                });\n        }\n\n        return defer;\n    }\n\n    find(query?: Query | { [key: string]: any }): JQueryDeferred<any> {\n        this.events.trigger(\"load\");\n\n        const defer = jQuery.Deferred();\n\n        defer.promise();\n\n        if (typeof query !== \"undefined\") {\n            this.query.update(query);\n        }\n\n        if (this.noFiltersNoLoad && !this.query.hasFilters()) {\n            this.objects.clear();\n            this.events.trigger(\"loaded\");\n            defer.resolve(this.getLoaded());\n            return defer;\n        }\n\n        if (!this.schema) {\n            this.query.update({ withSchema: true });\n        }\n\n        this.server\n            .get(this.path, this.query)\n            .done((response: string) => {\n                if (!this.schema) {\n                    this.query.update({ withSchema: false });\n                }\n                this.loadDataFromResponse(response);\n                defer.resolve(this.getLoaded());\n            })\n            .fail((response) => {\n                defer.reject(response);\n            });\n\n        return defer;\n    }\n\n    getLoaded(): ArrayIndexed<CustomObject> {\n        return this.objects;\n    }\n    getLoadedObject(id: number | string): CustomObject {\n        return this.objects.findById(id.toString());\n    }\n    getLoadedAsArray(): ArrayIndexed<CustomObject> {\n        return this.objects;\n    }\n\n    update(object: any): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = {};\n        const objectUpdatedFields = \"getDirtyFields\" in object ? object.getDirtyFields() : object;\n        data[this.objectNameSingle] = this.encodeData(objectUpdatedFields);\n\n        this.server\n            .put(this.path + objectUpdatedFields.id, data)\n            .done((response: string) => {\n                if (\"clearDirtyFields\" in object) {\n                    object.clearDirtyFields();\n                }\n\n                defer.resolve(object);\n                this.events.trigger(\"updated\", this, object);\n            })\n            .fail((response, stat) => {\n                defer.reject(response, stat);\n            });\n        return defer;\n    }\n\n    delete(id: number): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        this.server\n            .delete(this.path + id)\n            .done((response: string) => {\n                this.objects.delete(id.toString());\n                this.events.trigger(\"deleted\");\n                defer.resolve();\n            })\n            .fail((response) => {\n                defer.reject(response);\n            });\n\n        return defer;\n    }\n\n    clear(): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n        this.server\n            .delete(this.path)\n            .done((response: string) => {\n                this.objects.clear();\n                this.events.trigger(\"loaded\");\n                this.events.trigger(\"cleared\");\n                defer.resolve();\n            })\n            .fail((response) => {\n                defer.reject(response);\n            });\n\n        return defer;\n    }\n\n    onFirstPage(): boolean {\n        return this.query.page === 1;\n    }\n\n    onLastPage(): boolean {\n        return this.hasMoreRecords === false;\n    }\n\n    encodeData(params: any): { [key: string]: any } {\n        return params;\n    }\n\n    decodeData(dataJSON: string | { [key: string]: any }): { [key: string]: any } {\n        let data;\n\n        if (typeof dataJSON === \"string\") {\n            data = JSON.parse(dataJSON);\n        } else {\n            data = dataJSON;\n        }\n\n        if ((data.object || data.region || data.regions || data.objects) && data.schema) {\n            this.setSchema(new Schema(data.schema));\n        }\n\n        const dataFormatted: any = {};\n        for (const key in data) {\n            if (data[key]) {\n                switch (key) {\n                    case \"object\":\n                    case \"region\":\n                        dataFormatted[key] = new CustomObject(data[key], this.schema);\n                        break;\n                    case \"objects\":\n                    case \"regions\":\n                        dataFormatted[key] = data[key].map(\n                            (obj) => new CustomObject(obj, this.schema)\n                        );\n                        break;\n                    case \"schema\":\n                        dataFormatted[key] = this.schema || new Schema(data[key]);\n                        break;\n                    case \"schemas\":\n                        dataFormatted[key] = data[key].map((obj) => new Schema(obj));\n                        break;\n                    default:\n                        break;\n                }\n            }\n        }\n        return dataFormatted;\n    }\n\n    /**\n     * Imports data from a CSV file.\n     *\n     * @param data\n     * @param convertLatlngToAddress\n     * @param mapsvg\n     */\n    import(data: { [key: string]: any }, convertLatlngToAddress: boolean, mapsvg: MapSVGMap) {\n        const _this = this;\n\n        const locationField = _this.schema.getFieldByType(\"location\");\n        let language = \"en\";\n        if (locationField && locationField.language) {\n            language = locationField.language;\n        }\n\n        data = this.formatCSV(data, mapsvg);\n\n        return this.importByChunks(data, language, convertLatlngToAddress).done(function () {\n            _this.find();\n        });\n    }\n\n    /**\n     * Splits data to small chunks and sends every chunk separately to the server\n     *\n     * @param data - Data to import\n     * @param language - Language for Geocoding conversions\n     * @param convertLatlngToAddress - Whether lat/lng coordinates should be converted to addresses via Geocoding service\n     */\n    importByChunks(\n        data: { [key: string]: any },\n        language: string,\n        convertLatlngToAddress: boolean\n    ) {\n        const _this = this;\n\n        let i,\n            j,\n            temparray,\n            chunk = 50;\n        const chunks = [];\n\n        for (i = 0, j = data.length; i < j; i += chunk) {\n            temparray = data.slice(i, i + chunk);\n            chunks.push(temparray);\n        }\n\n        if (chunks.length > 0) {\n            let delay = 0;\n            const delayPlus = chunks[0][0] && chunks[0][0].location ? 1000 : 0;\n\n            var defer = $.Deferred();\n            defer.promise();\n\n            _this.completeChunks = 0;\n\n            chunks.forEach(function (chunk) {\n                delay += delayPlus;\n                setTimeout(function () {\n                    const data = {\n                        language: language,\n                        convertLatlngToAddress: convertLatlngToAddress,\n                    };\n\n                    data[_this.objectNameMany] = JSON.stringify(chunk);\n\n                    _this.server\n                        .post(_this.path + \"import\", data)\n                        .done(function (_data) {\n                            _this.completeChunk(chunks, defer);\n                        })\n                        .fail((response) => {\n                            console.error(response);\n                        });\n                }, delay);\n            });\n        }\n        return defer;\n    }\n\n    completeChunk(chunks, defer) {\n        const _this = this;\n        _this.completeChunks++;\n        if (_this.completeChunks === chunks.length) {\n            defer.resolve();\n        }\n    }\n\n    formatCSV(data: { [key: string]: any }, mapsvg: MapSVGMap) {\n        const _this = this;\n        const newdata = [];\n        const latLngRegex = /^(\\-?\\d+(\\.\\d+)?),\\s*(\\-?\\d+(\\.\\d+)?)$/g;\n\n        const regionsTable = mapsvg.regionsRepository.getSchema().name;\n\n        data.forEach(function (object, index) {\n            const newObject = {};\n            for (const key in object) {\n                let field = _this.schema.getField(key);\n                if (key === \"post\") {\n                    field = { type: \"post\" };\n                }\n                if (field !== undefined) {\n                    switch (field.type) {\n                        case \"region\":\n                            newObject[key] = {};\n                            newObject[key] = object[key]\n                                .split(\",\")\n                                .map(function (regionId) {\n                                    return regionId.trim();\n                                })\n                                .filter(function (rId) {\n                                    return (\n                                        mapsvg.getRegion(rId) !== undefined ||\n                                        mapsvg.regions.find(function (item) {\n                                            return item.title === rId;\n                                        }) !== undefined\n                                    );\n                                })\n                                .map(function (rId) {\n                                    let r = mapsvg.getRegion(rId);\n                                    if (typeof r === \"undefined\") {\n                                        r = mapsvg.regions.find(function (item) {\n                                            return item.title === rId;\n                                        });\n                                    }\n                                    return { id: r.id, title: r.title, tableName: regionsTable };\n                                });\n                            break;\n                        case \"location\":\n                            if (object[key].match(latLngRegex)) {\n                                const coords = object[key].split(\",\").map(function (n) {\n                                    return parseFloat(n);\n                                });\n                                if (\n                                    coords.length == 2 &&\n                                    coords[0] > -90 &&\n                                    coords[0] < 90 &&\n                                    coords[1] > -180 &&\n                                    coords[1] < 180\n                                ) {\n                                    newObject[key] = {\n                                        geoPoint: { lat: coords[0], lng: coords[1] },\n                                    };\n                                } else {\n                                    newObject[key] = \"\";\n                                }\n                            } else if (object[key]) {\n                                newObject[key] = { address: object[key] };\n                            }\n\n                            if (typeof newObject[key] == \"object\") {\n                                newObject[key].img = mapsvg.options.defaultMarkerImage;\n                            }\n\n                            break;\n                        case \"select\":\n                            const field = _this.schema.getField(key);\n                            if (field.multiselect) {\n                                const labels = _this.schema.getField(key).options.map(function (f) {\n                                    return f.label;\n                                });\n                                newObject[key] = object[key]\n                                    .split(\",\")\n                                    .map(function (label) {\n                                        return label.trim();\n                                    })\n                                    .filter(function (label) {\n                                        return labels.indexOf(label) !== -1;\n                                    })\n                                    .map(function (label) {\n                                        return _this.schema\n                                            .getField(key)\n                                            .options.filter(function (option) {\n                                                return option.label == label;\n                                            })[0];\n                                    });\n                                if (newObject[key].length === 0) {\n                                    const values = _this.schema\n                                        .getField(key)\n                                        .options.map(function (f) {\n                                            return f.value + \"\";\n                                        });\n                                    newObject[key] = object[key]\n                                        .split(\",\")\n                                        .map(function (value) {\n                                            return value.trim();\n                                        })\n                                        .filter(function (value) {\n                                            return values.indexOf(value) !== -1;\n                                        })\n                                        .map(function (value) {\n                                            return _this.schema\n                                                .getField(key)\n                                                .options.filter(function (option) {\n                                                    return option.value == value;\n                                                })[0];\n                                        });\n                                }\n                            } else {\n                                newObject[key] = object[key];\n                            }\n                            break;\n                        case \"radio\":\n                        case \"text\":\n                        case \"textarea\":\n                        case \"status\":\n                        default:\n                            newObject[key] = object[key];\n                            break;\n                    }\n                }\n            }\n            data[index] = newObject;\n        });\n\n        return data;\n    }\n}\n","import { Repository } from \"../Core/Repository.js\";\nimport { Schema } from \"../Infrastructure/Server/Schema\";\nimport { CustomObject } from \"../Object/CustomObject\";\nimport { MapSVGMap } from \"./Map\";\n\nexport class MapsRepository extends Repository {\n    path = \"maps/\";\n\n    constructor() {\n        super(\"map\", \"maps\");\n    }\n\n    encodeData(params: any): { [key: string]: any } {\n        const data: { [key: string]: any } = {};\n        if (typeof params.options !== \"undefined\") {\n            data.options = JSON.stringify(params.options);\n\n            // Apache mod_sec blocks requests with the following words:\n            // table, select, database. Encode those words to decode them later in PHP to prevent blocking:\n            data.options = data.options.replace(/select/g, \"!mapsvg-encoded-slct\");\n            data.options = data.options.replace(/table/g, \"!mapsvg-encoded-tbl\");\n            data.options = data.options.replace(/database/g, \"!mapsvg-encoded-db\");\n            data.options = data.options.replace(/varchar/g, \"!mapsvg-encoded-vc\");\n            data.options = data.options.replace(/int\\(11\\)/g, \"!mapsvg-encoded-int\");\n        }\n        if (typeof params.title !== \"undefined\") {\n            data.title = params.title;\n        }\n        if (typeof params.id !== \"undefined\") {\n            data.id = params.id;\n        }\n        if (typeof params.status !== \"undefined\") {\n            data.status = params.status;\n        }\n\n        return data;\n    }\n\n    decodeData(dataJSON: string | { [key: string]: any }): { [key: string]: any } {\n        let data;\n\n        if (typeof dataJSON === \"string\") {\n            data = JSON.parse(dataJSON);\n        } else {\n            data = dataJSON;\n        }\n\n        return data;\n    }\n\n    copy(id: number, title: string): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = { options: { title: title } };\n\n        this.server\n            .post(this.path + id + \"/copy\", this.encodeData(data))\n            .done((response: string) => {\n                const data = this.decodeData(response);\n                this.objects.clear();\n                this.events.trigger(\"loaded\");\n                this.events.trigger(\"cleared\");\n                defer.resolve(data.map);\n            })\n            .fail(() => {\n                defer.reject();\n            });\n\n        return defer;\n    }\n\n    createFromV2(object: any) {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = {};\n        data[this.objectNameSingle] = this.encodeData(object);\n\n        this.server\n            .post(this.path + \"/createFromV2\", data)\n            .done((response: any) => {\n                const data = this.decodeData(response);\n                const object = data[this.objectNameSingle];\n                this.objects.push(object);\n                defer.resolve(object);\n                this.events.trigger(\"created\", this, [object]);\n            })\n            .fail(() => {\n                defer.reject();\n            });\n\n        return defer;\n    }\n\n    delete(id: number): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        this.server\n            .delete(this.path + id)\n            .done((response: string) => {\n                this.objects.delete(id.toString());\n                this.events.trigger(\"deleted\");\n                defer.resolve();\n            })\n            .fail(() => {\n                defer.reject();\n            });\n\n        return defer;\n    }\n}\n","import { Repository } from \"../Core/Repository.js\";\nimport { Schema } from \"../Infrastructure/Server/Schema\";\nimport { CustomObject } from \"../Object/CustomObject\";\nimport { MapSVGMap } from \"./Map\";\n\nexport class MapsV2Repository extends Repository {\n    path = \"maps-v2/\";\n\n    constructor() {\n        super(\"map\", \"maps\");\n    }\n\n    encodeData(params: any): { [key: string]: any } {\n        const data: { [key: string]: any } = {};\n        data.options = JSON.stringify(params.options);\n\n        // Apache mod_sec blocks requests with the following words:\n        // table, select, database. Encode those words to decode them later in PHP to prevent blocking:\n        data.options = data.options.replace(/select/g, \"!mapsvg-encoded-slct\");\n        data.options = data.options.replace(/table/g, \"!mapsvg-encoded-tbl\");\n        data.options = data.options.replace(/database/g, \"!mapsvg-encoded-db\");\n        data.options = data.options.replace(/varchar/g, \"!mapsvg-encoded-vc\");\n\n        data.id = params.id;\n        data.title = params.title;\n\n        return data;\n    }\n\n    decodeData(dataJSON: string | { [key: string]: any }): { [key: string]: any } {\n        let data;\n\n        if (typeof dataJSON === \"string\") {\n            data = JSON.parse(dataJSON);\n        } else {\n            data = dataJSON;\n        }\n\n        return data;\n    }\n}\n","import { GeoViewBox, ViewBox } from \"./MapOptionsInterface\";\nimport { GeoPoint, ScreenPoint, SVGPoint } from \"../Location/Location\";\n\nclass Converter {\n    private mapElement: HTMLElement;\n    private geoViewBox: GeoViewBox;\n    private defViewBox: ViewBox;\n    private viewBox: ViewBox;\n    public mapLonDelta: number;\n    private mapLatBottomDegree: number;\n    private worldMapRadius: number;\n    private worldMapWidth: number;\n    private worldShift: boolean;\n    private yShift: number;\n\n    constructor(\n        mapElement: HTMLElement,\n        defViewBox: ViewBox,\n        viewBox: ViewBox,\n        geoViewBox?: GeoViewBox\n    ) {\n        this.mapElement = mapElement;\n        this.defViewBox = defViewBox;\n        this.viewBox = viewBox;\n        this.yShift = 0;\n        if (geoViewBox) {\n            this.setGeoViewBox(geoViewBox);\n        }\n    }\n\n    setYShift(): void {\n        // Don't do shift for world map (Google Map)\n        if (this.defViewBox.width === 20426) {\n            this.yShift = 0;\n            return;\n        }\n        if (this.geoViewBox) {\n            const topLeftPoint = this.convertGeoToSVG(this.geoViewBox.ne);\n            this.yShift = topLeftPoint.y - this.defViewBox.y;\n        }\n    }\n\n    setGeoViewBox(geoViewBox: GeoViewBox): void {\n        this.geoViewBox = geoViewBox;\n        this.mapLonDelta = this.geoViewBox.ne.lng - this.geoViewBox.sw.lng;\n        this.mapLatBottomDegree = (this.geoViewBox.sw.lat * Math.PI) / 180;\n        this.worldMapWidth = (this.defViewBox.width / this.mapLonDelta) * 360;\n        this.worldMapRadius = ((this.defViewBox.width / this.mapLonDelta) * 360) / (2 * Math.PI);\n        this.setYShift();\n    }\n\n    setWorldShift(on: boolean) {\n        this.worldShift = on;\n    }\n\n    getScale() {\n        return this.mapElement.clientWidth / this.viewBox.width;\n    }\n\n    /**\n     * Converts SVG coordinates to pixel coordinates relative to the map container\n     */\n    convertSVGToPixel(svgPoint: SVGPoint): ScreenPoint {\n        const scale = this.getScale();\n\n        let shiftXByGM = 0;\n        const shiftYByGM = 0;\n\n        if (this.worldShift) {\n            if (this.viewBox.x - this.defViewBox.x > this.defViewBox.width) {\n                shiftXByGM =\n                    this.worldMapWidth *\n                    Math.floor((this.viewBox.x - this.defViewBox.x) / this.defViewBox.width);\n            }\n        }\n\n        return new ScreenPoint(\n            (svgPoint.x - this.viewBox.x + shiftXByGM) * scale,\n            (svgPoint.y - this.viewBox.y + shiftYByGM) * scale\n        );\n    }\n    /**\n     * Converts pixel coordinates (relative to map container) to SVG coordinates\n     */\n    convertPixelToSVG(screenPoint: ScreenPoint): SVGPoint {\n        const scale = this.getScale();\n        return new SVGPoint(\n            screenPoint.x / scale + this.viewBox.x,\n            screenPoint.y / scale + this.viewBox.y\n        );\n    }\n    /**\n     * Converts geo-coordinates (latitude/lognitude) to SVG coordinates\n     */\n    convertGeoToSVG(geoPoint: GeoPoint): SVGPoint {\n        if (!this.geoViewBox) {\n            throw new Error(\"Can't do convertGeoToSVG() - geoViewBox is not provided.\");\n        }\n        let x =\n            (geoPoint.lng - this.geoViewBox.sw.lng) * (this.defViewBox.width / this.mapLonDelta);\n        const lat = (geoPoint.lat * Math.PI) / 180;\n        const mapOffsetY =\n            (this.worldMapRadius / 2) *\n            Math.log(\n                (1 + Math.sin(this.mapLatBottomDegree)) / (1 - Math.sin(this.mapLatBottomDegree))\n            );\n        let y =\n            this.defViewBox.height -\n            ((this.worldMapRadius / 2) * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat))) -\n                mapOffsetY);\n\n        x += this.defViewBox.x;\n        y += this.defViewBox.y;\n\n        y -= this.yShift;\n\n        return new SVGPoint(x, y);\n    }\n    /**\n     * Converts SVG coordinates to geo-coordinates (latitude/lognitude).\n     */\n    convertSVGToGeo(svgPoint: SVGPoint): GeoPoint {\n        if (!this.geoViewBox) {\n            throw new Error(\"Can't do convertSVGToGeo() - geoViewBox is not provided.\");\n        }\n        const tx = svgPoint.x - this.defViewBox.x;\n        const ty = svgPoint.y - this.defViewBox.y;\n\n        const mapOffsetY =\n            (this.worldMapRadius / 2) *\n            Math.log(\n                (1 + Math.sin(this.mapLatBottomDegree)) / (1 - Math.sin(this.mapLatBottomDegree))\n            );\n        const equatorY = this.defViewBox.height + mapOffsetY;\n        const a = (equatorY - ty) / this.worldMapRadius;\n        let lat = (180 / Math.PI) * (2 * Math.atan(Math.exp(a)) - Math.PI / 2);\n        let lng = this.geoViewBox.sw.lng + (tx / this.defViewBox.width) * this.mapLonDelta;\n        lat = parseFloat(lat.toFixed(6));\n        lng = parseFloat(lng.toFixed(6));\n        return new GeoPoint(lat, lng);\n    }\n}\n\nexport { Converter };\n","/**\n * Resize sensor.\n * @private\n * @param element\n * @param callback\n * @constructor\n */\n\nconst $ = jQuery;\n\nexport class ResizeSensor {\n    element: HTMLElement;\n    callback: Function;\n    expand: HTMLElement;\n    shrink: HTMLElement;\n    currentWidth: number;\n    currentHeight: number;\n\n    constructor(element, callback) {\n        const _this = this;\n\n        _this.element = element;\n        _this.callback = callback;\n\n        const style = getComputedStyle(element);\n        let zIndex = parseInt(style.zIndex);\n        if (isNaN(zIndex)) {\n            zIndex = 0;\n        }\n        zIndex--;\n\n        _this.expand = document.createElement(\"div\");\n        _this.expand.style.position = \"absolute\";\n        _this.expand.style.left = \"0px\";\n        _this.expand.style.top = \"0px\";\n        _this.expand.style.right = \"0px\";\n        _this.expand.style.bottom = \"0px\";\n        _this.expand.style.overflow = \"hidden\";\n        _this.expand.style.zIndex = zIndex.toString();\n        _this.expand.style.visibility = \"hidden\";\n\n        const expandChild = document.createElement(\"div\");\n        expandChild.style.position = \"absolute\";\n        expandChild.style.left = \"0px\";\n        expandChild.style.top = \"0px\";\n        expandChild.style.width = \"10000000px\";\n        expandChild.style.height = \"10000000px\";\n        _this.expand.appendChild(expandChild);\n\n        _this.shrink = document.createElement(\"div\");\n        _this.shrink.style.position = \"absolute\";\n        _this.shrink.style.left = \"0px\";\n        _this.shrink.style.top = \"0px\";\n        _this.shrink.style.right = \"0px\";\n        _this.shrink.style.bottom = \"0px\";\n        _this.shrink.style.overflow = \"hidden\";\n        _this.shrink.style.zIndex = zIndex.toString();\n        _this.shrink.style.visibility = \"hidden\";\n\n        const shrinkChild = document.createElement(\"div\");\n        shrinkChild.style.position = \"absolute\";\n        shrinkChild.style.left = \"0px\";\n        shrinkChild.style.top = \"0px\";\n        shrinkChild.style.width = \"200%\";\n        shrinkChild.style.height = \"200%\";\n        _this.shrink.appendChild(shrinkChild);\n\n        _this.element.appendChild(_this.expand);\n        _this.element.appendChild(_this.shrink);\n\n        const size = element.getBoundingClientRect();\n\n        _this.currentWidth = size.width;\n        _this.currentHeight = size.height;\n\n        _this.setScroll();\n\n        _this.expand.addEventListener(\"scroll\", function () {\n            _this.onScroll();\n        });\n        _this.shrink.addEventListener(\"scroll\", function () {\n            _this.onScroll();\n        });\n    }\n\n    onScroll() {\n        const _this = this;\n        const size = _this.element.getBoundingClientRect();\n\n        const newWidth = size.width;\n        const newHeight = size.height;\n\n        if (newWidth != _this.currentWidth || newHeight != _this.currentHeight) {\n            _this.currentWidth = newWidth;\n            _this.currentHeight = newHeight;\n            _this.callback();\n        }\n\n        this.setScroll();\n    }\n\n    setScroll() {\n        this.expand.scrollLeft = 10000000;\n        this.expand.scrollTop = 10000000;\n        this.shrink.scrollLeft = 10000000;\n        this.shrink.scrollTop = 10000000;\n    }\n\n    destroy() {\n        this.expand.remove();\n        this.shrink.remove();\n    }\n}\n","/**\n * MapOptions object used to define the properties that can be set on a Map.\n * @typedef {Object} MapSVG.MapOptions\n * @property {string} source - SVG file URL\n * @property {boolean} disableAll - Disables all regions\n * @property {boolean} responsive - Map responsiveness. Default: true\n * @property {string} loadingText - Loading text message. Default is \"Loading map...\"\n * @property {number} width - Width of the map\n * @property {number} height - Height of the map\n * @property (array) viewBox - Map viewBox: [x,y,width,height]\n * @property {boolean} lockAspectRatio - Keep aspect ratio when changing width or height\n * @property {object} padding - Map padding, default: {top: 0, left: 0, right: 0, bottom: 0}\n * @property {string} cursor - Mouse pointer style: \"default' or \"pointer\"\n * @property {boolean} multiSelect - Allows to select multiple Regions. Default: false\n * @property {object} colors - Color settings. Example: {base: \"#E1F1F1\", background: \"#eeeeee\", hover: \"#548eac\", selected: \"#065A85\", stroke: \"#7eadc0\"},\n * @property {object} clustering - Clustering settings. Default: {on: false},\n * @property {object} zoom - Zoom options. Default: {on: false, limit: [0,10], delta: 2, buttons: {on: true, location: 'right'}, mousewheel: true, fingers: true},\n * @property {object} scroll - Scroll options. Default: {on: false, limit: false, background: false, spacebar: false},\n * @property {object} tooltips - Tooltip options. Default: {on: false, position: 'bottom-right', template: '', maxWidth: '', minWidth: 100},\n * @property {object} popovers - Popover options. Default: {on: false, position: 'top', template: '', centerOn: true, width: 300, maxWidth: 50, maxHeight: 50},\n * @property {object} regionStatuses - List of Region statuses\n * @property {object} events - List of callbacks\n * @property {object} choropleth - Choropleth map settings.\n * @property {object} labelsMarkers - Marker labels settings. Default: {on:false}\n * @property {object} labelsMarkers - Region labels settings. Default: {on:false}\n */\nimport { GeoPoint, SVGPoint } from \"../Location/Location\";\nimport { SchemaField } from \"../Infrastructure/Server/SchemaField\";\nimport { ArrayIndexed } from \"../Core/ArrayIndexed\";\n\nexport interface MapOptionsInterface {\n    id: number;\n    title: string;\n    backend: boolean; // passed from admin\n    /** @deprecated */\n    afterLoad: Function;\n    /** @deprecated */\n    beforeLoad: Function;\n    /** @deprecated */\n    dataLoaded: Function;\n    db_map_id: number | string;\n    source: string;\n    regionPrefix: string;\n    groups: ArrayIndexed<GroupOptionsInterface>;\n    galleries: ArrayIndexed<GalleryOptionsInterface>;\n    layersControl: LayersControlOptionsInterface;\n    disableAll: boolean;\n    responsive: boolean;\n    loadingText: string;\n    width: number;\n    height: number;\n    viewBox: number[];\n    lockAspectRatio: boolean;\n    padding: { top: number; left: number; right: number; bottom: number };\n    cursor: string;\n    multiSelect: boolean;\n    colorsIgnore: boolean;\n    editMode: boolean;\n    defaultMarkerImage: string;\n    fitMarkers: boolean;\n    fitMarkersOnStart: boolean;\n    fitSingleMarkerZoom: number;\n    menu: {\n        showFirst: string;\n        showMapOnClick: boolean;\n        noResultsText: string;\n        on: boolean;\n        customContainer: boolean;\n        width: string;\n        source: string;\n        hideOnMobile: boolean;\n        location: string;\n        containerId: string;\n        position: string;\n        filterout: { field: string; val: number | string };\n        categories: {\n            on: boolean;\n            groupBy: string;\n            collapse: boolean;\n            collapseOther: boolean;\n            hideEmpty: boolean;\n        };\n        sortBy: string;\n        sortDirection: string;\n        minHeight: string;\n    };\n    colors: {\n        base?: string;\n        baseDefault?: string;\n        background?: string;\n        hover?: string | number;\n        selected?: string | number;\n        stroke?: string;\n        directory: string;\n        directorySearch: string;\n        detailsView: string;\n        popover: string;\n        tooltip: string;\n        status: any;\n        markers: any;\n        leftSidebar: string;\n        rightSidebar: string;\n        header: string;\n        footer: string;\n        modalFilters: string;\n        clusters: string;\n        clustersHover: string;\n        clustersText: string;\n        clustersBorders: string;\n        clustersHoverBorders: string;\n        clustersHoverText: string;\n    };\n    clustering: { on: boolean };\n    zoom: {\n        on: boolean;\n        limit: [number, number];\n        delta: number;\n        buttons: {\n            on: boolean;\n            location: string;\n        };\n        mousewheel: boolean;\n        fingers: boolean;\n        hideSvg: boolean;\n        hideSvgZoomLevel: number;\n    };\n    scroll: {\n        on: boolean;\n        limit: boolean;\n        background: boolean;\n        spacebar: boolean;\n    };\n    tooltips: {\n        on: boolean;\n        position: string;\n        template: string;\n        maxWidth: number;\n        minWidth: number;\n    };\n    popovers: {\n        on: boolean;\n        position: string;\n        template: string;\n        centerOn: boolean;\n        width: string;\n        maxWidth: number;\n        maxHeight: number;\n        mobileFullscreen: boolean;\n        resetViewboxOnClose: boolean;\n    };\n    regionStatuses: Array<any>;\n    events: { [key: string]: string };\n    choropleth: {\n        on?: boolean;\n        [key: string]: any;\n        source: string;\n        sourceField: string;\n        sourceFieldSelect: {\n            on: boolean;\n            variants: Array<string>;\n        };\n        bubbleMode: boolean;\n        bubbleSize: {\n            min: number;\n            max: number;\n        };\n        coloring: {\n            mode: string;\n            noData: {\n                color: \"grey\";\n                description: \"-\";\n            };\n            gradient: {\n                colors: {\n                    low: string;\n                    high: string;\n                    diffRGB: { r: number; g: number; b: number; a: number };\n                    lowRGB: { r: number; g: number; b: number; a: number };\n                    highRGB: { r: number; g: number; b: number; a: number };\n                };\n                labels: {\n                    low: string;\n                    high: string;\n                };\n                values: {\n                    min: number;\n                    max: number;\n                    maxAdjusted: number;\n                };\n            };\n            palette: {\n                colors: Array<{\n                    color: string;\n                    valueFrom: number;\n                    valueTo: number;\n                    description: string;\n                }>;\n                outOfRange: {\n                    color: \"grey\";\n                    description: \"-\";\n                };\n            };\n            legend: {\n                on: boolean;\n                layout: string;\n                container: string;\n                title: string;\n                text: string;\n                description: string;\n                width: string;\n                height: string;\n            };\n        };\n    };\n    regionChoroplethField: string;\n    regions: Array<{ id: string; title: string; fill: string; disabled: boolean }>;\n    database: {\n        pagination: { on: boolean; perpage: number; showIn: string; prev: string; next: string };\n        loadOnStart: boolean;\n        noFiltersNoLoad: boolean;\n        regionsTableName: string;\n        objectsTableName: string;\n    };\n    labelsMarkers: { on: boolean };\n    labelsRegions: { on: boolean };\n    googleMaps: {\n        on: boolean;\n        apiKey: string;\n        center: GeoPoint;\n        zoom: number;\n        drawingTools?: boolean;\n        geometry?: boolean;\n        minZoom: number;\n        language: string;\n    };\n    css: string;\n    containers: {\n        leftSidebar: { on: boolean; width: string; height: string };\n        rightSidebar: { on: boolean; width: string; height: string };\n        header: { on: boolean; width: string; height: string };\n        footer: { on: boolean; width: string; height: string };\n    };\n    filters: {\n        on: boolean;\n        source: string;\n        containerId: string;\n        location: string;\n        width: string;\n        filteredRegionsStatus: number;\n        modalLocation: string;\n        hideOnMobile: boolean;\n        hide: boolean;\n        padding: string;\n        showButtonText: string;\n        clearButton: boolean;\n        clearButtonText: boolean;\n        searchButton: boolean;\n        searchButtonText: string;\n    };\n    filtersSchema?: Array<SchemaField>;\n    detailsView: {\n        location: string;\n        width: string;\n        mobileFullscreen: boolean;\n        containerId: string;\n        margin: string;\n        autoresize: boolean;\n    };\n    mobileView: {\n        [key: string]: any;\n    };\n    templates: {\n        directory: string;\n        directoryItem: string;\n        labelRegion: string;\n        popoverRegion: string;\n        popoverMarker: string;\n        tooltipRegion: string;\n        tooltipMarker: string;\n        detailsViewRegion: string;\n        detailsView: string;\n    };\n    controls: {\n        zoom: boolean;\n        zoomReset: boolean;\n        userLocation: boolean;\n        location: string;\n        previousMap: boolean;\n    };\n    actions: {\n        region: {\n            click: { [key: string]: any };\n            touch: { [key: string]: any };\n            mouseover: { [key: string]: any; showTooltip: boolean };\n            mouseout: { [key: string]: any };\n        };\n        marker: {\n            touch: { [key: string]: any };\n            click: { [key: string]: any };\n            mouseover: { [key: string]: any; showTooltip: boolean };\n            mouseout: { [key: string]: any };\n        };\n        map: {\n            afterLoad: {\n                selectRegion: boolean;\n            };\n        };\n        directoryItem: {\n            touch: { [key: string]: any };\n            click: { [key: string]: any };\n            hover: { [key: string]: any };\n            mouseout: { [key: string]: any };\n        };\n    };\n    svgFileVersion: number;\n    data_regions: any; // passed from Admin\n    data_objects: any; // passed from Admin\n    extension: any;\n    markerLastID: number;\n    previousMapsIds: Array<number | string>;\n}\n\nexport interface GroupOptionsInterface {\n    id: string;\n    title: string;\n    objects: Array<{ label: string; value: string }>;\n    visible: boolean;\n}\nexport interface GalleryOptionsInterface {\n    id: string;\n    title: string;\n    objects: Array<{ label: string; value: string }>;\n    visible: boolean;\n}\nexport interface LayersControlOptionsInterface {\n    on: boolean;\n    label: string;\n    maxHeight: string;\n    position: string;\n    expanded: boolean;\n}\nexport class ViewBox {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n    constructor(x: any, y?: number | string, width?: number | string, height?: number | string) {\n        if (typeof x === \"object\") {\n            // x as Object\n            if (\n                x.hasOwnProperty(\"x\") &&\n                x.hasOwnProperty(\"y\") &&\n                x.hasOwnProperty(\"width\") &&\n                x.hasOwnProperty(\"height\")\n            ) {\n                this.x = typeof x.x === \"string\" ? parseFloat(x.x) : x.x;\n                this.y = typeof x.y === \"string\" ? parseFloat(x.y) : x.y;\n                this.width = typeof x.width === \"string\" ? parseFloat(x.width) : x.width;\n                this.height = typeof x.height === \"string\" ? parseFloat(x.height) : x.height;\n            } else if (typeof x === \"object\" && x.length && x.length === 4) {\n                // x as Array\n                this.x = typeof x[0] === \"string\" ? parseFloat(x[0]) : x[0];\n                this.y = typeof x[1] === \"string\" ? parseFloat(x[1]) : x[1];\n                this.width = typeof x[2] === \"string\" ? parseFloat(x[2]) : x[2];\n                this.height = typeof x[3] === \"string\" ? parseFloat(x[3]) : x[3];\n            }\n        } else {\n            this.x = typeof x === \"string\" ? parseFloat(x) : x;\n            this.y = typeof y === \"string\" ? parseFloat(y) : y;\n            this.width = typeof width === \"string\" ? parseFloat(width) : width;\n            this.height = typeof height === \"string\" ? parseFloat(height) : height;\n        }\n    }\n\n    /**\n     * Updates viewbox with new numbers\n     * @param newViewBox\n     */\n    update(newViewBox: ViewBox): void {\n        this.x = newViewBox.x;\n        this.y = newViewBox.y;\n        this.width = newViewBox.width;\n        this.height = newViewBox.height;\n    }\n\n    /**\n     * Returns a string with viewBox numbers\n     */\n    toString(): string {\n        return this.x + \" \" + this.y + \" \" + this.width + \" \" + this.height;\n    }\n\n    /**\n     * Returns an array containing viewBox numbers\n     */\n    toArray(): number[] {\n        return [this.x, this.y, this.width, this.height];\n    }\n\n    clone(): ViewBox {\n        return new ViewBox({ x: this.x, y: this.y, width: this.width, height: this.height });\n    }\n\n    /**\n     * Check whether current viewBox fits inside of another viewBox\n     */\n    fitsInViewBox(viewBox: ViewBox, atLeastByOneDimension?: boolean): boolean {\n        if (atLeastByOneDimension === true) {\n            return viewBox.width > this.width || viewBox.height > this.height;\n        } else {\n            return viewBox.width > this.width && viewBox.height > this.height;\n        }\n    }\n\n    /**\n     * Adds padding to the viewBox\n     */\n    addPadding(padding: { top: number; left: number; right: number; bottom: number }): void {\n        if (padding.top) {\n            this.y -= padding.top;\n            this.height += padding.top;\n        }\n        if (padding.right) {\n            this.width += padding.right;\n        }\n        if (padding.bottom) {\n            this.height += padding.bottom;\n        }\n        if (padding.left) {\n            this.x -= padding.left;\n            this.width += padding.left;\n        }\n    }\n}\n\nexport class GeoViewBox {\n    sw: GeoPoint;\n    ne: GeoPoint;\n    constructor(sw: GeoPoint, ne: GeoPoint) {\n        this.sw = sw;\n        this.ne = ne;\n    }\n}\n","import { Events } from \"../Core/Events\";\nimport { MapSVGMap } from \"../Map/Map\";\nimport { GeoPoint, ScreenPoint, SVGPoint } from \"../Location/Location\";\nimport { ViewBox } from \"../Map/MapOptionsInterface\";\nconst $ = jQuery;\n\n/**\n * Abstract MapObject class. Extended by {@link #region|MapSVG.Region} & {@link #marker|MapSVG.Marker}\n * @abstract\n * @param {object} jQueryObject\n * @param {MapSVG.Map} mapsvg\n */\nexport class MapObject {\n    id: string;\n    objects: any[];\n    events: Events;\n    element: HTMLElement | SVGElement;\n    mapsvg: MapSVGMap;\n\n    constructor(element: HTMLElement | SVGElement | null, mapsvg: MapSVGMap) {\n        this.id = \"\";\n        this.objects = [];\n        this.events = new Events(this);\n        this.element = element;\n        //        this.elemType = element.tagName;\n        this.mapsvg = mapsvg;\n    }\n\n    /**\n     * Returns bounding box of an object in SVG coordinates\n     * @returns {*[]} - [x,y,width,height]\n     * @abstract\n     * @private\n     */\n    getBBox(): ViewBox {\n        return new ViewBox(1, 2, 3, 4);\n    }\n    /**\n     * Returns geo-bounds of an object - South-West & North-East points.\n     * @returns {{sw: (number[]), ne: (number[])}}\n     */\n    getGeoBounds(): { sw: GeoPoint; ne: GeoPoint } {\n        const bbox = this.getBBox();\n        const pointSW = new SVGPoint(bbox.x, bbox.y + bbox.height);\n        const pointNE = new SVGPoint(bbox.x + bbox.width, bbox.y);\n        const sw = this.mapsvg.converter.convertSVGToGeo(pointSW);\n        const ne = this.mapsvg.converter.convertSVGToGeo(pointNE);\n\n        return { sw: sw, ne: ne };\n    }\n    /**\n     * Returns style of a given property of an SVG object\n     * @param {string} prop - property name\n     * @param {object} elem - SVG object\n     * @returns {string} - style\n     */\n    getComputedStyle(prop: string, elem?: SVGElement | HTMLElement): string {\n        elem = elem || this.element;\n        return MapObject.getComputedStyle(prop, elem);\n    }\n\n    static getComputedStyle(prop: string, elem?: SVGElement | HTMLElement): string {\n        const _p1: string = elem.getAttribute(prop);\n        if (_p1) {\n            return _p1;\n        }\n\n        const _p2: string = elem.getAttribute(\"style\");\n        if (_p2) {\n            const s = _p2.split(\";\");\n            const z = s.filter(function (e) {\n                e = e.trim();\n                const attr = e.split(\":\");\n                if (attr[0] == prop) return true;\n            });\n            if (z.length) {\n                return z[0].split(\":\").pop().trim();\n            }\n        }\n\n        const parent = elem.parentElement;\n        const elemType = parent ? parent.tagName : null;\n\n        if (elemType && elemType != \"svg\") return MapObject.getComputedStyle(prop, parent);\n        else return undefined;\n    }\n    /**\n     * Returns style of a property of the SVG object\n     * @param {string} prop - property name\n     * @returns {string}\n     */\n    getStyle(prop: string) {\n        const _p1 = this.attr(prop);\n        if (_p1) {\n            return _p1;\n        }\n        const _p2 = this.attr(\"style\");\n        if (_p2) {\n            const s = _p2.split(\";\");\n            const z = s.filter(function (e) {\n                var e = e.trim();\n                if (e.indexOf(prop) === 0) return e;\n            });\n\n            return z.length ? z[0].split(\":\").pop().trim() : undefined;\n        }\n        return \"\";\n    }\n    /**\n     * Returns center of an object in pixel coordinates\n     * @returns {number[]} - [x,y]\n     */\n    getCenter(): ScreenPoint {\n        const x = this.element.getBoundingClientRect().left;\n        const y = this.element.getBoundingClientRect().top;\n        const w = this.element.getBoundingClientRect().width;\n        const h = this.element.getBoundingClientRect().height;\n        const point = new ScreenPoint(x + w / 2, y + h / 2);\n        return point;\n    }\n    /**\n     * Returns center of an object in SVG coordinates\n     * @returns {{x: number, y: number}}\n     */\n    getCenterSVG(): SVGPoint {\n        const bbox = this.getBBox();\n        const point = new SVGPoint(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2);\n        return point;\n    }\n    /**\n     * Returns center of an object in geo-coordinates\n     * @returns {{lat: number, lng: number}}\n     */\n    getCenterLatLng(yShift) {\n        yShift = yShift ? yShift : 0;\n        const bbox = this.getBBox();\n        const x = bbox.x + bbox.width / 2;\n        const y = bbox.y + bbox.height / 2 - yShift;\n        const point = new SVGPoint(x, y);\n        return this.mapsvg.converter.convertSVGToGeo(point);\n    }\n    /**\n     * Sets attribute of an SVG object\n     * @param {string|object} v1 - attribute name or object: {name: value, name: value}\n     * @param {string|number} v2 - value\n     * @returns {*}\n     */\n    attr(v1, v2 = null) {\n        const svgDom = this.element;\n\n        if (typeof v1 == \"object\") {\n            for (const key in v1) {\n                const item = v1[key];\n                if (typeof item === \"string\" || typeof item === \"number\") {\n                    svgDom.setAttribute(key, \"\" + item);\n                }\n            }\n        } else if (typeof v1 == \"string\" && (typeof v2 == \"string\" || typeof v2 == \"number\")) {\n            svgDom.setAttribute(v1, \"\" + v2);\n        } else if (v2 == undefined) {\n            return svgDom.getAttribute(v1);\n        }\n    }\n    /**\n     * Set ID of an object\n     * @param {string} id\n     */\n    setId(id: string) {\n        if (id !== undefined) {\n            this.id = id;\n            this.element.setAttribute(\"id\", id);\n        }\n    }\n}\n","import { MapSVG } from \"../Core/globals.js\";\nimport { MapObject } from \"../MapObject/MapObject.js\";\nimport { Location, SVGPoint, GeoPoint, ScreenPoint } from \"../Location/Location.js\";\nimport { ViewBox } from \"../Map/MapOptionsInterface.js\";\nimport { CustomObject } from \"../Object/CustomObject.js\";\nimport { type } from \"os\";\nconst $ = jQuery;\n\n/**\n * Marker class\n * @extends MapObject\n * @param params\n * @constructor\n *\n * @example\n * var location = new MapSVG.Location({\n *   lat: 55.22,\n *   lng: 64.12,\n *   img: \"/path/to/image.png\"\n *  });\n *\n * var marker = new MapSVG.Marker({\n *   location: location,\n *   mapsvg: mapsvgInstance\n * });\n *\n * // The marker is created but still not added to the map. Let's add it:\n * mapsvg.markerAdd(marker);\n *\n */\nexport class Marker extends MapObject {\n    src: string;\n    location: Location;\n    svgPoint?: SVGPoint;\n    geoPoint?: GeoPoint;\n    screenPoint?: ScreenPoint;\n    element: HTMLElement;\n    label: HTMLElement;\n    image: HTMLElement;\n    width: number;\n    height: number;\n    selected: boolean;\n    object: CustomObject;\n    centered: boolean;\n    altAttr: string;\n    private svgPointBeforeDrag: SVGPoint;\n\n    mapped?: boolean;\n    needToRemove?: boolean;\n    moving?: boolean;\n    bubble: HTMLElement;\n    bubbleMode: boolean;\n    visible: boolean;\n\n    constructor(params) {\n        super(null, params.mapsvg);\n\n        this.element = $(\"<div />\").addClass(\"mapsvg-marker\")[0];\n        this.image = $('<img src=\"\" />').addClass(\"mapsvg-marker-image\")[0];\n\n        if (params.object) {\n            this.setObject(params.object);\n        }\n\n        if (!(params.location instanceof Location)) {\n            throw new Error(\"MapSVG.Marker: no Location provided for Marker initializaton\");\n        } else {\n            this.location = params.location;\n            this.location.marker = this;\n        }\n\n        this.setImage(this.location.imagePath);\n\n        $(this.element).append(this.image);\n\n        if (params.width && params.height) {\n            this.setSize(params.width, params.height);\n        } else {\n            this.setSize(15, 24);\n        }\n\n        this.setId(this.mapsvg.markerId());\n        this.setSvgPointFromLocation();\n        this.setAltAttr();\n    }\n\n    reload() {\n        this.setImage();\n        this.setSvgPointFromLocation();\n    }\n\n    private getImagePath() {\n        return (this.object && this.object.getMarkerImage()) || this.location.getMarkerImage();\n    }\n\n    setSize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n        this.setCentered(this.width === this.height);\n    }\n\n    setSvgPointFromLocation(): void {\n        const svgPoint =\n            this.location.geoPoint &&\n            this.location.geoPoint.lat !== 0 &&\n            this.location.geoPoint.lng !== 0\n                ? this.mapsvg.converter.convertGeoToSVG(this.location.geoPoint)\n                : this.location.svgPoint;\n        if (svgPoint) {\n            this.setSvgPoint(svgPoint);\n        }\n    }\n\n    /**\n     * Set ID of the Marker\n     * @param {string} id\n     */\n    setId(id: string | number): void {\n        MapObject.prototype.setId.call(this, id);\n        this.mapsvg.markers.reindex();\n    }\n    /**\n     * Get SVG bounding box of the Marker\n     * @returns {ViewBox}\n     */\n    getBBox(): ViewBox {\n        if (this.centered) {\n            return new ViewBox(\n                this.svgPoint.x - this.width / 2 / this.mapsvg.scale,\n                this.svgPoint.y - this.height / 2 / this.mapsvg.scale,\n                this.width / this.mapsvg.scale,\n                this.height / this.mapsvg.scale\n            );\n        } else {\n            return new ViewBox(\n                this.svgPoint.x - this.width / 2 / this.mapsvg.scale,\n                this.svgPoint.y - this.height / this.mapsvg.scale,\n                this.width / this.mapsvg.scale,\n                this.height / this.mapsvg.scale\n            );\n        }\n    }\n    /**\n     * Get Marker options\n     * @returns {{id: string, src: string, svgPoint: SVGPoint, geoPoint: GeoPoint}}\n     */\n    getOptions(): { id: string; src: string; svgPoint: SVGPoint; geoPoint: GeoPoint } {\n        const o = {\n            id: this.id,\n            src: this.src,\n            svgPoint: this.svgPoint,\n            geoPoint: this.geoPoint,\n        };\n        $.each(o, function (key, val) {\n            if (val == undefined) {\n                delete o[key];\n            }\n        });\n        return o;\n    }\n    /**\n     * Update marker settings\n     * @param {object} data - Options\n     */\n    update(data): void {\n        for (const key in data) {\n            // check if there's a setter for a property\n            const setter = \"set\" + MapSVG.ucfirst(key);\n            if (setter in this) this[setter](data[key]);\n        }\n    }\n    /**\n     * Set image of the Marker\n     * @param {string} src\n     */\n    setImage(src?: string, skipChangingLocationImage = false): void {\n        if (!src) {\n            src = this.getImagePath();\n        }\n        this.src = MapSVG.safeURL(src);\n        const img = new Image();\n        const marker = this;\n        img.onload = function () {\n            if (marker.image.getAttribute(\"src\") !== \"src\") {\n                marker.image.setAttribute(\"src\", marker.src);\n            }\n            marker.setSize((<HTMLImageElement>this).width, (<HTMLImageElement>this).height);\n            marker.adjustScreenPosition();\n        };\n        img.src = this.src;\n        // if (!skipChangingLocationImage && this.location && this.location.imagePath !== src) {\n        //     this.location.setImage(src);\n        // }\n        this.events.trigger(\"change\");\n    }\n\n    /**\n     * Set 'alt' attribute of the Marker\n     */\n    setAltAttr(): void {\n        const marker = this;\n\n        marker.altAttr =\n            typeof marker.object != \"undefined\" &&\n            typeof marker.object.title != \"undefined\" &&\n            marker.object.title !== \"\"\n                ? marker.object.title\n                : marker.id;\n        marker.image.setAttribute(\"alt\", marker.altAttr);\n    }\n\n    /**\n     * Set x/y coordinates of the Marker\n     * @param {SVGPoint} svgPoint\n     */\n    setSvgPoint(svgPoint: SVGPoint): void {\n        this.svgPoint = svgPoint;\n\n        // if (this.location) {\n        //     this.location.setSvgPoint(this.svgPoint);\n        // }\n        // if (this.mapsvg.mapIsGeo) {\n        //     this.geoPoint = this.mapsvg.converter.convertSVGToGeo(this.svgPoint);\n        //     this.location.setGeoPoint(this.geoPoint);\n        // }\n\n        this.adjustScreenPosition();\n        this.events.trigger(\"change\");\n    }\n\n    /**\n     * Moves marker to a point.\n     * @private\n     * @param {Array} xy\n     */\n    /*\n    moveSvgPositionToClick = function (screen) {\n\n        var _data = this.mapsvg.getData();\n        var markerOptions = {};\n\n        xy[0] = xy[0] + _data.viewBox[0];\n        xy[1] = xy[1] + _data.viewBox[1];\n\n\n        if (_data.mapIsGeo)\n            this.geoCoords = this.mapsvg.converter.convertSVGToGeo(xy[0], xy[1]);\n\n        markerOptions.xy = xy;\n        this.update(markerOptions);\n    };\n     */\n\n    /**\n     * Adjusts position of the Marker. Called on map zoom and on map container resize.\n     */\n    adjustScreenPosition(): void {\n        const pos = this.mapsvg.converter.convertSVGToPixel(this.svgPoint);\n\n        pos.x -= this.width / 2;\n        pos.y -= !this.centered ? this.height : this.height / 2;\n\n        this.setScreenPosition(pos.x, pos.y);\n    }\n\n    /**\n     * Moves marker by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    moveSrceenPositionBy(deltaX: number, deltaY: number): void {\n        const oldPos = this.screenPoint,\n            x = oldPos.x - deltaX,\n            y = oldPos.y - deltaY;\n\n        this.setScreenPosition(x, y);\n    }\n\n    /**\n     * Set position of the marker by given numbers\n     *\n     * @param {number} x\n     * @param {number} y\n     */\n    setScreenPosition(x: number, y: number): void {\n        if (this.screenPoint instanceof ScreenPoint) {\n            this.screenPoint.x = x;\n            this.screenPoint.y = y;\n        } else {\n            this.screenPoint = new ScreenPoint(x, y);\n        }\n\n        this.updateVisibility();\n\n        if (this.visible === true) {\n            this.element.style.transform = \"translate(\" + x + \"px,\" + y + \"px)\";\n\n            this.adjustLabelScreenPosition();\n        }\n    }\n\n    /**\n     * Adjust position of marker label\n     *\n     */\n    adjustLabelScreenPosition(): void {\n        if (this.label) {\n            const markerPos = this.screenPoint,\n                x = Math.round(markerPos.x + this.width / 2 - $(this.label).outerWidth() / 2),\n                y = Math.round(markerPos.y - $(this.label).outerHeight());\n        }\n    }\n\n    /**\n     * Check if the marker is inside of the viewBox\n     *\n     * @return boolean\n     */\n    inViewBox(): boolean {\n        const x = this.screenPoint.x,\n            y = this.screenPoint.y,\n            mapFullWidth = this.mapsvg.containers.map.offsetWidth,\n            mapFullHeight = this.mapsvg.containers.map.offsetHeight;\n\n        // Marker stays visible if it's inside of the map-width/height buffer zone around the map:\n        return (\n            x - this.width / 2 < 2 * mapFullWidth &&\n            x + this.width / 2 > -mapFullWidth &&\n            y - this.height / 2 < 2 * mapFullHeight &&\n            y + this.height / 2 > -mapFullHeight\n        );\n    }\n\n    /**\n     * Set visibility of the marker\n     *\n     */\n    updateVisibility(): boolean {\n        if (this.inViewBox() === true) {\n            this.visible = true;\n\n            this.element.classList.remove(\"mapsvg-out-of-sight\");\n\n            if (this.label) {\n                this.label.classList.remove(\"mapsvg-out-of-sight\");\n            }\n        } else {\n            this.visible = false;\n\n            this.element.classList.add(\"mapsvg-out-of-sight\");\n\n            if (this.label) {\n                this.label.classList.add(\"mapsvg-out-of-sight\");\n            }\n        }\n\n        return this.visible;\n    }\n\n    isMoving(): boolean {\n        return this.moving;\n    }\n    setMoving(value: boolean) {\n        this.moving = value;\n    }\n\n    /**\n     * Marker drag event handler\n     * @private\n     * @param startCoords\n     * @param scale\n     * @param endCallback\n     * @param clickCallback\n     */\n    drag(startCoords, scale, endCallback?: () => void, clickCallback?: () => void): void {\n        const _this = this;\n        this.svgPointBeforeDrag = new SVGPoint(this.svgPoint.x, this.svgPoint.y);\n        this.setMoving(true);\n\n        $(\"body\").on(\"mousemove.drag.mapsvg\", function (e) {\n            e.preventDefault();\n            $(_this.mapsvg.containers.map).addClass(\"no-transitions\");\n            //$('body').css('cursor','move');\n            const mouseNew = MapSVG.mouseCoords(e);\n            const dx = mouseNew.x - startCoords.x;\n            const dy = mouseNew.y - startCoords.y;\n            const newSvgPoint = new SVGPoint(\n                _this.svgPointBeforeDrag.x + dx / scale,\n                _this.svgPointBeforeDrag.y + dy / scale\n            );\n            _this.setSvgPoint(newSvgPoint);\n        });\n        $(\"body\").on(\"mouseup.drag.mapsvg\", function (e) {\n            e.preventDefault();\n            _this.undrag();\n            const mouseNew = MapSVG.mouseCoords(e);\n            const dx = mouseNew.x - startCoords.x;\n            const dy = mouseNew.y - startCoords.y;\n            const newSvgPoint = new SVGPoint(\n                _this.svgPointBeforeDrag.x + dx / scale,\n                _this.svgPointBeforeDrag.y + dy / scale\n            );\n\n            _this.setSvgPoint(newSvgPoint);\n\n            if (_this.mapsvg.isGeo()) {\n                // var svgPoint = new SVGPoint(_this.x + _this.width / 2, this.y + (this.height-1));\n                _this.geoPoint = _this.mapsvg.converter.convertSVGToGeo(newSvgPoint);\n            }\n\n            endCallback && endCallback.call(_this);\n            if (\n                _this.svgPointBeforeDrag.x == _this.svgPoint.x &&\n                _this.svgPointBeforeDrag.y == _this.svgPoint.y\n            )\n                clickCallback && clickCallback.call(_this);\n        });\n    }\n    /**\n     * Marker undrag event handler\n     * @private\n     */\n    undrag(): void {\n        //$(this.element).closest('svg').css('pointer-events','auto');\n        //$('body').css('cursor','default');\n        this.setMoving(false);\n        $(\"body\").off(\".drag.mapsvg\");\n        $(this.mapsvg.containers.map).removeClass(\"no-transitions\");\n    }\n    /**\n     * Deletes the Marker\n     */\n    delete(): void {\n        if (this.label) {\n            this.label.remove();\n            this.label = null;\n        }\n        $(this.element).empty().remove();\n    }\n    /**\n     * Sets parent DB object of the Marker\n     * @param {object} obj\n     */\n    setObject(obj: CustomObject): void {\n        this.object = obj;\n        $(this.element).attr(\"data-object-id\", this.object.id);\n    }\n    /**\n     * Hides the Marker\n     */\n    hide(): void {\n        $(this.element).addClass(\"mapsvg-marker-hidden\");\n        if (this.label) {\n            $(this.label).hide();\n        }\n    }\n    /**\n     * Shows the Marker\n     */\n    show(): void {\n        $(this.element).removeClass(\"mapsvg-marker-hidden\");\n        if (this.label) {\n            $(this.label).show();\n        }\n    }\n\n    /**\n     * Highlight the Marker.\n     * Used on mouseover.\n     */\n    highlight(): void {\n        $(this.element).addClass(\"mapsvg-marker-hover\");\n    }\n    /**\n     * Unhighlight the Marker.\n     * Used on mouseout.\n     */\n    unhighlight(): void {\n        $(this.element).removeClass(\"mapsvg-marker-hover\");\n    }\n    /**\n     * Select the Marker.\n     */\n    select(): void {\n        this.selected = true;\n        $(this.element).addClass(\"mapsvg-marker-active\");\n    }\n    /**\n     * Deselect the Marker.\n     */\n    deselect(): void {\n        this.selected = false;\n        $(this.element).removeClass(\"mapsvg-marker-active\");\n    }\n\n    getData(): CustomObject {\n        return this.object;\n    }\n\n    /**\n     * Returns color of the choropleth marker bubble\n     * @returns {string} color\n     */\n    getChoroplethColor(): string {\n        const markerValue = parseFloat(this.object[this.mapsvg.options.choropleth.sourceField]);\n        let color;\n\n        if (!markerValue) {\n            color = this.mapsvg.options.choropleth.coloring.noData.color;\n        } else if (this.mapsvg.options.choropleth.coloring.mode === \"gradient\") {\n            // Gradient mode\n            const gradient = this.mapsvg.options.choropleth.coloring.gradient,\n                w =\n                    gradient.values.maxAdjusted === 0\n                        ? 0\n                        : (markerValue - gradient.values.min) / gradient.values.maxAdjusted,\n                r = Math.round(gradient.colors.diffRGB.r * w + gradient.colors.lowRGB.r),\n                g = Math.round(gradient.colors.diffRGB.g * w + gradient.colors.lowRGB.g),\n                b = Math.round(gradient.colors.diffRGB.b * w + gradient.colors.lowRGB.b),\n                a = (gradient.colors.diffRGB.a * w + gradient.colors.lowRGB.a).toFixed(2);\n\n            color = \"rgba(\" + r + \",\" + g + \",\" + b + \",\" + a + \")\";\n        } else {\n            // Palette mode\n            const paletteColors = this.mapsvg.options.choropleth.coloring.palette.colors;\n\n            if (!paletteColors[0].valueFrom && markerValue < paletteColors[0].valueTo) {\n                color = paletteColors[0].color;\n            } else if (\n                !paletteColors[paletteColors.length - 1].valueTo &&\n                markerValue > paletteColors[paletteColors.length - 1].valueFrom\n            ) {\n                color = paletteColors[paletteColors.length - 1].color;\n            } else {\n                paletteColors.forEach(function (paletteColor) {\n                    if (\n                        markerValue >= paletteColor.valueFrom &&\n                        markerValue < paletteColor.valueTo\n                    ) {\n                        color = paletteColor.color;\n                    }\n                });\n\n                color = color\n                    ? color\n                    : this.mapsvg.options.choropleth.coloring.palette.outOfRange.color;\n            }\n        }\n\n        return color;\n    }\n\n    /**\n     * Returns size of the choropleth bubble\n     */\n    getBubbleSize(): number {\n        let bubbleSize;\n\n        if (this.object[this.mapsvg.options.choropleth.sourceField]) {\n            const maxBubbleSize = Number(this.mapsvg.options.choropleth.bubbleSize.max),\n                minBubbleSize = Number(this.mapsvg.options.choropleth.bubbleSize.min),\n                maxSourceFieldvalue = this.mapsvg.options.choropleth.coloring.gradient.values.max,\n                minSourceFieldvalue = this.mapsvg.options.choropleth.coloring.gradient.values.min,\n                sourceFieldvalue = parseFloat(\n                    this.object[this.mapsvg.options.choropleth.sourceField]\n                );\n\n            bubbleSize =\n                ((sourceFieldvalue - minSourceFieldvalue) /\n                    (maxSourceFieldvalue - minSourceFieldvalue)) *\n                    (maxBubbleSize - minBubbleSize) +\n                Number(minBubbleSize);\n        } else {\n            bubbleSize = false;\n        }\n\n        return bubbleSize;\n    }\n\n    /**\n     * Returns screen point of the choropleth bubble\n     */\n    getBubbleScreenPosition(): { x: number; y: number } {\n        const bubbleSize = Number(this.getBubbleSize());\n\n        return {\n            x: this.width / 2 - bubbleSize / 2,\n            y: this.height - bubbleSize / 2,\n        };\n    }\n\n    /**\n     * Draw a choropleth bubble for the marker\n     */\n    drawBubble(): void {\n        const bubbleId = \"mapsvg-bubble-\" + this.object.id;\n        const bubbleValue = parseFloat(this.object[this.mapsvg.options.choropleth.sourceField]);\n        if (bubbleValue) {\n            if (!this.bubble) {\n                this.bubble = $(\n                    '<div id=\"' +\n                        bubbleId +\n                        '\" data-marker-id=\"' +\n                        this.element.id +\n                        '\" class=\"mapsvg-bubble mapsvg-marker-bubble\"></div>'\n                )[0];\n                $(this.element).append(this.bubble);\n            }\n            const color = this.getChoroplethColor(),\n                bubbleSize = Number(this.getBubbleSize());\n\n            $(this.bubble)\n                .css(\"background-color\", color)\n                .css(\"width\", bubbleSize + \"px\")\n                .css(\"height\", bubbleSize + \"px\")\n                .css(\"lineHeight\", bubbleSize - 2 + \"px\");\n        } else {\n            $(\"#\" + bubbleId).remove();\n            delete this.bubble;\n        }\n    }\n\n    /**\n     * Disable/enable BubbleMode for the marker\n     *\n     * @param {boolean} bubbleMode\n     */\n    setBubbleMode(bubbleMode: boolean): void {\n        this.bubbleMode = bubbleMode;\n\n        if (bubbleMode) {\n            this.setCentered(true);\n            this.drawBubble();\n            if (this.bubble) {\n                this.width = this.bubble.offsetWidth;\n                this.height = this.bubble.offsetHeight;\n                this.adjustScreenPosition();\n            }\n        } else {\n            this.setImage(this.src);\n        }\n    }\n\n    setLabel(html: string): void {\n        if (html) {\n            if (!this.label) {\n                this.label = $(\"<div />\").addClass(\"mapsvg-marker-label\")[0];\n                $(this.element).append(this.label);\n            }\n            $(this.label).html(html);\n        } else {\n            if (this.label) {\n                $(this.label).remove();\n                delete this.label;\n            }\n        }\n    }\n\n    /**\n     * Set centered propperty of the marker\n     *\n     * @param {boolean} on\n     */\n    setCentered(on: boolean): void {\n        this.centered = on;\n    }\n}\n","/**\n * Cluster class. Groups markers into a clickable circle with a number indicating how many markers it contains.\n * @param options\n * @constructor\n * @extends MapObject\n */\nimport { MapSVGMap } from \"../Map/Map.js\";\nimport { MapObject } from \"../MapObject/MapObject.js\";\nimport { Marker } from \"../Marker/Marker.js\";\nimport { ViewBox } from \"../Map/MapOptionsInterface\";\nimport { ScreenPoint, SVGPoint } from \"../Location/Location\";\n\nconst $ = jQuery;\n\nexport class MarkerCluster extends MapObject {\n    // extends MapObject\n    mapsvg: MapSVGMap;\n    svgPoint: SVGPoint;\n    screenPoint: ScreenPoint;\n    min_x: number;\n    min_y: number;\n    max_x: number;\n    max_y: number;\n    cellX: number;\n    cellY: number;\n    markers: Array<Marker>;\n    cellSize: number;\n    width: number;\n    elem: HTMLElement;\n    visible: boolean;\n\n    constructor(\n        options: {\n            svgPoint: SVGPoint;\n            cellX: number;\n            cellY: number;\n            markers: Array<Marker>;\n            width?: number;\n            cellSize?: number;\n        },\n        mapsvg: MapSVGMap\n    ) {\n        super(null, mapsvg);\n\n        this.svgPoint = options.svgPoint;\n        this.cellX = options.cellX; // SVG-x (not pixel-x)\n        this.cellY = options.cellY; // SVG-y (not pixel-y)\n        this.markers = options.markers || [];\n\n        this.cellSize = 50;\n        this.width = 30;\n\n        const _this = this;\n\n        this.elem = $('<div class=\"mapsvg-marker-cluster\">' + this.markers.length + \"</div>\")[0];\n        $(this.elem).data(\"cluster\", this);\n\n        if (this.markers.length < 2) {\n            $(this.elem).hide(); // don't show cluster at the start\n        }\n\n        this.adjustScreenPosition();\n    }\n\n    /**\n     * Adds marker to the cluster.\n     * @param {Marker} marker\n     */\n    addMarker(marker: Marker) {\n        this.markers.push(marker);\n        if (this.markers.length > 1) {\n            if (this.markers.length === 2) {\n                // this.markers[0].clusterize();\n                $(this.elem).show();\n            }\n            if (this.markers.length === 2) {\n                const x = this.markers.map(function (m) {\n                    return m.svgPoint.x;\n                });\n                this.min_x = Math.min.apply(null, x);\n                this.max_x = Math.max.apply(null, x);\n\n                const y = this.markers.map(function (m) {\n                    return m.svgPoint.y;\n                });\n                this.min_y = Math.min.apply(null, y);\n                this.max_y = Math.max.apply(null, y);\n\n                this.svgPoint.x = this.min_x + (this.max_x - this.min_x) / 2;\n                this.svgPoint.y = this.min_y + (this.max_y - this.min_y) / 2;\n            }\n            if (this.markers.length > 2) {\n                if (marker.svgPoint.x < this.min_x) {\n                    this.min_x = marker.svgPoint.x;\n                } else if (marker.svgPoint.x > this.max_x) {\n                    this.max_x = marker.svgPoint.x;\n                }\n                if (marker.svgPoint.y < this.min_y) {\n                    this.min_y = marker.svgPoint.y;\n                } else if (marker.svgPoint.x > this.max_x) {\n                    this.max_y = marker.svgPoint.y;\n                }\n                this.svgPoint.x = this.min_x + (this.max_x - this.min_x) / 2;\n                this.svgPoint.y = this.min_y + (this.max_y - this.min_y) / 2;\n            }\n            // marker.clusterize();\n        } else {\n            this.svgPoint.x = marker.svgPoint.x;\n            this.svgPoint.y = marker.svgPoint.y;\n        }\n\n        $(this.elem).text(this.markers.length);\n        this.adjustScreenPosition();\n    }\n\n    /**\n     * Checks if provided marker should be added into this cluster.\n     * @param {MapSVG.Marker} marker\n     * @returns {boolean}\n     */\n    canTakeMarker(marker: Marker): boolean {\n        const _this = this;\n\n        const screenPoint = _this.mapsvg.converter.convertSVGToPixel(marker.svgPoint);\n\n        return (\n            this.cellX === Math.ceil(screenPoint.x / this.cellSize) &&\n            this.cellY === Math.ceil(screenPoint.y / this.cellSize)\n        );\n    }\n\n    /**\n     * Destroys the cluster\n     */\n    destroy() {\n        // this.markers.forEach(function(marker){\n        //     marker.unclusterize();\n        // });\n        this.markers = null;\n        $(this.elem).remove();\n    }\n\n    /**\n     * Adjusts position of the cluster.\n     * Called on zoom and map container resize.\n     */\n    adjustScreenPosition() {\n        const pos = this.mapsvg.converter.convertSVGToPixel(this.svgPoint);\n\n        pos.x -= this.width / 2;\n        pos.y -= this.width / 2;\n\n        this.setScreenPosition(pos.x, pos.y);\n    }\n\n    /**\n     * Moves cluster by given numbers.\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    moveSrceenPositionBy(deltaX, deltaY) {\n        const oldPos = this.screenPoint,\n            x = oldPos.x - deltaX,\n            y = oldPos.y - deltaY;\n\n        this.setScreenPosition(x, y);\n    }\n\n    /**\n     * Set cluster position.\n     *\n     * @param {number} x\n     * @param {number} y\n     */\n    setScreenPosition(x, y) {\n        if (this.screenPoint instanceof ScreenPoint) {\n            this.screenPoint.x = x;\n            this.screenPoint.y = y;\n        } else {\n            this.screenPoint = new ScreenPoint(x, y);\n        }\n\n        this.updateVisibility();\n\n        if (this.visible === true) {\n            this.elem.style.transform = \"translate(\" + x + \"px,\" + y + \"px)\";\n        }\n    }\n\n    /**\n     * Check if the cluster is inside of the viewBox\n     *\n     * @return boolean\n     */\n    inViewBox() {\n        const x = this.screenPoint.x,\n            y = this.screenPoint.y,\n            mapFullWidth = this.mapsvg.containers.map.offsetWidth,\n            mapFullHeight = this.mapsvg.containers.map.offsetHeight;\n\n        return (\n            x - this.width / 2 < mapFullWidth &&\n            x + this.width / 2 > 0 &&\n            y - this.width / 2 < mapFullHeight &&\n            y + this.width / 2 > 0\n        );\n    }\n\n    /**\n     * Set visibility of the marker\n     *\n     */\n    updateVisibility() {\n        if (this.inViewBox() === true) {\n            this.visible = true;\n\n            this.elem.classList.remove(\"mapsvg-out-of-sight\");\n        } else {\n            this.visible = false;\n\n            this.elem.classList.add(\"mapsvg-out-of-sight\");\n        }\n\n        return this.visible;\n    }\n\n    /**\n     * Get SVG bounding box of the MarkersCluster\n     * @returns {*[]} - [x,y,width,height]\n     */\n    getBBox(): ViewBox {\n        let bbox = {\n            x: this.svgPoint.x,\n            y: this.svgPoint.y,\n            width: this.cellSize / this.mapsvg.getScale(),\n            height: this.cellSize / this.mapsvg.getScale(),\n        };\n        bbox = $.extend(true, {}, bbox);\n\n        return new ViewBox(bbox.x, bbox.y, bbox.width, bbox.height);\n    }\n\n    getData() {\n        return this.markers.map((m) => m.object);\n    }\n}\n","import { MapSVGMap } from \"../Map/Map.js\";\nimport { MapSVG } from \"../Core/globals.js\";\nimport { tinycolor } from \"../Vendor/tinycolor.js\";\nimport { MapObject } from \"../MapObject/MapObject.js\";\nimport { ViewBox } from \"../Map/MapOptionsInterface.js\";\nimport { SVGPoint } from \"../Location/Location.js\";\nimport { CustomObject } from \"../Object/CustomObject\";\nimport { ArrayIndexed } from \"../Core/ArrayIndexed\";\nimport { transform } from \"@babel/core\";\nconst $ = jQuery;\n\n/**\n * Region class. Contains a reference to an SVG element.\n * @extends MapObject\n * @param {element} SVGElement\n * @param {string} regionID - Region ID\n * @param {Map} mapsvg - MapSVG instance\n */\nexport class Region extends MapObject {\n    id: string;\n    title?: string;\n    id_no_spaces: string;\n    disabled: boolean;\n    selected: boolean;\n    status: number;\n    default_attr: any;\n    selected_attr: any;\n    hover_attr: any;\n    initialState: string;\n    elemOriginal: SVGGraphicsElement;\n    elem: SVGGraphicsElement;\n    style: {\n        fill?: string;\n        stroke?: string;\n        \"stroke-width\"?: number;\n        [key: string]: string | number;\n    };\n    choroplethValue: number;\n    customAttrs: Array<string>;\n    fill?: string;\n    center?: SVGPoint;\n    label: HTMLElement;\n    bubble: HTMLElement;\n    data: CustomObject;\n\n    gaugeValue: number;\n\n    constructor(element: SVGElement, mapsvg: MapSVGMap) {\n        super(element, mapsvg);\n        this.id = this.element.getAttribute(\"id\");\n        if (this.id && this.mapsvg.options.regionPrefix) {\n            this.setId(this.id.replace(this.mapsvg.options.regionPrefix, \"\"));\n        }\n\n        this.id_no_spaces = this.id.replace(/\\s/g, \"_\");\n\n        this.element.setAttribute(\"class\", (this.element.className || \"\") + \" mapsvg-region\");\n\n        this.setStyleInitial();\n\n        const regionOptions =\n            this.mapsvg.options.regions && this.mapsvg.options.regions[this.id]\n                ? this.mapsvg.options.regions[this.id]\n                : null;\n\n        this.disabled = this.getDisabledState();\n        this.disabled && this.attr(\"class\", this.attr(\"class\") + \" mapsvg-disabled\");\n\n        this.default_attr = {};\n        this.selected_attr = {};\n        this.hover_attr = {};\n        let selected = false;\n        if (regionOptions && regionOptions.selected) {\n            selected = true;\n            delete regionOptions.selected;\n        }\n        regionOptions && this.update(regionOptions);\n        this.setFill();\n        if (selected) {\n            this.setSelected();\n        }\n        this.saveState();\n    }\n\n    adjustStroke(scale: number): void {\n        $(this.element).css({ \"stroke-width\": this.style[\"stroke-width\"] / scale });\n    }\n\n    /**\n     * Sets initial style of a Region, computed from SVG\n     * @private\n     */\n    setStyleInitial(): void {\n        this.style = { fill: this.getComputedStyle(\"fill\") };\n        this.style.stroke = this.getComputedStyle(\"stroke\") || \"\";\n        let w;\n        w = this.getComputedStyle(\"stroke-width\");\n        w = w ? w.replace(\"px\", \"\") : \"1\";\n        w = parseFloat(w);\n        this.style[\"stroke-width\"] = w;\n        $(this.element).attr(\"data-stroke-width\", w);\n    }\n    /**\n     * Save state of a Region (all parameters)\n     * @private\n     */\n    saveState(): void {\n        this.initialState = JSON.stringify(this.getOptions());\n    }\n    /**\n     * Returns SVG bounding box of the Region\n     * @returns {[number,number,number,number]} - [x,y,width,height]\n     */\n    getBBox(): ViewBox {\n        // @ts-ignore\n        const _bbox = this.element.getBBox();\n        const bbox = new ViewBox(_bbox.x, _bbox.y, _bbox.width, _bbox.height);\n\n        // @ts-ignore (TS doesn't recognize getTransformToElement() method from SVGGraphicsElement)\n        const matrix = this.element.getTransformToElement(this.mapsvg.containers.svg);\n        if (!matrix) {\n            return _bbox;\n        }\n\n        const x2 = bbox.x + bbox.width;\n        const y2 = bbox.y + bbox.height;\n\n        // transform a point using the transformed matrix\n        let position = this.mapsvg.containers.svg.createSVGPoint();\n        position.x = bbox.x;\n        position.y = bbox.y;\n        position = position.matrixTransform(matrix);\n        bbox.x = position.x;\n        bbox.y = position.y;\n        // var position = this.mapsvg.containers.svg.createSVGPoint();\n        position.x = x2;\n        position.y = y2;\n        position = position.matrixTransform(matrix);\n        bbox.width = position.x - bbox.x;\n        bbox.height = position.y - bbox.y;\n\n        return bbox;\n    }\n    /**\n     * Checks whether the Region was changed from the initial state\n     * @returns {boolean}\n     * @private\n     */\n    changed(): boolean {\n        return JSON.stringify(this.getOptions()) != this.initialState;\n    }\n    /**\n     * Saves a copy of the Region SVG elem.\n     * Used in Map Editor by \"Edit SVG file\" mode.\n     * @private\n     */\n    edit(): void {\n        this.elemOriginal = <SVGGraphicsElement>$(this.element).clone()[0];\n    }\n    /**\n     * Deletes the copy of the Region SVG elem created by .edit() method.\n     * Used in Map Editor by \"Edit SVG file\" mode.\n     * @private\n     */\n    editCommit(): void {\n        this.elemOriginal = null;\n    }\n    /**\n     * Restores SVG elem.\n     * Used in Map Editor by \"Edit SVG file\" mode.\n     * @private\n     */\n    editCancel(): void {\n        this.mapsvg.containers.svg.appendChild(this.elemOriginal);\n        this.element = this.elemOriginal;\n        this.elemOriginal = null;\n    }\n    /**\n     * Returns Region properties\n     * @param {boolean} forTemplate - adds special properties for use in a template\n     * @returns {object}\n     */\n    getOptions(forTemplate?: boolean): { [key: string]: any } {\n        let o: any;\n        o = {\n            id: this.id,\n            id_no_spaces: this.id_no_spaces,\n            title: this.title,\n            fill: this.mapsvg.options.regions[this.id] && this.mapsvg.options.regions[this.id].fill,\n            data: this.data,\n            choroplethValue: this.choroplethValue,\n        };\n        if (forTemplate) {\n            o.disabled = this.disabled;\n        }\n        for (const key in o) {\n            if (typeof o[key] === \"undefined\") {\n                delete o[key];\n            }\n        }\n        if (this.customAttrs) {\n            const that = this;\n            this.customAttrs.forEach(function (attr) {\n                o[attr] = that[attr];\n            });\n        }\n        return o;\n    }\n    /**\n     * Returns an object with properties of the Region formatted for a template\n     * @returns {object}\n     */\n    forTemplate(): any {\n        const data = {\n            id: this.id,\n            title: this.title,\n            objects: this.objects,\n            data: this.data,\n        };\n        if (this.data) {\n            for (const key in this.data) {\n                if (key != \"title\" && key != \"id\") data[key] = this.data[key];\n            }\n        }\n\n        return data;\n    }\n    getData(): any {\n        return this.forTemplate();\n    }\n    /**\n     * Updates the Region\n     * @param {object} options\n     *\n     * @example\n     * var region = mapsvg.getRegion(\"US-TX\");\n     * region.update({\n     *   fill: \"#FF3322\"\n     * });\n     */\n    update(options): void {\n        for (const key in options) {\n            // check if there's a setter for a property\n            const setter = \"set\" + MapSVG.ucfirst(key);\n            if (setter in this) this[setter](options[key]);\n            else {\n                this[key] = options[key];\n                this.customAttrs = this.customAttrs || [];\n                this.customAttrs.push(key);\n            }\n        }\n    }\n    /**\n     * Sets Title of the Region\n     * @param {string} title\n     */\n    setTitle(title?: string): void {\n        if (title) {\n            this.title = title;\n        }\n\n        this.element.setAttribute(\"title\", this.title);\n    }\n\n    /**\n     * Sets CSS style of the Region\n     * @param {object} style - CSS-format styles\n     * @private\n     */\n    setStyle(style: any): void {\n        $.extend(true, this.style, style);\n        this.setFill();\n    }\n\n    /**\n     * Returns color of the Region for choropleth map\n     * @returns {string} color\n     */\n    getChoroplethColor() {\n        const o = this.mapsvg.options.choropleth;\n        let color = \"\";\n\n        if (\n            this.data &&\n            (this.data[this.mapsvg.options.regionChoroplethField] ||\n                this.data[this.mapsvg.options.regionChoroplethField] === 0)\n        ) {\n            const w =\n                o.maxAdjusted === 0\n                    ? 0\n                    : (parseFloat(this.data[this.mapsvg.options.regionChoroplethField]) - o.min) /\n                      o.maxAdjusted;\n\n            const c = {\n                r: Math.round(o.colors.diffRGB.r * w + o.colors.lowRGB.r),\n                g: Math.round(o.colors.diffRGB.g * w + o.colors.lowRGB.g),\n                b: Math.round(o.colors.diffRGB.b * w + o.colors.lowRGB.b),\n                a: (o.colors.diffRGB.a * w + o.colors.lowRGB.a).toFixed(2),\n            };\n            color = \"rgba(\" + c.r + \",\" + c.g + \",\" + c.b + \",\" + c.a + \")\";\n        } else {\n            color = o.colors.noData;\n        }\n\n        return color;\n    }\n\n    _new_getChoroplethColor() {\n        let regionValue = parseFloat(this.data[this.mapsvg.options.choropleth.sourceField]),\n            color;\n\n        if (!regionValue) {\n            color = this.mapsvg.options.choropleth.coloring.noData.color;\n        } else if (this.mapsvg.options.choropleth.coloring.mode === \"gradient\") {\n            // Gradient mode\n            const gradient = this.mapsvg.options.choropleth.coloring.gradient,\n                w =\n                    gradient.values.maxAdjusted === 0\n                        ? 0\n                        : (regionValue - gradient.values.min) / gradient.values.maxAdjusted,\n                r = Math.round(gradient.colors.diffRGB.r * w + gradient.colors.lowRGB.r),\n                g = Math.round(gradient.colors.diffRGB.g * w + gradient.colors.lowRGB.g),\n                b = Math.round(gradient.colors.diffRGB.b * w + gradient.colors.lowRGB.b),\n                a = (gradient.colors.diffRGB.a * w + gradient.colors.lowRGB.a).toFixed(2);\n\n            color = \"rgba(\" + r + \",\" + g + \",\" + b + \",\" + a + \")\";\n        } else {\n            // Palette mode\n            const paletteColors = this.mapsvg.options.choropleth.coloring.palette.colors;\n\n            if (!paletteColors[0].valueFrom && regionValue < paletteColors[0].valueTo) {\n                color = paletteColors[0].color;\n            } else if (\n                !paletteColors[paletteColors.length - 1].valueTo &&\n                regionValue > paletteColors[paletteColors.length - 1].valueFrom\n            ) {\n                color = paletteColors[paletteColors.length - 1].color;\n            } else {\n                paletteColors.forEach(function (paletteColor) {\n                    if (\n                        regionValue >= paletteColor.valueFrom &&\n                        regionValue < paletteColor.valueTo\n                    ) {\n                        color = paletteColor.color;\n                    }\n                });\n\n                color = color\n                    ? color\n                    : this.mapsvg.options.choropleth.coloring.palette.outOfRange.color;\n            }\n        }\n\n        return color;\n    }\n\n    /**\n     * Returns size of the choropleth bubble\n     */\n    getBubbleSize() {\n        let bubbleSize;\n\n        if (this.data[this.mapsvg.options.choropleth.sourceField]) {\n            const maxBubbleSize = Number(this.mapsvg.options.choropleth.bubbleSize.max),\n                minBubbleSize = Number(this.mapsvg.options.choropleth.bubbleSize.min),\n                maxSourceFieldvalue = this.mapsvg.options.choropleth.coloring.gradient.values.max,\n                minSourceFieldvalue = this.mapsvg.options.choropleth.coloring.gradient.values.min,\n                sourceFieldvalue = parseFloat(\n                    this.data[this.mapsvg.options.choropleth.sourceField]\n                );\n\n            bubbleSize =\n                ((sourceFieldvalue - minSourceFieldvalue) /\n                    (maxSourceFieldvalue - minSourceFieldvalue)) *\n                    (maxBubbleSize - minBubbleSize) +\n                minBubbleSize;\n        } else {\n            bubbleSize = false;\n        }\n\n        return bubbleSize;\n    }\n    /**\n     * Sets fill color of the Region\n     * @param {string} fill - color in a CSS format\n     * @example\n     * region.setFill(\"#FF2233\");\n     * region.setFill(\"rgba(255,255,100,0.5\");\n     */\n    setFill(fill?: string) {\n        if (this.mapsvg.options.colorsIgnore) {\n            $(this.element).css(this.style);\n            return;\n        }\n\n        if (fill) {\n            const regions = {};\n            regions[this.id] = { fill: fill };\n            $.extend(true, this.mapsvg.options, { regions: regions });\n        } else if (\n            !fill &&\n            fill !== undefined &&\n            this.mapsvg.options.regions &&\n            this.mapsvg.options.regions[this.id] &&\n            this.mapsvg.options.regions[this.id].fill\n        ) {\n            delete this.mapsvg.options.regions[this.id].fill;\n        }\n\n        // Priority: choropleth > status > options.fill > disabled > base > svg\n        if (\n            this.mapsvg.options.choropleth.on\n            // TODO: choropleth new\n            // &&\n            // this.mapsvg.options.choropleth.source === \"regions\" &&\n            // this.mapsvg.options.choropleth.sourceField &&\n            // this.mapsvg.options.choropleth.bubbleMode === false &&\n            // this.data &&\n            // typeof this.data[this.mapsvg.options.choropleth.sourceField] !== \"undefined\"\n        ) {\n            this.default_attr[\"fill\"] = this.getChoroplethColor();\n        } else if (\n            this.status !== undefined &&\n            this.mapsvg.regions &&\n            this.mapsvg.regionsRepository.getSchema().getFieldByType(\"status\") &&\n            this.mapsvg.regionsRepository.getSchema().getFieldByType(\"status\").optionsDict &&\n            this.mapsvg.regionsRepository.getSchema().getFieldByType(\"status\").optionsDict[\n                this.status\n            ] &&\n            this.mapsvg.regionsRepository.getSchema().getFieldByType(\"status\").optionsDict[\n                this.status\n            ].color\n        ) {\n            this.default_attr[\"fill\"] = this.mapsvg.regionsRepository\n                .getSchema()\n                .getFieldByType(\"status\").optionsDict[this.status].color;\n        } else if (\n            this.mapsvg.options.regions[this.id] &&\n            this.mapsvg.options.regions[this.id].fill\n        ) {\n            this.default_attr[\"fill\"] = this.mapsvg.options.regions[this.id].fill;\n\n            // }else if(this.disabled && this.mapsvg.options.colors.disabled){\n            //     this.default_attr['fill'] = this.mapsvg.options.colors.disabled;\n        } else if (this.mapsvg.options.colors.base) {\n            this.default_attr[\"fill\"] = this.mapsvg.options.colors.base;\n        } else if (this.style.fill != \"none\") {\n            this.default_attr[\"fill\"] = this.style.fill\n                ? this.style.fill\n                : this.mapsvg.options.colors.baseDefault;\n        } else {\n            this.default_attr[\"fill\"] = \"none\";\n        }\n\n        if (MapSVG.isNumber(this.mapsvg.options.colors.selected))\n            this.selected_attr[\"fill\"] = tinycolor(this.default_attr.fill)\n                .lighten(parseFloat(\"\" + this.mapsvg.options.colors.selected))\n                .toRgbString();\n        else this.selected_attr[\"fill\"] = this.mapsvg.options.colors.selected;\n\n        if (MapSVG.isNumber(this.mapsvg.options.colors.hover))\n            this.hover_attr[\"fill\"] = tinycolor(this.default_attr.fill)\n                .lighten(parseFloat(\"\" + this.mapsvg.options.colors.hover))\n                .toRgbString();\n        else this.hover_attr[\"fill\"] = this.mapsvg.options.colors.hover;\n\n        $(this.element).css(\"fill\", this.default_attr[\"fill\"]);\n        this.fill = this.default_attr[\"fill\"];\n\n        if (this.style.stroke != \"none\" && this.mapsvg.options.colors.stroke != undefined) {\n            $(this.element).css(\"stroke\", this.mapsvg.options.colors.stroke);\n        } else {\n            const s = this.style.stroke == undefined ? \"\" : this.style.stroke;\n            $(this.element).css(\"stroke\", s);\n        }\n\n        if (this.selected) this.setSelected();\n    }\n    /**\n     * Disables the Region.\n     * @param {boolean} on - true/false = disable/enable\n     * @param {boolean} skipSetFill - If false, color of the Region will not be changed\n     */\n    setDisabled(on?: boolean, skipSetFill?: boolean) {\n        on = on !== undefined ? MapSVG.parseBoolean(on) : this.getDisabledState(); // get default disabled state if undefined\n        const prevDisabled = this.disabled;\n        this.disabled = on;\n        this.attr(\"class\", this.attr(\"class\").replace(\"mapsvg-disabled\", \"\"));\n        if (on) {\n            this.attr(\"class\", this.attr(\"class\") + \" mapsvg-disabled\");\n        }\n        if (this.disabled != prevDisabled) this.mapsvg.deselectRegion(this);\n        !skipSetFill && this.setFill();\n    }\n    /**\n     * Sets status of the Region.\n     * Takes the list of statuses from global MapSVG options.\n     * @param {number} status\n     */\n    setStatus(status: number) {\n        const statusOptions =\n            this.mapsvg.options.regionStatuses && this.mapsvg.options.regionStatuses[status];\n        if (statusOptions) {\n            this.status = status;\n            if (this.data) {\n                this.data.status = status;\n                this.data.status_text = statusOptions.label;\n            }\n            this.setDisabled(statusOptions.disabled, true);\n        } else {\n            this.status = undefined;\n            if (this.data) {\n                this.data.status = undefined;\n                this.data.status_text = undefined;\n            }\n            this.setDisabled(false, true);\n        }\n        this.setFill();\n    }\n    /**\n     * Selects the Region.\n     */\n    setSelected() {\n        this.mapsvg.selectRegion(this);\n    }\n    /**\n     * Set Region choropleth value. Used to calculate color of the Region.\n     * @param {number} val\n     */\n    setchoroplethValue(val: number) {\n        if ($.isNumeric(val)) {\n            if (typeof val === \"string\") {\n                val = parseFloat(val);\n            }\n            this.choroplethValue = val;\n        } else {\n            this.choroplethValue = undefined;\n        }\n    }\n    /**\n     * Checks if Region should be disabled\n     * @param {boolean} asDefault\n     * @returns {boolean}\n     */\n    getDisabledState(asDefault?: boolean): boolean {\n        const opts = this.mapsvg.options.regions[this.id];\n        if (!asDefault && opts && opts.disabled !== undefined) {\n            return opts.disabled;\n        } else {\n            return (\n                this.mapsvg.options.disableAll ||\n                this.style.fill === \"none\" ||\n                this.id == \"labels\" ||\n                this.id == \"Labels\"\n            );\n        }\n    }\n    /**\n     * Highlight the Region.\n     * Used on mouseover.\n     */\n    highlight() {\n        $(this.element).css({ fill: this.hover_attr.fill });\n        $(this.element).addClass(\"mapsvg-region-hover\");\n    }\n    /**\n     * Unhighlight the Region.\n     * Used on mouseout.\n     */\n    unhighlight() {\n        $(this.element).css({ fill: this.default_attr.fill });\n        $(this.element).removeClass(\"mapsvg-region-hover\");\n    }\n    /**\n     * Select the Region.\n     */\n    select() {\n        $(this.element).css({ fill: this.selected_attr.fill });\n        this.selected = true;\n        $(this.element).addClass(\"mapsvg-region-active\");\n    }\n    /**\n     * Deselect the Region.\n     */\n    deselect() {\n        $(this.element).css({ fill: this.default_attr.fill });\n        this.selected = false;\n        $(this.element).removeClass(\"mapsvg-region-active\");\n    }\n\n    /**\n     * Adds custom data loaded from server\n     * @param {object} data - Any set of {key:value} pairs\n     */\n    setData(data: CustomObject) {\n        this.data = data;\n        if (typeof data.title !== \"undefined\") {\n            this.setTitle(data.title);\n        }\n    }\n\n    /**\n     * Draw a choropleth bubble for the region\n     */\n    drawBubble() {\n        if (this.data) {\n            const bubbleId = \"mapsvg-bubble-\" + this.id;\n            const bubbleValue = parseFloat(this.data[this.mapsvg.options.choropleth.sourceField]);\n\n            if (bubbleValue) {\n                if (!this.center) {\n                    this.center = this.getCenterSVG();\n                }\n\n                const pos = this.mapsvg.converter.convertSVGToPixel(this.center);\n\n                if (!this.bubble) {\n                    this.bubble = $(\n                        '<div id=\"' +\n                            bubbleId +\n                            '\" class=\"mapsvg-bubble mapsvg-region-bubble\"></div>'\n                    )[0];\n                    $(this.mapsvg.layers.bubbles).append(this.bubble);\n                }\n\n                const color = this.getChoroplethColor();\n                const bubbleSize = Number(this.getBubbleSize());\n\n                $(this.bubble)\n                    .css(\n                        \"transform\",\n                        \"translate(-50%,-50%) translate(\" + pos.x + \"px,\" + pos.y + \"px)\"\n                    )\n                    .css(\"background-color\", color)\n                    .css(\"width\", bubbleSize + \"px\")\n                    .css(\"height\", bubbleSize + \"px\")\n                    .css(\"lineHeight\", bubbleSize - 2 + \"px\");\n            } else {\n                delete this.bubble;\n            }\n        }\n    }\n\n    /**\n     * Adjust position of Region Label\n     *\n     */\n    adjustLabelScreenPosition() {\n        if (this.label) {\n            if (!this.center) {\n                this.center = this.getCenterSVG();\n            }\n\n            const pos = this.mapsvg.converter.convertSVGToPixel(this.center),\n                x = pos.x - this.label.offsetWidth / 2,\n                y = pos.y - this.label.offsetHeight / 2;\n\n            this.setLabelScreenPosition(x, y);\n        }\n    }\n\n    /**\n     * Adjust position of Region bubble\n     *\n     */\n    adjustBubbleScreenPosition() {\n        if (this.bubble) {\n            if (!this.center) {\n                this.center = this.getCenterSVG();\n            }\n\n            const pos = this.mapsvg.converter.convertSVGToPixel(this.center),\n                x = pos.x - this.bubble.offsetWidth / 2,\n                y = pos.y - this.bubble.offsetHeight / 2;\n\n            this.setBubbleScreenPosition(x, y);\n        }\n    }\n\n    /**\n     * Set position of Region Label by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    moveLabelScreenPositionBy(deltaX, deltaY) {\n        if (this.label) {\n            const labelStyle = window.getComputedStyle(this.label),\n                matrix = labelStyle.transform || labelStyle.webkitTransform,\n                matrixValues = matrix.match(/matrix.*\\((.+)\\)/)[1].split(\", \"),\n                x = parseFloat(matrixValues[4]) - deltaX,\n                y = parseFloat(matrixValues[5]) - deltaY;\n\n            this.setLabelScreenPosition(x, y);\n        }\n    }\n\n    /**\n     * Set position of Region bubble by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    moveBubbleScreenPositionBy(deltaX, deltaY) {\n        if (this.bubble) {\n            const labelStyle = window.getComputedStyle(this.bubble),\n                matrix = labelStyle.transform || labelStyle.webkitTransform,\n                matrixValues = matrix.match(/matrix.*\\((.+)\\)/)[1].split(\", \"),\n                x = parseFloat(matrixValues[4]) - deltaX,\n                y = parseFloat(matrixValues[5]) - deltaY;\n\n            this.setBubbleScreenPosition(x, y);\n        }\n    }\n\n    /**\n     * Set position of Region Labels by given numbers\n     *\n     * @param {number} x\n     * @param {number} y\n     */\n    setLabelScreenPosition(x, y) {\n        if (this.label) {\n            this.label.style.transform = \"translate(\" + x + \"px,\" + y + \"px)\";\n        }\n    }\n\n    /**\n     * Set position of Region bubble by given numbers\n     *\n     * @param {number} x\n     * @param {number} y\n     */\n    setBubbleScreenPosition(x, y) {\n        if (this.bubble) {\n            this.bubble.style.transform = \"translate(\" + x + \"px,\" + y + \"px)\";\n        }\n    }\n}\n","import { Repository } from \"../../Core/Repository\";\nimport { Schema } from \"./Schema\";\nimport { MapSVGMap } from \"../../Map/Map\";\nimport { Events } from \"../../Core/Events\";\n\nexport class SchemaRepository extends Repository {\n    constructor() {\n        const objectName = \"schema\";\n        super(objectName, +objectName + \"s\");\n        this.className = \"Schema\";\n        this.objectNameSingle = objectName;\n        this.objectNameMany = objectName + \"s\";\n        this.path = objectName + \"s/\";\n        this.events = new Events(this);\n    }\n\n    create(schema: Schema): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = {};\n        data[this.objectNameSingle] = this.encodeData(schema);\n\n        this.server\n            .post(this.path, data)\n            .done((response: string) => {\n                const data = this.decodeData(response);\n                schema.id = data[this.objectNameSingle].id;\n                this.objects.push(schema);\n\n                this.events.trigger(\"created\");\n                schema.events.trigger(\"created\");\n\n                defer.resolve(schema);\n            })\n            .fail(() => {\n                defer.reject();\n            });\n\n        return defer;\n    }\n\n    update(schema: Schema): JQueryDeferred<any> {\n        const defer = jQuery.Deferred();\n        defer.promise();\n\n        const data = {};\n        data[this.objectNameSingle] = this.encodeData(schema);\n\n        this.server\n            .put(this.path + schema.id, data)\n            .done((response: string) => {\n                const data = this.decodeData(response);\n                this.objects.push(schema);\n                defer.resolve(schema);\n\n                this.events.trigger(\"changed\");\n                schema.events.trigger(\"changed\");\n            })\n            .fail(() => {\n                defer.reject();\n            });\n        return defer;\n    }\n\n    encodeData(schema: Schema): { [key: string]: any } {\n        const _schema = schema.getData();\n\n        let fieldsJsonString = JSON.stringify(_schema);\n        fieldsJsonString = fieldsJsonString.replace(/select/g, \"!mapsvg-encoded-slct\");\n        fieldsJsonString = fieldsJsonString.replace(/table/g, \"!mapsvg-encoded-tbl\");\n        fieldsJsonString = fieldsJsonString.replace(/database/g, \"!mapsvg-encoded-db\");\n        fieldsJsonString = fieldsJsonString.replace(/varchar/g, \"!mapsvg-encoded-vc\");\n        fieldsJsonString = fieldsJsonString.replace(/int\\(11\\)/g, \"!mapsvg-encoded-int\");\n\n        const back = JSON.parse(fieldsJsonString);\n        back.fields = JSON.stringify(_schema.fields);\n\n        return back;\n    }\n}\n","/**\n * Abstract class. Creates a scrollable controller. Extended by {@link #mapsvgpopovercontroller|PopoverController} / {@link #mapsvgdetailscontroller|DetailsController} / {@link #mapsvgdirectorycontroller|DirectoryController}\n * @abstract\n * @constructor\n * @param {object} options - List of options\n */\nimport { MapSVG } from \"./globals.js\";\nimport { MapSVGMap } from \"../Map/Map\";\n// import {Handlebars} from \"../../handlebars.js\"\n// @ts-ignore\nimport Handlebars from \"Handlebars\";\nimport { ResizeSensor } from \"./ResizeSensor.js\";\nimport { Events } from \"./Events.js\";\nconst $ = jQuery;\n\nexport class Controller {\n    containers: {\n        main: HTMLElement;\n        view?: HTMLElement;\n        toolbar?: HTMLElement;\n        contentWrap?: HTMLElement;\n        contentWrap2?: HTMLElement;\n        contentView?: HTMLElement;\n        sizer?: HTMLElement;\n    };\n    mapsvg: MapSVGMap;\n    name: string;\n    template: Function;\n    scrollable: boolean;\n    withToolbar: boolean;\n    autoresize: boolean;\n    templates: {\n        toolbar: Function;\n        main: Function;\n    };\n    data: { [key: string]: any };\n    width: string;\n    color: string;\n    // container: HTMLElement;\n    // contentWrap: HTMLElement;\n    // contentWrap2: HTMLElement;\n    // view: HTMLElement;\n    // contentView: HTMLElement;\n    // contentSizer: HTMLElement;\n    // toolbarView: HTMLElement;\n    resizeSensor: ResizeSensor;\n    noPadding: boolean;\n    events: Events;\n\n    constructor(options: { [key: string]: any }) {\n        this.containers = {\n            main: options.container,\n        };\n        this.mapsvg = options.mapsvg;\n        this.template = options.template || \"\";\n        this.scrollable = options.scrollable === undefined ? true : options.scrollable;\n        this.withToolbar = options.withToolbar === undefined ? true : options.withToolbar;\n        this.autoresize = MapSVG.parseBoolean(options.autoresize);\n        this.templates = {\n            toolbar: Handlebars.compile(this.getToolbarTemplate()),\n            main: Handlebars.compile(this.getMainTemplate()),\n        };\n        this.data = options.data;\n        this.width = options.width;\n        this.color = options.color;\n        this.events = new Events(this);\n        if (options.events) {\n            for (const eventName in options.events) {\n                if (typeof options.events[eventName] === \"function\") {\n                    this.events.on(eventName, options.events[eventName]);\n                }\n            }\n        }\n        //this._init();\n    }\n\n    /**\n     * This method fires when the view is fully loaded. Can be used to do any final actions.\n     * @method\n     */\n    viewDidLoad() {\n        const _this = this;\n        _this.updateScroll();\n        if (this.autoresize) {\n            _this.adjustHeight();\n            this.resizeSensor.setScroll();\n        }\n    }\n\n    /**\n     * This method cannot be overriden and it fires always for all child classes.\n     * @private\n     */\n    _viewDidLoad() {\n        this.updateScroll();\n    }\n\n    /**\n     * Fires when the view appears after being hidden.\n     * Should be overriden by a child class.\n     * @abstract\n     */\n    viewDidAppear() {}\n\n    /**\n     * This method fires when the view disappears.\n     * Should be overriden by a child class.\n     * @abstract\n     */\n    viewDidDisappear() {}\n\n    /**\n     * Updates the size of the scrollable container. Automatically fires when window size or content size changes.\n     */\n    updateScroll() {\n        if (!this.scrollable) return;\n        const _this = this;\n        $(this.containers.contentWrap).nanoScroller({\n            preventPageScrolling: true,\n            // iOSNativeScrolling: true,\n        });\n        setTimeout(function () {\n            $(_this.containers.contentWrap).nanoScroller({\n                preventPageScrolling: true,\n                // iOSNativeScrolling: true,\n            });\n        }, 300);\n    }\n\n    /**\n     * Adjusts height of the container to fit content.\n     */\n    adjustHeight() {\n        const _this = this;\n        $(_this.containers.main).height(\n            $(_this.containers.main).find(\".mapsvg-auto-height\").outerHeight() +\n                (_this.containers.toolbar ? $(_this.containers.toolbar).outerHeight() : 0)\n        );\n    }\n\n    /**\n     * Initialization actions for all child classes. Should not be overriden.\n     * @private\n     */\n    _init() {\n        const _this = this;\n        _this.render();\n        _this.init();\n    }\n\n    /**\n     * Initialization actions. Empty method. Can be overriden by child classes.\n     */\n    init() {}\n\n    /**\n     * This method must be overriden by a child class and return an HTML code for the toolbar.\n     */\n    getToolbarTemplate() {\n        return \"\";\n    }\n\n    /**\n     * Sets the template for the body\n     */\n    setMainTemplate(template: any) {\n        return (this.templates.main = Handlebars.compile(template));\n    }\n\n    /**\n     * This method must be overriden by a child class and  to return an HTML code for the main content\n     */\n    getMainTemplate() {\n        return this.template;\n    }\n\n    /**\n     * Renders the content.\n     */\n    render() {\n        const _this = this;\n        this.containers.view = $(\"<div />\")\n            .attr(\"id\", \"mapsvg-controller-\" + this.name)\n            .addClass(\"mapsvg-controller-view\")[0];\n\n        // Wrap cointainer, includes scrollable container\n        this.containers.contentWrap = $(\"<div />\").addClass(\"mapsvg-controller-view-wrap\")[0];\n        this.containers.contentWrap2 = $(\"<div />\")[0];\n\n        // Scrollable container\n        this.containers.sizer = $(\"<div />\").addClass(\"mapsvg-auto-height\")[0];\n        this.containers.contentView = $(\"<div />\").addClass(\"mapsvg-controller-view-content\")[0];\n        this.containers.sizer.appendChild(this.containers.contentView);\n\n        if (this.scrollable) {\n            $(this.containers.contentWrap).addClass(\"nano\");\n            $(this.containers.contentWrap2).addClass(\"nano-content\");\n        }\n        this.containers.contentWrap.appendChild(this.containers.contentWrap2);\n        this.containers.contentWrap2.appendChild(this.containers.sizer);\n\n        // Add toolbar if it exists in template file\n        if (this.withToolbar && this.templates.toolbar) {\n            this.containers.toolbar = $(\"<div />\").addClass(\"mapsvg-controller-view-toolbar\")[0];\n            this.containers.view.appendChild(this.containers.toolbar);\n        }\n\n        this.containers.view.append(this.containers.contentWrap);\n\n        // Add view into container\n        this.containers.main.appendChild(this.containers.view);\n        $(this.containers.main).data(\"controller\", this);\n\n        if (this.width) this.containers.view.style.width = this.width;\n        if (this.color) this.containers.view.style[\"background-color\"] = this.color;\n\n        _this.viewReadyToFill();\n        this.redraw();\n\n        setTimeout(function () {\n            _this._viewDidLoad();\n            _this.viewDidLoad();\n            _this.setEventHandlersCommon();\n            _this.setEventHandlers();\n        }, 1);\n    }\n\n    /**\n     * Fires right before rendering starts.\n     */\n    viewReadyToFill() {\n        const _this = this;\n        if (_this.autoresize) {\n            _this.resizeSensor = new ResizeSensor(this.containers.sizer, () => {\n                _this.adjustHeight();\n                _this.updateScroll();\n                _this.events.trigger(\"resize\", this, [this]);\n            });\n        }\n    }\n\n    /**\n     * Redraws the container.\n     */\n    redraw(data?: { [key: string]: any }) {\n        if (data !== undefined) {\n            this.data = data;\n        }\n\n        try {\n            $(this.containers.contentView).html(this.templates.main(this.data));\n        } catch (err) {\n            console.error(err);\n            $(this.containers.contentView).html(\"\");\n        }\n\n        if (this.withToolbar && this.templates.toolbar)\n            $(this.containers.toolbar).html(this.templates.toolbar(this.data));\n\n        this.updateTopShift();\n\n        if (this.noPadding) this.containers.contentView.style.padding = \"0\";\n\n        this.updateScroll();\n    }\n\n    /**\n     * Updates top shift of the main container depending on toolbar height\n     */\n    updateTopShift() {\n        const _this = this;\n        if (!this.withToolbar) return;\n        // bad, i know.\n        $(_this.containers.contentWrap).css({\n            top: $(_this.containers.toolbar).outerHeight(true) + \"px\",\n        });\n        setTimeout(function () {\n            $(_this.containers.contentWrap).css({\n                top: $(_this.containers.toolbar).outerHeight(true) + \"px\",\n            });\n        }, 100);\n        setTimeout(function () {\n            $(_this.containers.contentWrap).css({\n                top: $(_this.containers.toolbar).outerHeight(true) + \"px\",\n            });\n        }, 200);\n        setTimeout(function () {\n            $(_this.containers.contentWrap).css({\n                top: $(_this.containers.toolbar).outerHeight(true) + \"px\",\n            });\n            _this.updateScroll();\n        }, 500);\n    }\n\n    /**\n     * Set common event handlers for all child classes\n     */\n    setEventHandlersCommon() {}\n\n    /**\n     * Set event handlers. Can be overriden by a child class.\n     */\n    setEventHandlers() {}\n\n    /**\n     * Destroys the controller.\n     */\n    destroy() {\n        delete this.resizeSensor;\n        $(this.containers.view).empty().remove();\n    }\n}\n","/**\n * Creates a container with a list of objects near the map\n * @class\n * @extends Controller\n * @param options - List of options\n *\n * @example\n * var directory = mapsvg.controllers.directory;\n *\n *  // Toggle map/list view on mobile devices\n * if(MapSVG.isPhone){\n *   directory.toggle(true); // show directory\n * }\n */\nimport { Controller } from \"../Core/Controller.js\";\nimport { MapSVG } from \"../Core/globals.js\";\nimport { RepositoryInterface } from \"../Core/Repository.js\";\nimport { CustomObject } from \"../Object/CustomObject.js\";\nimport { Region } from \"../Region/Region.js\";\nconst $ = jQuery;\n\nexport class DirectoryController extends Controller {\n    repository: RepositoryInterface;\n    position: string;\n    search: string;\n    menuBtn: HTMLElement;\n    mapBtn: HTMLElement;\n    mobileButtons: HTMLElement;\n\n    constructor(options: { [key: string]: any }) {\n        super(options);\n        this.repository = options.repository;\n        this.noPadding = true;\n        this.position = options.position;\n        this.search = options.search;\n        //this._init();\n    }\n\n    /**\n     * Returns a HTML content for the Directory toolbar\n     * @returns {string} HTML content\n     */\n    getToolbarTemplate() {\n        let t = '<div class=\"mapsvg-directory-search-wrap\">';\n        t += '<div class=\"mapsvg-directory-filter-wrap filter-wrap\"></div>';\n        t += \"</div>\";\n        t += \"</div>\";\n        return t;\n    }\n\n    /**\n     * Does all required actions when the view is loaded: adds mobile buttons for mobile devices.\n     * @private\n     */\n    viewDidLoad() {\n        const _this = this;\n        this.menuBtn = $(\n            '<div class=\"mapsvg-button-menu\"><i class=\"mapsvg-icon-menu\"></i> ' +\n                this.mapsvg.options.mobileView.labelList +\n                \"</div>\"\n        )[0];\n        this.mapBtn = $(\n            '<div class=\"mapsvg-button-map\"><i class=\"mapsvg-icon-map\"></i> ' +\n                this.mapsvg.options.mobileView.labelMap +\n                \"</div>\"\n        )[0];\n\n        // Make directory hidden by default on mobiles\n        if (MapSVG.isPhone && _this.mapsvg.options.menu.hideOnMobile) {\n            if (this.mapsvg.options.menu.showFirst == \"map\") {\n                this.toggle(false);\n            } else {\n                this.toggle(true);\n            }\n        }\n\n        this.mobileButtons = $('<div class=\"mapsvg-mobile-buttons\"></div>')[0];\n        this.mobileButtons.append(this.menuBtn, this.mapBtn);\n\n        if (this.mapsvg.options.menu.on !== false) {\n            this.mapsvg.containers.wrapAll.appendChild(this.mobileButtons);\n        }\n\n        this.events.trigger(\"shown\", this.containers.view);\n    }\n\n    setEventHandlers() {\n        const _this = this;\n\n        $(window).on(\"resize\", function () {\n            _this.updateTopShift();\n        });\n\n        $(this.menuBtn).on(\"click\", function () {\n            _this.toggle(true);\n        });\n        $(this.mapBtn).on(\"click\", function () {\n            _this.toggle(false);\n            _this.mapsvg.redraw();\n        });\n\n        $(this.containers.view)\n            .on(\"click.menu.mapsvg\", \".mapsvg-directory-item\", function (e) {\n                if (e.target.nodeName == \"A\") {\n                    return;\n                }\n                // e.preventDefault();\n\n                const objID = $(this).data(\"object-id\");\n\n                let regions;\n                let marker;\n                let detailsViewObject;\n                let eventObject;\n\n                _this.deselectItems();\n                _this.selectItems(objID, false);\n\n                if (MapSVG.isPhone && _this.mapsvg.options.menu.showMapOnClick) {\n                    _this.toggle(false);\n                }\n\n                if (_this.mapsvg.options.menu.source == \"regions\") {\n                    regions = [_this.mapsvg.getRegion(objID)];\n                    eventObject = regions[0];\n                    detailsViewObject = regions[0];\n                } else {\n                    detailsViewObject = _this.repository.getLoadedObject(objID);\n                    eventObject = detailsViewObject;\n                    const _regions = detailsViewObject.getRegions(\n                        _this.mapsvg.regionsRepository.schema.name\n                    );\n                    if (_regions) {\n                        regions = _regions\n                            .map(function (region) {\n                                return _this.mapsvg.getRegion(region.id);\n                            })\n                            .filter(function (r) {\n                                return r !== undefined;\n                            });\n                    }\n                }\n\n                if (detailsViewObject.location && detailsViewObject.location.marker)\n                    marker = detailsViewObject.location.marker;\n\n                if (_this.mapsvg.options.actions.directoryItem.click.showDetails) {\n                    _this.mapsvg.loadDetailsView(detailsViewObject);\n                }\n\n                if (regions && regions.length > 0) {\n                    if (_this.mapsvg.options.actions.directoryItem.click.zoom) {\n                        _this.mapsvg.zoomTo(\n                            regions,\n                            _this.mapsvg.options.actions.directoryItem.click.zoomToLevel\n                        );\n                    }\n\n                    if (regions.length > 1) {\n                        _this.mapsvg.setMultiSelect(true);\n                    }\n                    regions.forEach(function (region) {\n                        const center = region.getCenter();\n                        e.clientX = center[0];\n                        e.clientY = center[1];\n\n                        if (_this.mapsvg.options.actions.directoryItem.click.selectRegion) {\n                            //region.setSelected(true);\n                            _this.mapsvg.selectRegion(region, true);\n                        }\n                        if (_this.mapsvg.options.actions.directoryItem.click.showRegionPopover) {\n                            if (_this.mapsvg.options.actions.directoryItem.click.zoom) {\n                                setTimeout(function () {\n                                    _this.mapsvg.showPopover(region);\n                                }, 500);\n                            } else {\n                                _this.mapsvg.showPopover(region);\n                            }\n                        }\n                        if (_this.mapsvg.options.actions.directoryItem.click.fireRegionOnClick) {\n                            _this.mapsvg.events.trigger(\"click.region\", region, [region]);\n                        }\n                    });\n                    if (regions.length > 1) {\n                        _this.mapsvg.setMultiSelect(false, false);\n                    }\n                }\n                if (marker) {\n                    if (_this.mapsvg.options.actions.directoryItem.click.zoomToMarker) {\n                        _this.mapsvg.zoomTo(\n                            marker,\n                            _this.mapsvg.options.actions.directoryItem.click.zoomToMarkerLevel\n                        );\n                    }\n                    if (_this.mapsvg.options.actions.directoryItem.click.showMarkerPopover) {\n                        if (_this.mapsvg.options.actions.directoryItem.click.zoomToMarker) {\n                            setTimeout(function () {\n                                _this.mapsvg.showPopover(detailsViewObject);\n                            }, 500);\n                        } else {\n                            _this.mapsvg.showPopover(detailsViewObject);\n                        }\n                    }\n                    if (_this.mapsvg.options.actions.directoryItem.click.fireMarkerOnClick) {\n                        _this.mapsvg.events.trigger(\"click.marker\", marker, [e, _this.mapsvg]);\n                    }\n                    _this.mapsvg.selectMarker(marker);\n                }\n\n                _this.events.trigger(\"click\", this, [e, eventObject, _this.mapsvg]);\n\n                const actions = _this.mapsvg.options.actions;\n\n                if (actions.directoryItem.click.goToLink) {\n                    const linkParts = actions.directoryItem.click.linkField.split(\".\");\n                    let url;\n                    if (linkParts.length > 1) {\n                        const obj = linkParts.shift();\n                        const attr = \".\" + linkParts.join(\".\");\n                        if (obj == \"Region\") {\n                            if (regions[0] && regions[0].data) url = eval(\"regions[0].data\" + attr);\n                        } else {\n                            if (detailsViewObject) url = eval(\"detailsViewObject\" + attr);\n                        }\n\n                        if (url) {\n                            if (actions.directoryItem.click.newTab) {\n                                const win = window.open(url, \"_blank\");\n                                win.focus();\n                            } else {\n                                window.location.href = url;\n                            }\n                        }\n                    }\n                }\n                if (actions.directoryItem.click.showAnotherMap) {\n                    if (_this.mapsvg.editMode) {\n                        alert('\"Show another map\" action is disabled in the preview');\n                        return true;\n                    }\n                    const linkParts2 = actions.directoryItem.click.showAnotherMapField.split(\".\");\n                    if (linkParts2.length > 1) {\n                        const obj2 = linkParts2.shift();\n                        const attr2 = \".\" + linkParts2.join(\".\");\n                        let map_id;\n                        if (obj2 == \"Region\") {\n                            if (regions[0] && regions[0].data)\n                                map_id = eval(\"regions[0].data\" + attr2);\n                        } else {\n                            if (detailsViewObject) map_id = eval(\"detailsViewObject\" + attr2);\n                        }\n\n                        if (map_id) {\n                            const container = actions.directoryItem.click.showAnotherMapContainerId\n                                ? $(\"#\" + actions.directoryItem.click.showAnotherMapContainerId)[0]\n                                : $(_this.mapsvg.containers.map)[0];\n                            _this.mapsvg.loadMap(map_id, container);\n                        }\n                    }\n                }\n            })\n            .on(\"mouseover.menu.mapsvg\", \".mapsvg-directory-item\", function (e) {\n                const objID = $(this).data(\"object-id\");\n                let regions;\n                let detailsViewObject;\n                let eventObject;\n                let marker;\n\n                if (_this.mapsvg.options.menu.source == \"regions\") {\n                    regions = [_this.mapsvg.getRegion(objID)];\n                    eventObject = regions[0];\n                    detailsViewObject = regions[0];\n                } else {\n                    detailsViewObject = _this.repository.getLoadedObject(objID);\n                    eventObject = detailsViewObject;\n                    const _regions = detailsViewObject.getRegions(\n                        _this.mapsvg.regionsRepository.schema.name\n                    );\n                    if (_regions) {\n                        regions = _regions.map(function (region) {\n                            return _this.mapsvg.getRegion(region.id);\n                        });\n                    }\n                    if (detailsViewObject.location) {\n                        marker = detailsViewObject.location.marker;\n                    }\n                }\n\n                if (regions && regions.length) {\n                    _this.mapsvg.highlightRegions(regions);\n                }\n                if (marker) {\n                    _this.mapsvg.highlightMarker(marker);\n                    if (_this.mapsvg.options.actions.directoryItem.hover.centerOnMarker) {\n                        _this.mapsvg.centerOn(marker);\n                    }\n                }\n                _this.events.trigger(\"mouseover\", $(this), [e, eventObject, _this.mapsvg]);\n            })\n            .on(\"mouseout.menu.mapsvg\", \".mapsvg-directory-item\", function (e) {\n                const objID = $(this).data(\"object-id\");\n                let regions;\n                let detailsViewObject;\n                let eventObject;\n                let marker;\n\n                if (_this.mapsvg.options.menu.source == \"regions\") {\n                    regions = [_this.mapsvg.getRegion(objID)];\n                    eventObject = regions[0];\n                    detailsViewObject = regions[0];\n                } else {\n                    detailsViewObject = _this.repository.getLoadedObject(objID);\n                    eventObject = detailsViewObject;\n                    const _regions = detailsViewObject.getRegions(\n                        _this.mapsvg.regionsRepository.schema.name\n                    );\n                    if (_regions) {\n                        regions = _regions.map(function (region) {\n                            return _this.mapsvg.getRegion(region.id);\n                        });\n                    }\n                    if (detailsViewObject.location) {\n                        marker = detailsViewObject.location.marker;\n                    }\n                }\n\n                if (regions && regions.length) {\n                    _this.mapsvg.unhighlightRegions();\n                }\n                if (marker) {\n                    _this.mapsvg.unhighlightMarker();\n                }\n                _this.events.trigger(\"mouseout\", $(this), [e, eventObject, _this.mapsvg]);\n            });\n\n        $(this.containers.contentView).on(\"click\", \".mapsvg-category-item\", function () {\n            const panel = $(this).next(\".mapsvg-category-block\");\n\n            if (panel[0].style.maxHeight || panel.hasClass(\"active\")) {\n                panel[0].style.maxHeight = null;\n            } else {\n                panel[0].style.maxHeight = panel[0].scrollHeight + \"px\";\n            }\n\n            if ($(this).hasClass(\"active\")) {\n                $(this).toggleClass(\"active\", false);\n                $(this).next(\".mapsvg-category-block\").addClass(\"collapsed\").removeClass(\"active\");\n            } else {\n                if (_this.mapsvg.options.menu.categories.collapseOther) {\n                    $(this).parent().find(\".mapsvg-category-item.active\").removeClass(\"active\");\n                    $(this)\n                        .parent()\n                        .find(\".mapsvg-category-block.active\")\n                        .removeClass(\"active\")\n                        .addClass(\"collapsed\");\n                }\n                $(this).toggleClass(\"active\", true);\n                $(this).next(\".mapsvg-category-block\").removeClass(\"collapsed\").addClass(\"active\");\n            }\n\n            const panels = $(\".mapsvg-category-block.collapsed\");\n            panels.each(function (i, panel) {\n                panel.style.maxHeight = null;\n            });\n        });\n    }\n\n    /**\n     * Highlights directory items\n     * @param {array} ids - A list of object IDs\n     */\n    highlightItems(ids) {\n        const _this = this;\n        if (typeof ids != \"object\") ids = [ids];\n        ids.forEach(function (id) {\n            $(_this.containers.view)\n                .find(\"#mapsvg-directory-item-\" + _this.convertId(id))\n                .addClass(\"hover\");\n        });\n    }\n\n    /**\n     * Unhighlights directory items\n     */\n    unhighlightItems() {\n        $(this.containers.view).find(\".mapsvg-directory-item\").removeClass(\"hover\");\n    }\n\n    /**\n     * Highlights directory items\n     * @param {array} ids - A list of object IDs\n     */\n    selectItems(ids, scrollTo = true) {\n        if (typeof ids != \"object\") ids = [ids];\n        ids.forEach((id) => {\n            $(this.containers.view)\n                .find(\"#mapsvg-directory-item-\" + this.convertId(id))\n                .addClass(\"selected\");\n        });\n\n        if (scrollTo && $(\"#mapsvg-directory-item-\" + ids[0]).length > 0) {\n            this.scrollable &&\n                $(this.containers.contentWrap).nanoScroller({\n                    scrollTo: $(this.containers.view).find(\n                        \"#mapsvg-directory-item-\" + this.convertId(ids[0])\n                    ),\n                });\n        }\n    }\n\n    /**\n     * Deselects directory items\n     */\n    deselectItems() {\n        $(this.containers.view).find(\".mapsvg-directory-item\").removeClass(\"selected\");\n    }\n\n    /**\n     * Remove items\n     */\n    removeItems(ids) {\n        $(this.containers.view)\n            .find(\"#mapsvg-directory-item-\" + this.convertId(ids))\n            .remove();\n    }\n\n    /**\n     * Filter out directory items\n     */\n    filterOut(items) {\n        const _this = this;\n\n        if (this.repository.path.indexOf(\"regions\") !== -1) {\n            let f: { field: string; val: number | string };\n            f = {\n                field: \"\",\n                val: \"\",\n            };\n            if (_this.mapsvg.options.menu.filterout.field) {\n                f.field = _this.mapsvg.options.menu.filterout.field;\n                f.val = _this.mapsvg.options.menu.filterout.val;\n            }\n\n            items = items.filter(function (item) {\n                let ok = true;\n                const status = _this.mapsvg.options.regionStatuses;\n                if (status[item.status]) {\n                    ok = !status[item.status].disabled;\n                }\n\n                if (ok && f.field) {\n                    ok = item[f.field] != f.val;\n                }\n                return ok;\n            });\n        }\n\n        return items;\n    }\n\n    /**\n     * Loads items from a source defined in settings  to the directory. The source can be \"Regions\" or \"Database\".\n     */\n    loadItemsToDirectory() {\n        let items = [];\n        const _this = this;\n\n        if (!_this.repository.loaded) return false;\n\n        // If \"categories\" option is enabled, then:\n        if (\n            _this.mapsvg.options.menu.categories &&\n            _this.mapsvg.options.menu.categories.on &&\n            _this.mapsvg.options.menu.categories.groupBy\n        ) {\n            // Get category field to group objects by\n            const categoryField = _this.mapsvg.options.menu.categories.groupBy;\n            // Get the list of categories\n            if (\n                _this.repository.getSchema().getField(categoryField) === undefined ||\n                _this.repository.getSchema().getField(categoryField).options === undefined\n            ) {\n                return false;\n            }\n            const categories = _this.repository.getSchema().getField(categoryField).options;\n            // Get the list of items for every category\n            categories.forEach(function (category) {\n                let dbItems = _this.repository.getLoaded();\n                dbItems = _this.filterOut(dbItems);\n                const itemArr: Array<any> = [];\n                dbItems.forEach((item) => {\n                    itemArr.push(item);\n                });\n                const catItems = itemArr.filter(function (object) {\n                    if (categoryField === \"regions\") {\n                        const objectRegions =\n                            typeof object[categoryField] !== \"undefined\" &&\n                            object[categoryField].length\n                                ? object[categoryField]\n                                : [];\n                        const objectRegionIDs = objectRegions.map(function (region) {\n                            return region.id;\n                        });\n                        return objectRegionIDs.indexOf(category.id) !== -1;\n                    } else {\n                        return object[categoryField] == category.value;\n                    }\n                });\n                category.counter = catItems.length;\n                if (categoryField === \"regions\") {\n                    category.label = category.title;\n                    category.value = category.id;\n                }\n\n                catItems.sort(function (a, b) {\n                    const field = _this.mapsvg.options.menu.sortBy;\n                    return a[field] == b[field]\n                        ? 0\n                        : (_this.mapsvg.options.menu.sortDirection === \"asc\"\n                              ? +(a[field] > [field])\n                              : +(a[field] < [field])) || -1;\n                });\n\n                items.push({ category: category, items: catItems });\n            });\n            // Filter out empty categories, if needed:\n            if (_this.mapsvg.options.menu.categories.hideEmpty) {\n                items = items.filter(function (item) {\n                    return item.category.counter > 0;\n                });\n            }\n        } else {\n            // If categories are not enabled then just get the list of DB items:\n            if (_this.mapsvg.options.menu.source === \"regions\") {\n                items = _this.repository.getLoaded().map((r) => {\n                    const data = r.getData();\n                    data.objects = _this.mapsvg.getRegion(data.id).objects;\n                    data.id_no_spaces = data.id.split(\" \").join(\"_\");\n                    return data;\n                });\n                items = _this.filterOut(items);\n            } else {\n                items = _this.repository\n                    .getLoaded()\n                    .map((r) => r.getData(_this.mapsvg.regionsRepository.schema.name));\n            }\n        }\n\n        try {\n            $(this.containers.contentView).html(this.templates.main({ items: items }));\n        } catch (err) {\n            console.error('MapSVG: Error in the \"Directory item\" template');\n            console.error(err);\n        }\n        if (items.length === 0) {\n            $(this.containers.contentView).html(\n                '<div class=\"mapsvg-no-results\">' +\n                    this.mapsvg.options.menu.noResultsText +\n                    \"</div>\"\n            );\n        }\n\n        if (_this.mapsvg.options.menu.categories.on) {\n            if (_this.mapsvg.options.menu.categories.collapse && items.length > 1) {\n                $(this.containers.contentView).find(\".mapsvg-category-block\").addClass(\"collapsed\");\n            } else if (_this.mapsvg.options.menu.categories.collapse && items.length === 1) {\n                $(this.containers.contentView).find(\".mapsvg-category-item\").addClass(\"active\");\n                $(this.containers.contentView).find(\".mapsvg-category-block\").addClass(\"active\");\n                const panel = $(this.containers.contentView).find(\".mapsvg-category-block\")[0];\n                if (panel) panel.style.maxHeight = panel.scrollHeight + \"px\";\n            } else if (!_this.mapsvg.options.menu.categories.collapse) {\n                $(this.containers.contentView).find(\".mapsvg-category-item\").addClass(\"active\");\n                $(this.containers.contentView).find(\".mapsvg-category-block\").addClass(\"active\");\n                const panels = $(this.containers.contentView).find(\".mapsvg-category-block\");\n                if (panels.length)\n                    panels.each(function (i, panel) {\n                        panel.style.maxHeight = panel.scrollHeight + \"px\";\n                    });\n            }\n        }\n        this.updateTopShift();\n        this.updateScroll();\n    }\n\n    /**\n     * Toggles view between map and directory on mobile devices\n     * @param {boolean} on - If \"true\", directory is shown and map is hidden, and vice-versa.\n     */\n    toggle(on?: boolean) {\n        const _this = this;\n        if (on) {\n            $(this.containers.main).parent().show();\n            $(_this.mapsvg.containers.mapContainer).hide();\n            // _this.mapsvg.$wrapAll.toggleClass('mapsvg-mobile-show-map', true);\n            // _this.mapsvg.$wrapAll.toggleClass('mapsvg-mobile-show-directory', ƒalse);\n            $(this.menuBtn).addClass(\"active\");\n            $(this.mapBtn).removeClass(\"active\");\n            // redraw?\n        } else {\n            $(this.containers.main).parent().hide();\n            $(_this.mapsvg.containers.mapContainer).show();\n            // _this.mapsvg.$wrapAll.toggleClass('mapsvg-mobile-show-map', false);\n            // _this.mapsvg.$wrapAll.toggleClass('mapsvg-mobile-show-directory', true);\n            $(this.menuBtn).removeClass(\"active\");\n            $(this.mapBtn).addClass(\"active\");\n        }\n\n        if (!$(this.containers.main).parent().is(\":visible\")) {\n            if (MapSVG.isPhone) {\n                $(_this.mapsvg.containers.wrap).css(\"height\", \"auto\");\n                _this.updateScroll();\n            }\n        } else {\n            if (\n                MapSVG.isPhone &&\n                $(this.containers.main).height() < parseInt(this.mapsvg.options.menu.minHeight)\n            ) {\n                $(_this.mapsvg.containers.wrap).css(\n                    \"height\",\n                    parseInt(this.mapsvg.options.menu.minHeight) + \"px\"\n                );\n                _this.updateScroll();\n            }\n        }\n\n        this.updateTopShift();\n    }\n\n    /**\n     * Adds pagination buttons to the directory.\n     * @param {string} pager - HTML string with the buttons\n     */\n    addPagination(pager) {\n        $(this.containers.contentView).append('<div class=\"mapsvg-pagination-container\"></div>');\n        $(this.containers.contentView).find(\".mapsvg-pagination-container\").html(pager);\n    }\n\n    convertId(id) {\n        return (id + \"\")\n            .split(\" \")\n            .join(\"_\")\n            .replace(/(:|\\(|\\)|\\.|\\[|\\]|,|=|@)/g, \"\\\\$1\");\n    }\n}\n","/**\n * Details View controller. Large scrollable window with content and \"X\" close button\n * that can be placed in the map container, header/footer/sidebar or in a custom DIV container outside of the map.\n * @param {object} options\n * @extends Controller\n * @constructor\n */\nimport { MapSVG } from \"../Core/globals.js\";\nimport { Controller } from \"../Core/Controller\";\nconst $ = jQuery;\n\nexport class DetailsController extends Controller {\n    modal: boolean;\n    mobileCloseBtn: HTMLElement;\n\n    constructor(options: { [key: string]: any }) {\n        super(options);\n        this.modal = options.modal;\n        //this._init();\n    }\n\n    /**\n     * Returns toolbar for the Details View\n     * @returns {string}\n     * @private\n     */\n    getToolbarTemplate() {\n        if (this.withToolbar)\n            return '<div class=\"mapsvg-popover-close mapsvg-details-close\"></div>';\n        else return \"\";\n    }\n\n    /**\n     * Fires when view is fully rendered. Intended for final actions.\n     * @private\n     */\n    viewDidLoad() {\n        const _this = this;\n        this.events.trigger(\"shown\", _this, [_this]);\n        if (\n            this.modal &&\n            MapSVG.isPhone &&\n            this.mapsvg.options.detailsView.mobileFullscreen &&\n            !this.mobileCloseBtn\n        ) {\n            this.mobileCloseBtn = $(\n                '<button class=\"mapsvg-mobile-modal-close\">' +\n                    _this.mapsvg.options.mobileView.labelClose +\n                    \"</button>\"\n            )[0];\n            this.containers.view.appendChild(this.mobileCloseBtn);\n        }\n    }\n\n    /**\n     * Sets event handlers\n     * @private\n     */\n    setEventHandlers() {\n        const _this = this;\n        $(this.containers.toolbar).on(\"click touchend\", \".mapsvg-popover-close\", function (e) {\n            e.stopPropagation();\n            _this.destroy();\n            _this.events.trigger(\"closed\", _this, [_this]);\n        });\n        $(this.containers.view).on(\"click touchend\", \".mapsvg-mobile-modal-close\", function (e) {\n            e.stopPropagation();\n            _this.destroy();\n            _this.events.trigger(\"closed\", _this, [_this]);\n        });\n    }\n}\n","/// <reference path=\"../../../vendor/jquery-plugins.d.ts\" />\n\nimport { FormBuilder } from \"../FormBuilder\";\nimport { FormElementInterface } from \"./FormElementInterface\";\n// import {Handlebars} from \"../../../handlebars.js\"\n// @ts-ignore\nimport Handlebars from \"Handlebars\";\nimport { Events } from \"../../Core/Events\";\nimport { SchemaField } from \"../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class FormElement implements FormElementInterface {\n    name: string;\n    label: string;\n    type: string;\n    db_type: string;\n    value: any;\n    domElements: {\n        main?: HTMLElement;\n        edit?: HTMLElement;\n        // fields?: {[key:string]: HTMLInputElement},\n        [key: string]: HTMLElement;\n    };\n    inputs: {\n        [key: string]:\n            | HTMLInputElement\n            | HTMLSelectElement\n            | HTMLTextAreaElement\n            | HTMLButtonElement\n            | RadioNodeList;\n    };\n    templates: {\n        main?: Function;\n        edit?: Function;\n        [key: string]: Function;\n    };\n    formBuilder: FormBuilder;\n    searchable?: boolean;\n    options?: Array<any>;\n    optionsDict?: { [key: string]: any };\n    help?: string;\n    placeholder?: string;\n    parameterName?: string;\n    parameterNameShort?: string;\n    nameChanged: boolean;\n    visible?: boolean;\n    readonly?: boolean;\n    protected?: boolean;\n    auto_increment?: boolean;\n    not_null?: boolean;\n    external: { [key: string]: any };\n\n    mapIsGeo: boolean;\n    events: Events;\n    namespace: string;\n    editMode: boolean;\n    filtersMode: boolean;\n    private _isInputChangedByUser: boolean;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        this.readonly = typeof options.readonly !== \"undefined\" ? options.readonly : false;\n        this.protected = typeof options.protected !== \"undefined\" ? options.protected : false;\n        this.auto_increment =\n            typeof options.auto_increment !== \"undefined\" ? options.auto_increment : false;\n        this.not_null = typeof options.not_null !== \"undefined\" ? options.not_null : false;\n        this.searchable = typeof options.searchable !== \"undefined\" ? options.searchable : false;\n        this.visible = typeof options.visible !== \"undefined\" ? options.visible : true;\n\n        this.formBuilder = formBuilder;\n        this.events = new Events(this);\n        this.type = options.type;\n        this.value = options.value;\n        this.db_type = options.db_type || \"varchar(255)\";\n        this.label = this.label || (options.label === undefined ? \"Label\" : options.label);\n        this.name = this.name || options.name || \"label\";\n        this.help = options.help || \"\";\n        this.placeholder = options.placeholder;\n        // this.databaseFields = options.databaseFields;\n        // this.databaseFieldsFilterableShort = options.databaseFieldsFilterableShort;\n        // this.regionFields = options.regionFields;\n\n        this.setExternal(external);\n\n        let t = this.type;\n        if (t === \"marker\" && this.mapIsGeo) {\n            t = \"marker-geo\";\n        }\n        if (t === \"location\" && this.mapIsGeo) {\n            t = \"location-geo\";\n        }\n\n        if (this.filtersMode) {\n            this.parameterName = options.parameterName || \"\";\n            this.parameterNameShort = this.parameterName.split(\".\")[1];\n            this.name = this.parameterNameShort;\n            this.placeholder = options.placeholder || \"\";\n            this.templates = {\n                main: Handlebars.compile($(\"#mapsvg-filters-tmpl-\" + t + \"-view\").html()),\n            };\n        } else {\n            this.templates = {\n                main: Handlebars.compile($(\"#mapsvg-data-tmpl-\" + t + \"-view\").html()),\n            };\n        }\n\n        this.inputs = {};\n    }\n\n    init() {\n        this.setDomElements();\n        this.setEventHandlers();\n    }\n\n    setDomElements() {\n        this.domElements = {\n            main: $(this.templates.main(this.getDataForTemplate()))[0],\n        };\n        // this.domElements.markerSelector = $(this.domElements.main).find(\".mapsvg-marker-image-selector\")[0];\n        $(this.domElements.main).data(\"formElement\", this);\n        this.addSelect2();\n    }\n\n    setEventHandlers() {\n        const _this = this;\n        if (this.formBuilder.editMode) {\n            $(this.domElements.main).on(\"click\", function () {\n                _this.events.trigger(\"click\", _this, [_this]);\n            });\n        }\n    }\n\n    addSelect2() {\n        if ($().mselect2) {\n            $(this.domElements.main)\n                .find(\"select\")\n                .css({ width: \"100%\", display: \"block\" })\n                .mselect2()\n                .on(\"select2:focus\", function () {\n                    $(this).mselect2(\"open\");\n                });\n            $(this.domElements.main)\n                .find(\".select2-selection--multiple .select2-search__field\")\n                .css(\"width\", \"100%\");\n        }\n    }\n\n    setEditorEventHandlers() {\n        const _this = this;\n\n        $(this.domElements.edit).on(\"click\", \"button.mapsvg-remove\", function () {\n            $(_this.domElements.main).empty().remove();\n            $(_this.domElements.edit).empty().remove();\n            _this.events.trigger(\"delete\", _this, [_this]);\n        });\n\n        $(this.domElements.edit).on(\"click\", \".mapsvg-filter-insert-options\", function () {\n            const objType = _this.parameterName.split(\".\")[0];\n            const fieldName = _this.parameterName.split(\".\")[1];\n            let field;\n            if (objType == \"Object\") {\n                field = _this.formBuilder.mapsvg.objectsRepository.getSchema().getField(fieldName);\n            } else {\n                if (fieldName == \"id\") {\n                    const options = [];\n                    _this.formBuilder.mapsvg.regions.forEach(function (r) {\n                        options.push({ label: r.id, value: r.id });\n                    });\n                    field = {\n                        options: options,\n                    };\n                } else if (fieldName === \"title\") {\n                    const options = [];\n                    _this.formBuilder.mapsvg.regions.forEach(function (r) {\n                        options.push({ label: r.title, value: r.title });\n                    });\n                    field = { options: options };\n                } else {\n                    field = _this.formBuilder.mapsvg.regionsRepository\n                        .getSchema()\n                        .getField(fieldName);\n                }\n            }\n            if ((field && field.options) || fieldName === \"regions\") {\n                let options;\n                if (fieldName == \"regions\") {\n                    const _options = _this.formBuilder.mapsvg.regions.map((r) => {\n                        return { id: r.id, title: r.title };\n                    });\n                    _options.sort(function (a, b) {\n                        if (a.title < b.title) return -1;\n                        if (a.title > b.title) return 1;\n                        return 0;\n                    });\n                    options = _options.map(function (o) {\n                        return (o.title || o.id) + \":\" + o.id;\n                    });\n                } else {\n                    options = field.options.map(function (o) {\n                        return o.label + \":\" + o.value;\n                    });\n                }\n                $(this)\n                    .closest(\".form-group\")\n                    .find(\"textarea\")\n                    .val(options.join(\"\\n\"))\n                    .trigger(\"change\");\n            }\n        });\n\n        $(this.domElements.edit).on(\"keyup change paste\", \"input, textarea, select\", function () {\n            const prop = $(this).attr(\"name\");\n\n            const array = $(this).data(\"array\");\n            if (_this.type === \"status\" && array) {\n                const param = $(this).data(\"param\");\n                const index = $(this).closest(\"tr\").index();\n                _this.options[index] = _this.options[index] || {\n                    label: \"\",\n                    value: \"\",\n                    color: \"\",\n                    disabled: false,\n                };\n                _this.options[index][param] = $(this).is(\":checkbox\")\n                    ? $(this).prop(\"checked\")\n                    : $(this).val();\n                _this.redraw();\n            } else if (_this.type === \"distance\" && array) {\n                const param = $(this).data(\"param\");\n                const index = $(this).closest(\"tr\").index();\n                if (!_this.options[index]) {\n                    _this.options[index] = { value: \"\", default: false };\n                }\n                if (param === \"default\") {\n                    _this.options.forEach(function (option) {\n                        option.default = false;\n                    });\n                    _this.options[index].default = $(this).prop(\"checked\");\n                } else {\n                    _this.options[index].value = $(this).val();\n                }\n                _this.redraw();\n            } else if (prop == \"label\" || prop == \"name\") {\n                return false;\n            } else {\n                let value;\n                value =\n                    $(this).attr(\"type\") == \"checkbox\" ? $(this).prop(\"checked\") : $(this).val();\n                if ($(this).attr(\"type\") == \"radio\") {\n                    const name = $(this).attr(\"name\");\n                    value = $('input[name=\"' + name + '\"]:checked').val();\n                }\n                _this.update(prop, value);\n            }\n        });\n\n        $(this.domElements.edit).on(\"keyup change paste\", 'input[name=\"label\"]', function () {\n            if (!_this.nameChanged) {\n                // _this.update('name',str);\n                _this.label = $(this).val() + \"\";\n                if (_this.type != \"region\" && _this.type != \"location\" && _this.type != \"title\") {\n                    let str = $(this).val() + \"\";\n                    str = str.toLowerCase().replace(/ /g, \"_\").replace(/\\W/g, \"\");\n                    if (str.length < 64) {\n                        $(_this.domElements.edit).find('input[name=\"name\"]').val(str);\n                    }\n                    _this.name = str + \"\";\n                }\n                $(_this.domElements.main).find(\"label\").first().html(_this.label);\n                if (!_this.filtersMode) {\n                    $(_this.domElements.main)\n                        .find(\"label\")\n                        .first()\n                        .append('<div class=\"field-name\">' + _this.name + \"</div>\");\n                }\n            }\n        });\n        $(this.domElements.edit).on(\"keyup change paste\", 'input[name=\"name\"]', function (e) {\n            if (e.target.value) {\n                if (e.target.value.match(/[^a-zA-Z0-9_]/g)) {\n                    e.target.value = e.target.value.replace(/[^a-zA-Z0-9_]/g, \"\");\n                    $(e.target).trigger(\"change\");\n                }\n                if (e.target.value[0].match(/[^a-zA-Z_]/g)) {\n                    e.target.value =\n                        e.target.value[0].replace(/[^a-zA-Z_]/g, \"\") + e.target.value.slice(1);\n                    $(e.target).trigger(\"change\");\n                }\n            }\n            if (_this.type != \"region\") _this.name = e.target.value;\n            $(_this.domElements.main)\n                .find(\"label\")\n                .html(_this.label + '<div class=\"field-name\">' + _this.name + \"</div>\");\n            _this.nameChanged = true;\n        });\n        $(this.domElements.edit).on(\"keyup change paste\", 'textarea[name=\"help\"]', function (e) {\n            $(_this.domElements.main).find(\".form-text\").text(e.target.value);\n        });\n    }\n\n    getEditor() {\n        // if(!this.domElements.edit){\n        if (!this.filtersMode) {\n            this.templates.edit =\n                this.templates.edit ||\n                Handlebars.compile($(\"#mapsvg-data-tmpl-\" + this.type + \"-control\").html());\n        } else {\n            this.templates.edit =\n                this.templates.edit ||\n                Handlebars.compile($(\"#mapsvg-filters-tmpl-\" + this.type + \"-control\").html());\n        }\n        this.domElements.edit = $(\n            \"<div>\" + this.templates.edit(this.getDataForTemplate()) + \"</div>\"\n        )[0];\n        // }\n        return this.domElements.edit;\n    }\n\n    destroyEditor() {\n        // this.domElements.edit.find('select').mselect2('destroy');\n        $(this.domElements.edit).empty().remove();\n    }\n\n    initEditor() {\n        $(this.domElements.edit).find(\"input\").first().select();\n\n        if ($().colorpicker) {\n            $(this.domElements.edit)\n                .find(\".cpicker\")\n                .colorpicker()\n                .on(\"changeColor.colorpicker\", function (event) {\n                    const input = $(this).find(\"input\");\n                    if (input.val() == \"\") $(this).find(\"i\").css({ \"background-color\": \"\" });\n                });\n        }\n\n        if ($().mselect2) {\n            if (this.type !== \"distance\") {\n                $(this.domElements.edit)\n                    .find(\"select\")\n                    .css({ width: \"100%\", display: \"block\" })\n                    .mselect2();\n            }\n        }\n        this.setEditorEventHandlers();\n    }\n\n    getSchema(): { [key: string]: any } {\n        let data: { [key: string]: any };\n\n        data = {\n            type: this.type,\n            db_type: this.db_type,\n            label: this.label,\n            name: this.name,\n            value: this.value,\n            searchable: this.searchable,\n            help: this.help,\n            visible: this.visible === undefined ? true : this.visible,\n            readonly: this.readonly,\n            placeholder: this.placeholder,\n            protected: this.protected,\n            auto_increment: this.auto_increment,\n            not_null: this.not_null,\n        };\n        if (this.options) {\n            data.options = this.getSchemaFieldOptionsList();\n        }\n        if (this.filtersMode) {\n            data.parameterName = this.parameterName;\n            data.parameterNameShort = this.parameterName.split(\".\")[1];\n        }\n\n        return data;\n    }\n\n    getSchemaFieldOptionsList(): any[] {\n        const _this = this;\n        const options = [];\n        this.options.forEach((option, index) => {\n            if (this.options[index].value !== \"\") {\n                options.push(this.options[index]);\n                // this.options.splice(index, 1);\n            }\n        });\n\n        return options;\n    }\n\n    getDataForTemplate(): { [key: string]: any } {\n        const data = this.getSchema();\n\n        // Add namespace to names\n        data._name = data.name;\n        if (this.namespace) {\n            data.name = this.name.split(\"[\")[0];\n            let suffix = this.name.split(\"[\")[1] || \"\";\n            if (suffix) suffix = \"[\" + suffix;\n            data.name = this.namespace + \"[\" + data.name + \"]\" + suffix;\n        }\n\n        data.external = this.external;\n\n        return data;\n    }\n\n    update(prop, value) {\n        const _this = this;\n        if (prop == \"options\") {\n            const options = [];\n            value = value.split(\"\\n\").forEach(function (row) {\n                row = row.trim().split(\":\");\n                if (_this.type == \"checkbox\" && row.length == 3) {\n                    options.push({\n                        label: row[0],\n                        name: row[1],\n                        value: row[2],\n                    });\n                } else if (\n                    (_this.type == \"radio\" ||\n                        _this.type == \"select\" ||\n                        _this.type == \"checkboxes\") &&\n                    row.length == 2\n                ) {\n                    options.push({\n                        label: row[0],\n                        value: row[1],\n                    });\n                }\n            });\n            this.options = options;\n        } else {\n            this[prop] = value;\n        }\n        if (prop == \"parameterName\") {\n            $(this.domElements.edit).find(\".mapsvg-filter-param-name\").text(value);\n        }\n    }\n\n    redraw() {\n        const _this = this;\n        const newView = $(this.templates.main(this.getDataForTemplate()));\n        $(this.domElements.main).html(newView.html());\n        if ($().mselect2) {\n            if (this.type !== \"distance\") {\n                $(this.domElements.main)\n                    .find(\"select\")\n                    .css({ width: \"100%\", display: \"block\" })\n                    .mselect2()\n                    .on(\"select2:focus\", function () {\n                        $(this).mselect2(\"open\");\n                    });\n            } else {\n                $(this.domElements.main)\n                    .find(\"select\")\n                    .mselect2()\n                    .on(\"select2:focus\", function () {\n                        $(this).mselect2(\"open\");\n                    });\n            }\n        }\n    }\n\n    redrawEditor() {\n        if (this.domElements.edit) {\n            $(this.domElements.edit).empty();\n            $(this.domElements.edit).html(\n                \"<div>\" + this.templates.edit(this.getDataForTemplate()) + \"</div>\"\n            );\n            this.initEditor();\n        }\n    }\n\n    setOptions(options?: any[]): any[] {\n        if (options) {\n            this.options = [];\n            this.optionsDict = {};\n            options.forEach((value, key) => {\n                this.options.push(value);\n                this.optionsDict[key] = value;\n            });\n            return this.options;\n        } else {\n            return this.setOptions([\n                { label: \"Option one\", name: \"option_one\", value: 1 },\n                { label: \"Option two\", name: \"option_two\", value: 2 },\n            ]);\n        }\n    }\n\n    getData(): { name: string; value: any } {\n        return { name: this.name, value: this.getValue() };\n    }\n\n    destroy(): void {\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                sel.mselect2(\"destroy\");\n            }\n        }\n    }\n\n    show(): void {\n        $(this.domElements.main).show();\n    }\n\n    hide(): void {\n        $(this.domElements.main).hide();\n    }\n\n    setExternal(params) {\n        this.external = params;\n        if (typeof this.external.mapIsGeo !== \"undefined\") {\n            this.mapIsGeo = this.external.mapIsGeo;\n        }\n        if (typeof this.external.editMode !== \"undefined\") {\n            this.editMode = this.external.editMode;\n        }\n        if (typeof this.external.filtersMode !== \"undefined\") {\n            this.filtersMode = this.external.filtersMode;\n        }\n        if (typeof this.external.namespace !== \"undefined\") {\n            this.namespace = this.external.namespace;\n        }\n    }\n\n    getValue(): any {\n        return this.value;\n    }\n\n    setValue(value: any, updateInput = true): void {\n        this.value = value;\n        if (updateInput) {\n            this.setInputValue(value);\n        }\n    }\n\n    setInputValue(value: any): void {\n        return;\n    }\n\n    triggerChanged() {\n        this.events.trigger(\"changed\", this, [this]);\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class CheckboxFormElement extends FormElement {\n    checkboxLabel: string;\n    checkboxValue: string;\n    showAsSwitch: boolean;\n    inputs: { checkbox: HTMLInputElement; switch: HTMLInputElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        if (typeof options.showAsSwitch === \"undefined\") {\n            this.showAsSwitch = true;\n        } else {\n            this.showAsSwitch = options.showAsSwitch;\n        }\n        this.db_type = \"tinyint(1)\";\n        this.checkboxLabel = options.checkboxLabel;\n        this.checkboxValue = options.checkboxValue;\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.checkbox = $(this.domElements.main).find(\"input\")[0];\n        this.inputs.switch = $(this.domElements.main).find(\"input\")[0];\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.checkbox).on(\"change\", (e) => {\n            this.setValue(e.target.checked, false);\n            this.triggerChanged();\n        });\n    }\n\n    setEditorEventHandlers() {\n        super.setEditorEventHandlers();\n\n        $(this.domElements.edit).on(\"change\", \"[name='showAsSwitch']\", (e) => {\n            if (this.showAsSwitch) {\n                $(this.domElements.main)\n                    .find(\"[name='checkboxToSwitch']\")\n                    .addClass(\"form-switch form-switch-md\");\n            }\n            if (!this.showAsSwitch) {\n                $(this.domElements.main)\n                    .find(\"[name='checkboxToSwitch']\")\n                    .removeClass(\"form-switch form-switch-md\");\n            }\n        });\n\n        $(this.domElements.edit).on(\"keyup change paste\", '[name=\"checkboxLabel\"]', (e) => {\n            $(this.domElements.main).find(\".form-check-label\").text(e.target.value);\n        });\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        if (this.checkboxLabel) {\n            schema.checkboxLabel = this.checkboxLabel;\n        }\n        if (this.checkboxValue) {\n            schema.checkboxValue = this.checkboxValue;\n        }\n\n        schema.showAsSwitch = this.showAsSwitch;\n\n        return schema;\n    }\n\n    setInputValue(value: boolean): void {\n        this.inputs.checkbox.checked = value === true;\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\n// TODO add checkboxes to regions as well\n\nexport class CheckboxesFormElement extends FormElement {\n    checkboxLabel: string;\n    checkboxValue: string;\n    $checkboxes: any;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.db_type = \"text\";\n        this.checkboxLabel = options.checkboxLabel;\n\n        this.setOptions(options.options);\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.$checkboxes = $(this.domElements.main).find('input[type=\"checkbox\"]');\n        this.setInputValue(this.value || []);\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        this.$checkboxes.on(\"change\", (e) => {\n            const values = [];\n            $(this.domElements.main)\n                .find(\"input:checked\")\n                .each((i, el) => {\n                    values.push(jQuery(el).attr(\"value\"));\n                });\n            this.setValue(values, false);\n            this.triggerChanged();\n        });\n    }\n\n    setInputValue(values: string[] | null): void {\n        if (values === null) {\n            $(this.domElements.main).find(`input`).prop(\"checked\", false);\n        } else {\n            values.forEach((value: string) => {\n                $(this.domElements.main).find(`input[value=\"${value}\"]`).prop(\"checked\", true);\n            });\n        }\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class DateFormElement extends FormElement {\n    languages: string[];\n    language: string;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        if (this.formBuilder.admin) {\n            this.languages = [\n                \"en-GB\",\n                \"ar\",\n                \"az\",\n                \"bg\",\n                \"bs\",\n                \"ca\",\n                \"cs\",\n                \"cy\",\n                \"da\",\n                \"de\",\n                \"el\",\n                \"es\",\n                \"et\",\n                \"eu\",\n                \"fa\",\n                \"fi\",\n                \"fo\",\n                \"fr\",\n                \"gl\",\n                \"he\",\n                \"hr\",\n                \"hu\",\n                \"hy\",\n                \"id\",\n                \"is\",\n                \"it\",\n                \"ja\",\n                \"ka\",\n                \"kh\",\n                \"kk\",\n                \"kr\",\n                \"lt\",\n                \"lv\",\n                \"mk\",\n                \"ms\",\n                \"nb\",\n                \"nl\",\n                \"nl-BE\",\n                \"no\",\n                \"pl\",\n                \"pt-BR\",\n                \"pt\",\n                \"ro\",\n                \"rs\",\n                \"rs-latin\",\n                \"ru\",\n                \"sk\",\n                \"sl\",\n                \"sq\",\n                \"sr\",\n                \"sr-latin\",\n                \"sv\",\n                \"sw\",\n                \"th\",\n                \"tr\",\n                \"uk\",\n                \"vi\",\n                \"zh-CN\",\n                \"zh-TW\",\n            ];\n        }\n        this.db_type = \"varchar(50)\";\n        this.language = options.language;\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.date = $(this.domElements.main).find(\"input\")[0];\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.date).on(\"change\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.language = this.language;\n        return schema;\n    }\n\n    getDataForTemplate(): { [p: string]: any } {\n        const data = super.getDataForTemplate();\n        if (this.formBuilder.admin) data.languages = this.languages;\n        data.language = this.language;\n        return data;\n    }\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\n// @ts-ignore\nimport Bloodhound from \"Bloodhound\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\nimport { Server } from \"../../../Infrastructure/Server/Server\";\nimport { Location } from \"../../../Location/Location\";\nimport GeocoderRequest = google.maps.GeocoderRequest;\n\nconst $ = jQuery;\n\nexport class DistanceFormElement extends FormElement {\n    inputs: {\n        units: HTMLInputElement;\n        geoPoint: HTMLInputElement;\n        length: HTMLInputElement;\n        address: HTMLInputElement;\n        country: HTMLInputElement;\n    };\n    value: {\n        units: string;\n        geoPoint: { lat: string | number; lng: string | number };\n        length: number;\n        address: string;\n        country: string;\n    };\n    distanceControl: string;\n    distanceUnits: string;\n    distanceUnitsLabel: string;\n    fromLabel: string;\n    placeholder: string;\n    userLocationButton: boolean;\n    addressField: boolean;\n    addressFieldPlaceholder: string;\n    languages: { [key: string]: string }[];\n    countries: string[];\n    country: string;\n    language: string;\n    searchByZip: boolean;\n    zipLength: number;\n    isGeo: boolean;\n    defaultLength: number;\n    spinner: HTMLElement;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.name = \"distance\";\n\n        this.label = this.label || (options.label === undefined ? \"Search radius\" : options.label);\n        this.distanceControl = options.distanceControl || \"select\";\n        this.distanceUnits = options.distanceUnits || \"km\";\n        this.distanceUnitsLabel = options.distanceUnitsLabel || \"km\";\n        this.fromLabel = options.fromLabel || \"from\";\n        this.placeholder = options.placeholder;\n        this.userLocationButton = options.userLocationButton || false;\n        this.type = options.type;\n        this.addressField = options.addressField || true;\n        this.addressFieldPlaceholder = options.addressFieldPlaceholder || \"Address\";\n        this.languages = [\n            { value: \"sq\", label: \"Albanian\" },\n            { value: \"ar\", label: \"Arabic\" },\n            {\n                value: \"eu\",\n                label: \"Basque\",\n            },\n            { value: \"be\", label: \"Belarusian\" },\n            { value: \"bg\", label: \"Bulgarian\" },\n            {\n                value: \"my\",\n                label: \"Burmese\",\n            },\n            { value: \"bn\", label: \"Bengali\" },\n            { value: \"ca\", label: \"Catalan\" },\n            {\n                value: \"zh-cn\",\n                label: \"Chinese (simplified)\",\n            },\n            { value: \"zh-tw\", label: \"Chinese (traditional)\" },\n            {\n                value: \"hr\",\n                label: \"Croatian\",\n            },\n            { value: \"cs\", label: \"Czech\" },\n            { value: \"da\", label: \"Danish\" },\n            {\n                value: \"nl\",\n                label: \"Dutch\",\n            },\n            { value: \"en\", label: \"English\" },\n            {\n                value: \"en-au\",\n                label: \"English (australian)\",\n            },\n            { value: \"en-gb\", label: \"English (great Britain)\" },\n            {\n                value: \"fa\",\n                label: \"Farsi\",\n            },\n            { value: \"fi\", label: \"Finnish\" },\n            { value: \"fil\", label: \"Filipino\" },\n            {\n                value: \"fr\",\n                label: \"French\",\n            },\n            { value: \"gl\", label: \"Galician\" },\n            { value: \"de\", label: \"German\" },\n            {\n                value: \"el\",\n                label: \"Greek\",\n            },\n            { value: \"gu\", label: \"Gujarati\" },\n            { value: \"iw\", label: \"Hebrew\" },\n            {\n                value: \"hi\",\n                label: \"Hindi\",\n            },\n            { value: \"hu\", label: \"Hungarian\" },\n            { value: \"id\", label: \"Indonesian\" },\n            {\n                value: \"it\",\n                label: \"Italian\",\n            },\n            { value: \"ja\", label: \"Japanese\" },\n            { value: \"kn\", label: \"Kannada\" },\n            {\n                value: \"kk\",\n                label: \"Kazakh\",\n            },\n            { value: \"ko\", label: \"Korean\" },\n            { value: \"ky\", label: \"Kyrgyz\" },\n            {\n                value: \"lt\",\n                label: \"Lithuanian\",\n            },\n            { value: \"lv\", label: \"Latvian\" },\n            { value: \"mk\", label: \"Macedonian\" },\n            {\n                value: \"ml\",\n                label: \"Malayalam\",\n            },\n            { value: \"mr\", label: \"Marathi\" },\n            { value: \"no\", label: \"Norwegian\" },\n            {\n                value: \"pl\",\n                label: \"Polish\",\n            },\n            { value: \"pt\", label: \"Portuguese\" },\n            {\n                value: \"pt-br\",\n                label: \"Portuguese (brazil)\",\n            },\n            { value: \"pt-pt\", label: \"Portuguese (portugal)\" },\n            {\n                value: \"pa\",\n                label: \"Punjabi\",\n            },\n            { value: \"ro\", label: \"Romanian\" },\n            { value: \"ru\", label: \"Russian\" },\n            {\n                value: \"sr\",\n                label: \"Serbian\",\n            },\n            { value: \"sk\", label: \"Slovak\" },\n            { value: \"sl\", label: \"Slovenian\" },\n            {\n                value: \"es\",\n                label: \"Spanish\",\n            },\n            { value: \"sv\", label: \"Swedish\" },\n            { value: \"tl\", label: \"Tagalog\" },\n            {\n                value: \"ta\",\n                label: \"Tamil\",\n            },\n            { value: \"te\", label: \"Telugu\" },\n            { value: \"th\", label: \"Thai\" },\n            {\n                value: \"tr\",\n                label: \"Turkish\",\n            },\n            { value: \"uk\", label: \"Ukrainian\" },\n            { value: \"uz\", label: \"Uzbek\" },\n            {\n                value: \"vi\",\n                label: \"Vietnamese\",\n            },\n        ];\n        // @ts-ignore\n        this.countries = MapSVG.countries;\n        this.country = options.country;\n        this.language = options.language;\n        this.searchByZip = options.searchByZip;\n        this.zipLength = parseInt(options.zipLength) || 5;\n        this.userLocationButton = MapSVG.parseBoolean(options.userLocationButton);\n        this.options = options.options || [\n            { value: \"10\", default: true },\n            { value: \"30\", default: false },\n            { value: \"50\", default: false },\n            { value: \"100\", default: false },\n        ];\n\n        let defOption: { value: number };\n        if (this.value) {\n            this.options.forEach((option) => {\n                if (option.value === this.value.length) {\n                    defOption = option;\n                }\n            });\n        }\n        if (!defOption) {\n            defOption = this.options.find(function (option) {\n                return option.default === true;\n            });\n        }\n        if (!defOption) {\n            defOption = this.options[0];\n        }\n        const defLengthOption = this.options.find((opt) => opt.selected === true);\n        this.defaultLength = defOption.value;\n        this.setDefaultValue();\n    }\n\n    private setDefaultValue(): void {\n        this.value = {\n            units: this.distanceUnits,\n            geoPoint: { lat: null, lng: null },\n            length: this.defaultLength,\n            address: \"\",\n            country: this.country,\n        };\n    }\n\n    setDomElements(): void {\n        super.setDomElements();\n\n        this.inputs.units = <HTMLInputElement>(\n            $(this.domElements.main).find('[name=\"distanceUnits\"]')[0]\n        );\n        this.inputs.geoPoint = <HTMLInputElement>(\n            $(this.domElements.main).find('[name=\"distanceGeoPoint\"]')[0]\n        );\n        this.inputs.length = <HTMLInputElement>(\n            $(this.domElements.main).find('[name=\"distanceLength\"]')[0]\n        );\n        this.inputs.address = <HTMLInputElement>(\n            $(this.domElements.main).find('[name=\"distance\"]')[0]\n        );\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.distanceControl = this.distanceControl;\n        schema.distanceUnits = this.distanceUnits;\n        schema.distanceUnitsLabel = this.distanceUnitsLabel;\n        schema.fromLabel = this.fromLabel;\n        schema.addressField = this.addressField;\n        schema.addressFieldPlaceholder = this.addressFieldPlaceholder;\n        schema.userLocationButton = this.userLocationButton;\n        schema.placeholder = this.placeholder;\n        schema.language = this.language;\n        schema.country = this.country;\n        schema.searchByZip = this.searchByZip;\n        schema.zipLength = parseInt(this.zipLength + \"\");\n        schema.userLocationButton = MapSVG.parseBoolean(this.userLocationButton);\n        if (schema.distanceControl === \"none\") {\n            schema.distanceDefault = schema.options.filter(function (o) {\n                return o.default;\n            })[0].value;\n        }\n\n        schema.options.forEach(function (option, index) {\n            if (schema.options[index].value === \"\") {\n                schema.options.splice(index, 1);\n            } else {\n                schema.options[index].default = MapSVG.parseBoolean(schema.options[index].default);\n                // data.optionsDict[option.value] = option;\n            }\n        });\n\n        return schema;\n    }\n\n    getDataForTemplate(): { [key: string]: any } {\n        const data = super.getDataForTemplate();\n\n        if (this.formBuilder.admin) {\n            data.languages = this.languages;\n            data.countries = this.countries;\n        }\n        data.language = this.language;\n        data.country = this.country;\n        data.searchByZip = this.searchByZip;\n        data.zipLength = this.zipLength;\n        data.userLocationButton = MapSVG.parseBoolean(this.userLocationButton);\n        return data;\n    }\n\n    destroy() {\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                sel.mselect2(\"destroy\");\n            }\n        }\n    }\n\n    initEditor() {\n        super.initEditor();\n        this.mayBeAddDistanceRow();\n        if ($().mselect2) {\n            $(this.domElements.edit).find(\"select\").mselect2();\n        }\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n\n        const _this = this;\n\n        $(this.domElements.edit).on(\n            \"keyup change paste\",\n            \".mapsvg-edit-distance-row input\",\n            function () {\n                _this.mayBeAddDistanceRow();\n            }\n        );\n\n        const server = new Server();\n\n        // TODO check if distance filter is working:\n        // Google geocoding\n        const locations = new Bloodhound({\n            datumTokenizer: Bloodhound.tokenizers.obj.whitespace(\"formatted_address\"),\n            queryTokenizer: Bloodhound.tokenizers.whitespace,\n            remote: {\n                url:\n                    server.getUrl(\"geocoding\") +\n                    \"?address=\" +\n                    (this.searchByZip === true ? \"zip%20\" : \"\") +\n                    \"%QUERY%&language=\" +\n                    this.language +\n                    (this.country ? \"&country=\" + this.country : \"\"),\n                wildcard: \"%QUERY%\",\n                transform: function (response) {\n                    if (response.error_message) {\n                        alert(response.error_message);\n                    }\n                    return response.results;\n                },\n                rateLimitWait: 600,\n            },\n        });\n\n        const thContainer = $(this.domElements.main).find(\".typeahead\");\n        this.spinner = $(\"<span class='spinner-border spinner-border-sm'></span>\")[0];\n\n        if (this.searchByZip) {\n            // var tH = thContainer.typeahead({minLength: this.zipLength, autoselect: true}, {\n            //     name: 'mapsvg-addresses',\n            //     source: locations,\n            //     display: 'formatted_address',\n            // });\n            $(this.domElements.main).find(\".mapsvg-distance-fields\").addClass(\"search-by-zip\");\n            // thContainer.on('typeahead:asyncreceive',function(ev,query,dataset){\n            //     console.log(ev,query,dataset);\n            // });\n            thContainer.on(\"change keyup\", (e) => {\n                const zip = $(e.target).val().toString();\n                if (zip.length === _this.zipLength) {\n                    $(this.spinner).appendTo($(e.target).closest(\".distance-search-wrap\"));\n                    this.formBuilder.setIsLoading(true);\n                    locations.search(\n                        $(e.target).val(),\n                        (data) => this.handleAddressFieldChange(zip, data),\n                        (data) => this.handleAddressFieldChange(zip, data, true)\n                    );\n                }\n            });\n        } else {\n            // @ts-ignore\n            const tH = thContainer\n                .typeahead(\n                    { minLength: 3 },\n                    {\n                        name: \"mapsvg-addresses\",\n                        display: \"formatted_address\",\n                        limit: 5,\n                        async: true,\n                        // @ts-ignore\n                        source: (query, sync, async) => {\n                            const request = { address: query } as GeocoderRequest;\n                            if (this.country) {\n                                request.componentRestrictions = { country: this.country };\n                            }\n                            MapSVG.geocode(request, async);\n                        },\n                    }\n                )\n                .on(\"typeahead:asyncrequest\", (e) => {\n                    $(this.spinner).appendTo($(e.target).closest(\".twitter-typeahead\"));\n                    this.formBuilder.setIsLoading(true);\n                })\n                .on(\"typeahead:asynccancel typeahead:asyncreceive\", (e) => {\n                    $(this.spinner).remove();\n                    this.formBuilder.setIsLoading(false);\n                });\n            $(this.domElements.main).find(\".mapsvg-distance-fields\").removeClass(\"search-by-zip\");\n        }\n\n        if (_this.userLocationButton) {\n            const userLocationButton = $(this.domElements.main).find(\".user-location-button\");\n            userLocationButton.on(\"click\", () => {\n                _this.formBuilder.mapsvg.showUserLocation((location: Location) => {\n                    locations.search(\n                        location.geoPoint.lat + \",\" + location.geoPoint.lng,\n                        (data) => this.setAddressByUserLocation(data, location),\n                        (data) => this.setAddressByUserLocation(data, location)\n                    );\n                    this.setValue({ geoPoint: location.geoPoint });\n                    this.triggerChanged();\n                });\n            });\n        }\n\n        thContainer.on(\"change keyup\", (e) => {\n            const input = <HTMLInputElement>e.target;\n            if (input.value === \"\" && this.getValue() !== null) {\n                this.setValue(null);\n                this.triggerChanged();\n            }\n        });\n        thContainer.on(\"typeahead:select\", (ev, item) => {\n            this.setValue({\n                address: item.formatted_address,\n                geoPoint: item.geometry.location.toJSON(),\n            });\n            this.triggerChanged();\n            thContainer.blur();\n        });\n\n        $(this.inputs.geoPoint).on(\"change\", (e) => {\n            const geoPoint = e.target.value.split(\",\").map((value) => parseFloat(value));\n            this.setValue({ geoPoint: { lat: geoPoint[0], lng: geoPoint[1] } }, false);\n            this.triggerChanged();\n        });\n        $(this.inputs.length).on(\"change\", (e) => {\n            this.setLength(parseInt(e.target.value), false);\n            this.triggerChanged();\n        });\n    }\n    setAddressByUserLocation(data, location): void {\n        if (data && data[0]) {\n            this.setAddress(data[0].formatted_address);\n        } else {\n            this.setAddress(location.geoPoint.lat + \",\" + location.geoPoint.lng);\n        }\n    }\n    handleAddressFieldChange(zip: string, data, removeSpinner = false): void {\n        if (removeSpinner) {\n            $(this.spinner).remove();\n            this.formBuilder.setIsLoading(false);\n        }\n        if (data && data[0]) {\n            this.setValue({ address: zip, geoPoint: data[0].geometry.location }, false);\n            this.triggerChanged();\n        }\n    }\n\n    addSelect2(): void {\n        if ($().mselect2) {\n            $(this.domElements.main)\n                .find(\"select\")\n                .mselect2()\n                .on(\"select2:focus\", function () {\n                    $(this).mselect2(\"open\");\n                });\n        }\n    }\n\n    mayBeAddDistanceRow(): void {\n        const _this = this;\n        const editDistanceRow = $($(\"#mapsvg-edit-distance-row\").html());\n        // if there's something in the last status edit field, add +1 status row\n        const z = $(_this.domElements.edit).find(\".mapsvg-edit-distance-row:last-child input\");\n        if (z && z.last() && z.last().val() && z.last().val().toString().trim().length) {\n            const newRow = editDistanceRow.clone();\n            newRow.insertAfter(\n                $(_this.domElements.edit).find(\".mapsvg-edit-distance-row:last-child\")\n            );\n        }\n        const rows = $(_this.domElements.edit).find(\".mapsvg-edit-distance-row\");\n        const row1 = rows.eq(rows.length - 2);\n        const row2 = rows.eq(rows.length - 1);\n\n        if (\n            row1.length &&\n            row2.length &&\n            !row1.find(\"input:eq(0)\").val().toString().trim() &&\n            !row2.find(\"input:eq(0)\").val().toString().trim()\n        ) {\n            row2.remove();\n        }\n    }\n\n    setValue(value: any, updateInput = true): void {\n        if (value === null) {\n            this.setGeoPoint(null);\n            this.setAddress(\"\");\n        } else {\n            for (const key in value) {\n                if (typeof this.value[key] !== undefined) {\n                    const method = \"set\" + MapSVG.ucfirst(key);\n                    if (typeof this[method] === \"function\") {\n                        this[method](value[key], updateInput);\n                    }\n                }\n            }\n        }\n    }\n\n    setGeoPoint(geoPoint: { lat: number; lng: number }, updateInput = true): void {\n        this.value.geoPoint = geoPoint === null ? { lat: null, lng: null } : geoPoint;\n        if (updateInput) {\n            this.setInputGeoPointValue(geoPoint);\n        }\n    }\n\n    setInputGeoPointValue(geoPoint: { lat: number; lng: number }): void {\n        this.inputs.geoPoint.value = geoPoint ? geoPoint.lat + \",\" + geoPoint.lng : \"\";\n    }\n\n    setLength(length: number | string, updateInput = true): void {\n        this.value.length = parseInt(length.toString());\n        this.defaultLength = this.value.length;\n        if (updateInput) {\n            this.setInputLengthValue(this.value.length);\n        }\n    }\n\n    setInputLengthValue(length: number): void {\n        this.inputs.length.value = length.toString();\n    }\n\n    setAddress(address: string, updateInput = true): void {\n        this.value.address = address !== null ? address : \"\";\n        if (updateInput) {\n            this.setInputAddressValue(this.value.address);\n        }\n    }\n\n    setInputAddressValue(address: string): void {\n        this.inputs.address.value = address;\n    }\n\n    getValue(): any {\n        return this.value.geoPoint.lat === null ? null : this.value;\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class EmptyFormElement extends FormElement {\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.readonly = true;\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nexport class IdFormElement extends FormElement {\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n    }\n\n    getData(): any {\n        return { name: \"id\", value: this.value };\n    }\n}\n","/**!\n * Sortable\n * @author\tRubaXa   <trash@rubaxa.org>\n * @license MIT\n */\n\n(function sortableModule(factory) {\n    \"use strict\";\n\n    if (typeof define === \"function\" && define.amd) {\n        define(factory);\n    } else if (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n        module.exports = factory();\n    } else if (typeof Package !== \"undefined\") {\n        //noinspection JSUnresolvedVariable\n        Sortable = factory(); // export for Meteor.js\n    } else {\n        /* jshint sub:true */\n        window[\"Sortable\"] = factory();\n    }\n})(function sortableFactory() {\n    \"use strict\";\n\n    if (typeof window == \"undefined\" || !window.document) {\n        return function sortableError() {\n            throw new Error(\"Sortable.js requires a window with a document\");\n        };\n    }\n\n    var dragEl,\n        parentEl,\n        ghostEl,\n        cloneEl,\n        rootEl,\n        nextEl,\n        scrollEl,\n        scrollParentEl,\n        scrollCustomFn,\n        lastEl,\n        lastCSS,\n        lastParentCSS,\n        oldIndex,\n        newIndex,\n        activeGroup,\n        putSortable,\n        autoScroll = {},\n        tapEvt,\n        touchEvt,\n        moved,\n        /** @const */\n        RSPACE = /\\s+/g,\n        expando = \"Sortable\" + new Date().getTime(),\n        win = window,\n        document = win.document,\n        parseInt = win.parseInt,\n        $ = win.jQuery || win.Zepto,\n        Polymer = win.Polymer,\n        supportDraggable = !!(\"draggable\" in document.createElement(\"div\")),\n        supportCssPointerEvents = (function (el) {\n            // false when IE11\n            if (navigator.userAgent.match(/Trident.*rv[ :]?11\\./)) {\n                return false;\n            }\n            el = document.createElement(\"x\");\n            el.style.cssText = \"pointer-events:auto\";\n            return el.style.pointerEvents === \"auto\";\n        })(),\n        _silent = false,\n        abs = Math.abs,\n        min = Math.min,\n        slice = [].slice,\n        touchDragOverListeners = [],\n        _autoScroll = _throttle(function (\n            /**Event*/ evt,\n            /**Object*/ options,\n            /**HTMLElement*/ rootEl\n        ) {\n            // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n            if (rootEl && options.scroll) {\n                var el,\n                    rect,\n                    sens = options.scrollSensitivity,\n                    speed = options.scrollSpeed,\n                    x = evt.clientX,\n                    y = evt.clientY,\n                    winWidth = window.innerWidth,\n                    winHeight = window.innerHeight,\n                    vx,\n                    vy,\n                    scrollOffsetX,\n                    scrollOffsetY;\n\n                // Delect scrollEl\n                if (scrollParentEl !== rootEl) {\n                    scrollEl = options.scroll;\n                    scrollParentEl = rootEl;\n                    scrollCustomFn = options.scrollFn;\n\n                    if (scrollEl === true) {\n                        scrollEl = rootEl;\n\n                        do {\n                            if (\n                                scrollEl.offsetWidth < scrollEl.scrollWidth ||\n                                scrollEl.offsetHeight < scrollEl.scrollHeight\n                            ) {\n                                break;\n                            }\n                            /* jshint boss:true */\n                        } while ((scrollEl = scrollEl.parentNode));\n                    }\n                }\n\n                if (scrollEl) {\n                    el = scrollEl;\n                    rect = scrollEl.getBoundingClientRect();\n                    vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens);\n                    vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens);\n                }\n\n                if (!(vx || vy)) {\n                    vx = (winWidth - x <= sens) - (x <= sens);\n                    vy = (winHeight - y <= sens) - (y <= sens);\n\n                    /* jshint expr:true */\n                    (vx || vy) && (el = win);\n                }\n\n                if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) {\n                    autoScroll.el = el;\n                    autoScroll.vx = vx;\n                    autoScroll.vy = vy;\n\n                    clearInterval(autoScroll.pid);\n\n                    if (el) {\n                        autoScroll.pid = setInterval(function () {\n                            scrollOffsetY = vy ? vy * speed : 0;\n                            scrollOffsetX = vx ? vx * speed : 0;\n\n                            if (\"function\" === typeof scrollCustomFn) {\n                                return scrollCustomFn.call(\n                                    _this,\n                                    scrollOffsetX,\n                                    scrollOffsetY,\n                                    evt\n                                );\n                            }\n\n                            if (el === win) {\n                                win.scrollTo(\n                                    win.pageXOffset + scrollOffsetX,\n                                    win.pageYOffset + scrollOffsetY\n                                );\n                            } else {\n                                el.scrollTop += scrollOffsetY;\n                                el.scrollLeft += scrollOffsetX;\n                            }\n                        }, 24);\n                    }\n                }\n            }\n        },\n        30),\n        _prepareGroup = function (options) {\n            function toFn(value, pull) {\n                if (value === void 0 || value === true) {\n                    value = group.name;\n                }\n\n                if (typeof value === \"function\") {\n                    return value;\n                } else {\n                    return function (to, from) {\n                        var fromGroup = from.options.group.name;\n\n                        return pull\n                            ? value\n                            : value &&\n                                  (value.join ? value.indexOf(fromGroup) > -1 : fromGroup == value);\n                    };\n                }\n            }\n\n            var group = {};\n            var originalGroup = options.group;\n\n            if (!originalGroup || typeof originalGroup != \"object\") {\n                originalGroup = { name: originalGroup };\n            }\n\n            group.name = originalGroup.name;\n            group.checkPull = toFn(originalGroup.pull, true);\n            group.checkPut = toFn(originalGroup.put);\n\n            options.group = group;\n        };\n    /**\n     * @class  Sortable\n     * @param  {HTMLElement}  el\n     * @param  {Object}       [options]\n     */\n    function Sortable(el, options) {\n        if (!(el && el.nodeType && el.nodeType === 1)) {\n            throw \"Sortable: `el` must be HTMLElement, and not \" + {}.toString.call(el);\n        }\n\n        this.el = el; // root element\n        this.options = options = _extend({}, options);\n\n        // Export instance\n        el[expando] = this;\n\n        // Default options\n        var defaults = {\n            group: Math.random(),\n            sort: true,\n            disabled: false,\n            store: null,\n            handle: null,\n            scroll: true,\n            scrollSensitivity: 30,\n            scrollSpeed: 10,\n            draggable: /[uo]l/i.test(el.nodeName) ? \"li\" : \">*\",\n            ghostClass: \"sortable-ghost\",\n            chosenClass: \"sortable-chosen\",\n            dragClass: \"sortable-drag\",\n            ignore: \"a, img\",\n            filter: null,\n            animation: 0,\n            setData: function (dataTransfer, dragEl) {\n                dataTransfer.setData(\"Text\", dragEl.textContent);\n            },\n            dropBubble: false,\n            dragoverBubble: false,\n            dataIdAttr: \"data-id\",\n            delay: 0,\n            forceFallback: false,\n            fallbackClass: \"sortable-fallback\",\n            fallbackOnBody: false,\n            fallbackTolerance: 0,\n            fallbackOffset: { x: 0, y: 0 },\n        };\n\n        // Set default options\n        for (var name in defaults) {\n            !(name in options) && (options[name] = defaults[name]);\n        }\n\n        _prepareGroup(options);\n\n        // Bind all private methods\n        for (var fn in this) {\n            if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") {\n                this[fn] = this[fn].bind(this);\n            }\n        }\n\n        // Setup drag mode\n        this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n        // Bind events\n        _on(el, \"mousedown\", this._onTapStart);\n        _on(el, \"touchstart\", this._onTapStart);\n\n        if (this.nativeDraggable) {\n            _on(el, \"dragover\", this);\n            _on(el, \"dragenter\", this);\n        }\n\n        touchDragOverListeners.push(this._onDragOver);\n\n        // Restore sorting\n        options.store && this.sort(options.store.get(this));\n    }\n\n    Sortable.prototype = /** @lends Sortable.prototype */ {\n        constructor: Sortable,\n\n        _onTapStart: function (/** Event|TouchEvent */ evt) {\n            if (evt.target.tagName == \"i\" || evt.target.tagName == \"I\") {\n                evt.target.click();\n                return;\n            }\n            var _this = this,\n                el = this.el,\n                options = this.options,\n                type = evt.type,\n                touch = evt.touches && evt.touches[0],\n                target = (touch || evt).target,\n                originalTarget = (evt.target.shadowRoot && evt.path[0]) || target,\n                filter = options.filter,\n                startIndex;\n\n            // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n            if (dragEl) {\n                return;\n            }\n\n            if ((type === \"mousedown\" && evt.button !== 0) || options.disabled) {\n                return; // only left button or enabled\n            }\n\n            if (options.handle && !_closest(originalTarget, options.handle, el)) {\n                return;\n            }\n\n            target = _closest(target, options.draggable, el);\n\n            if (!target) {\n                return;\n            }\n\n            // Get the index of the dragged element within its parent\n            startIndex = _index(target, options.draggable);\n\n            // Check filter\n            if (typeof filter === \"function\") {\n                if (filter.call(this, evt, target, this)) {\n                    _dispatchEvent(_this, originalTarget, \"filter\", target, el, startIndex);\n                    evt.preventDefault();\n                    return; // cancel dnd\n                }\n            } else if (filter) {\n                filter = filter.split(\",\").some(function (criteria) {\n                    criteria = _closest(originalTarget, criteria.trim(), el);\n\n                    if (criteria) {\n                        _dispatchEvent(_this, criteria, \"filter\", target, el, startIndex);\n                        return true;\n                    }\n                });\n\n                if (filter) {\n                    evt.preventDefault();\n                    return; // cancel dnd\n                }\n            }\n\n            // Prepare `dragstart`\n            this._prepareDragStart(evt, touch, target, startIndex);\n        },\n\n        _prepareDragStart: function (\n            /** Event */ evt,\n            /** Touch */ touch,\n            /** HTMLElement */ target,\n            /** Number */ startIndex\n        ) {\n            var _this = this,\n                el = _this.el,\n                options = _this.options,\n                ownerDocument = el.ownerDocument,\n                dragStartFn;\n\n            if (target && !dragEl && target.parentNode === el) {\n                tapEvt = evt;\n\n                rootEl = el;\n                dragEl = target;\n                parentEl = dragEl.parentNode;\n                nextEl = dragEl.nextSibling;\n                activeGroup = options.group;\n                oldIndex = startIndex;\n\n                this._lastX = (touch || evt).clientX;\n                this._lastY = (touch || evt).clientY;\n\n                dragEl.style[\"will-change\"] = \"transform\";\n\n                dragStartFn = function () {\n                    // Delayed drag has been triggered\n                    // we can re-enable the events: touchmove/mousemove\n                    _this._disableDelayedDrag();\n\n                    // Make the element draggable\n                    dragEl.draggable = _this.nativeDraggable;\n\n                    // Chosen item\n                    _toggleClass(dragEl, options.chosenClass, true);\n\n                    // Bind the events: dragstart/dragend\n                    _this._triggerDragStart(touch);\n\n                    // Drag start event\n                    _dispatchEvent(_this, rootEl, \"choose\", dragEl, rootEl, oldIndex);\n                };\n\n                // Disable \"draggable\"\n                options.ignore.split(\",\").forEach(function (criteria) {\n                    _find(dragEl, criteria.trim(), _disableDraggable);\n                });\n\n                _on(ownerDocument, \"mouseup\", _this._onDrop);\n                _on(ownerDocument, \"touchend\", _this._onDrop);\n                _on(ownerDocument, \"touchcancel\", _this._onDrop);\n\n                if (options.delay) {\n                    // If the user moves the pointer or let go the click or touch\n                    // before the delay has been reached:\n                    // disable the delayed drag\n                    _on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n                    _on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n                    _on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n                    _on(ownerDocument, \"mousemove\", _this._disableDelayedDrag);\n                    _on(ownerDocument, \"touchmove\", _this._disableDelayedDrag);\n\n                    _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n                } else {\n                    dragStartFn();\n                }\n            }\n        },\n\n        _disableDelayedDrag: function () {\n            var ownerDocument = this.el.ownerDocument;\n\n            clearTimeout(this._dragStartTimer);\n            _off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n            _off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n            _off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n            _off(ownerDocument, \"mousemove\", this._disableDelayedDrag);\n            _off(ownerDocument, \"touchmove\", this._disableDelayedDrag);\n        },\n\n        _triggerDragStart: function (/** Touch */ touch) {\n            if (touch) {\n                // Touch device support\n                tapEvt = {\n                    target: dragEl,\n                    clientX: touch.clientX,\n                    clientY: touch.clientY,\n                };\n\n                this._onDragStart(tapEvt, \"touch\");\n            } else if (!this.nativeDraggable) {\n                this._onDragStart(tapEvt, true);\n            } else {\n                _on(dragEl, \"dragend\", this);\n                _on(rootEl, \"dragstart\", this._onDragStart);\n            }\n\n            try {\n                if (document.selection) {\n                    // Timeout neccessary for IE9\n                    setTimeout(function () {\n                        document.selection.empty();\n                    });\n                } else {\n                    window.getSelection().removeAllRanges();\n                }\n            } catch (err) {}\n        },\n\n        _dragStarted: function () {\n            if (rootEl && dragEl) {\n                var options = this.options;\n\n                // Apply effect\n                _toggleClass(dragEl, options.ghostClass, true);\n                _toggleClass(dragEl, options.dragClass, false);\n\n                Sortable.active = this;\n\n                // Drag start event\n                _dispatchEvent(this, rootEl, \"start\", dragEl, rootEl, oldIndex);\n            }\n        },\n\n        _emulateDragOver: function () {\n            if (touchEvt) {\n                if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) {\n                    return;\n                }\n\n                this._lastX = touchEvt.clientX;\n                this._lastY = touchEvt.clientY;\n\n                if (!supportCssPointerEvents) {\n                    _css(ghostEl, \"display\", \"none\");\n                }\n\n                var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY),\n                    parent = target,\n                    i = touchDragOverListeners.length;\n\n                if (parent) {\n                    do {\n                        if (parent[expando]) {\n                            while (i--) {\n                                touchDragOverListeners[i]({\n                                    clientX: touchEvt.clientX,\n                                    clientY: touchEvt.clientY,\n                                    target: target,\n                                    rootEl: parent,\n                                });\n                            }\n\n                            break;\n                        }\n\n                        target = parent; // store last element\n                    } while (\n                        /* jshint boss:true */\n                        (parent = parent.parentNode)\n                    );\n                }\n\n                if (!supportCssPointerEvents) {\n                    _css(ghostEl, \"display\", \"\");\n                }\n            }\n        },\n\n        _onTouchMove: function (/**TouchEvent*/ evt) {\n            if (tapEvt) {\n                var options = this.options,\n                    fallbackTolerance = options.fallbackTolerance,\n                    fallbackOffset = options.fallbackOffset,\n                    touch = evt.touches ? evt.touches[0] : evt,\n                    dx = touch.clientX - tapEvt.clientX + fallbackOffset.x,\n                    dy = touch.clientY - tapEvt.clientY + fallbackOffset.y,\n                    translate3d = evt.touches\n                        ? \"translate3d(\" + dx + \"px,\" + dy + \"px,0)\"\n                        : \"translate(\" + dx + \"px,\" + dy + \"px)\";\n\n                // only set the status to dragging, when we are actually dragging\n                if (!Sortable.active) {\n                    if (\n                        fallbackTolerance &&\n                        min(abs(touch.clientX - this._lastX), abs(touch.clientY - this._lastY)) <\n                            fallbackTolerance\n                    ) {\n                        return;\n                    }\n\n                    this._dragStarted();\n                }\n\n                // as well as creating the ghost element on the document body\n                this._appendGhost();\n\n                moved = true;\n                touchEvt = touch;\n\n                _css(ghostEl, \"webkitTransform\", translate3d);\n                _css(ghostEl, \"mozTransform\", translate3d);\n                _css(ghostEl, \"msTransform\", translate3d);\n                _css(ghostEl, \"transform\", translate3d);\n\n                evt.preventDefault();\n            }\n        },\n\n        _appendGhost: function () {\n            if (!ghostEl) {\n                var rect = dragEl.getBoundingClientRect(),\n                    css = _css(dragEl),\n                    options = this.options,\n                    ghostRect;\n\n                ghostEl = dragEl.cloneNode(true);\n\n                _toggleClass(ghostEl, options.ghostClass, false);\n                _toggleClass(ghostEl, options.fallbackClass, true);\n                _toggleClass(ghostEl, options.dragClass, true);\n\n                _css(ghostEl, \"top\", rect.top - parseInt(css.marginTop, 10));\n                _css(ghostEl, \"left\", rect.left - parseInt(css.marginLeft, 10));\n                _css(ghostEl, \"width\", rect.width);\n                _css(ghostEl, \"height\", rect.height);\n                _css(ghostEl, \"opacity\", \"0.8\");\n                _css(ghostEl, \"position\", \"fixed\");\n                _css(ghostEl, \"zIndex\", \"100000\");\n                _css(ghostEl, \"pointerEvents\", \"none\");\n\n                (options.fallbackOnBody && document.body.appendChild(ghostEl)) ||\n                    rootEl.appendChild(ghostEl);\n\n                // Fixing dimensions.\n                ghostRect = ghostEl.getBoundingClientRect();\n                _css(ghostEl, \"width\", rect.width * 2 - ghostRect.width);\n                _css(ghostEl, \"height\", rect.height * 2 - ghostRect.height);\n            }\n        },\n\n        _onDragStart: function (/**Event*/ evt, /**boolean*/ useFallback) {\n            var dataTransfer = evt.dataTransfer,\n                options = this.options;\n\n            this._offUpEvents();\n\n            if (activeGroup.checkPull(this, this, dragEl, evt) == \"clone\") {\n                cloneEl = _clone(dragEl);\n                _css(cloneEl, \"display\", \"none\");\n                rootEl.insertBefore(cloneEl, dragEl);\n                _dispatchEvent(this, rootEl, \"clone\", dragEl);\n            }\n\n            _toggleClass(dragEl, options.dragClass, true);\n\n            if (useFallback) {\n                if (useFallback === \"touch\") {\n                    // Bind touch events\n                    _on(document, \"touchmove\", this._onTouchMove);\n                    _on(document, \"touchend\", this._onDrop);\n                    _on(document, \"touchcancel\", this._onDrop);\n                } else {\n                    // Old brwoser\n                    _on(document, \"mousemove\", this._onTouchMove);\n                    _on(document, \"mouseup\", this._onDrop);\n                }\n\n                this._loopId = setInterval(this._emulateDragOver, 50);\n            } else {\n                if (dataTransfer) {\n                    dataTransfer.effectAllowed = \"move\";\n                    options.setData && options.setData.call(this, dataTransfer, dragEl);\n                }\n\n                _on(document, \"drop\", this);\n                setTimeout(this._dragStarted, 0);\n            }\n        },\n\n        _onDragOver: function (/**Event*/ evt) {\n            var el = this.el,\n                target,\n                dragRect,\n                targetRect,\n                revert,\n                options = this.options,\n                group = options.group,\n                activeSortable = Sortable.active,\n                isOwner = activeGroup === group,\n                canSort = options.sort;\n\n            if (evt.preventDefault !== void 0) {\n                evt.preventDefault();\n                !options.dragoverBubble && evt.stopPropagation();\n            }\n\n            moved = true;\n\n            if (\n                activeGroup &&\n                !options.disabled &&\n                (isOwner\n                    ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list\n                    : putSortable === this ||\n                      (activeGroup.checkPull(this, activeSortable, dragEl, evt) &&\n                          group.checkPut(this, activeSortable, dragEl, evt))) &&\n                (evt.rootEl === void 0 || evt.rootEl === this.el) // touch fallback\n            ) {\n                // Smart auto-scrolling\n                _autoScroll(evt, options, this.el);\n\n                if (_silent) {\n                    return;\n                }\n\n                target = _closest(evt.target, options.draggable, el);\n                dragRect = dragEl.getBoundingClientRect();\n                putSortable = this;\n\n                if (revert) {\n                    _cloneHide(true);\n                    parentEl = rootEl; // actualization\n\n                    if (cloneEl || nextEl) {\n                        rootEl.insertBefore(dragEl, cloneEl || nextEl);\n                    } else if (!canSort) {\n                        rootEl.appendChild(dragEl);\n                    }\n\n                    return;\n                }\n\n                if (\n                    el.children.length === 0 ||\n                    el.children[0] === ghostEl ||\n                    (el === evt.target && (target = _ghostIsLast(el, evt)))\n                ) {\n                    if (target) {\n                        if (target.animated) {\n                            return;\n                        }\n\n                        targetRect = target.getBoundingClientRect();\n                    }\n\n                    _cloneHide(isOwner);\n\n                    if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt) !== false) {\n                        if (!dragEl.contains(el)) {\n                            el.appendChild(dragEl);\n                            parentEl = el; // actualization\n                        }\n\n                        this._animate(dragRect, dragEl);\n                        target && this._animate(targetRect, target);\n                    }\n                } else if (\n                    target &&\n                    !target.animated &&\n                    target !== dragEl &&\n                    target.parentNode[expando] !== void 0\n                ) {\n                    if (lastEl !== target) {\n                        lastEl = target;\n                        lastCSS = _css(target);\n                        lastParentCSS = _css(target.parentNode);\n                    }\n\n                    targetRect = target.getBoundingClientRect();\n\n                    var width = targetRect.right - targetRect.left,\n                        height = targetRect.bottom - targetRect.top,\n                        floating =\n                            /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) ||\n                            (lastParentCSS.display == \"flex\" &&\n                                lastParentCSS[\"flex-direction\"].indexOf(\"row\") === 0),\n                        isWide = target.offsetWidth > dragEl.offsetWidth,\n                        isLong = target.offsetHeight > dragEl.offsetHeight,\n                        halfway =\n                            (floating\n                                ? (evt.clientX - targetRect.left) / width\n                                : (evt.clientY - targetRect.top) / height) > 0.5,\n                        nextSibling = target.nextElementSibling,\n                        moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt),\n                        after;\n\n                    if (moveVector !== false) {\n                        _silent = true;\n                        setTimeout(_unsilent, 30);\n\n                        _cloneHide(isOwner);\n\n                        if (moveVector === 1 || moveVector === -1) {\n                            after = moveVector === 1;\n                        } else if (floating) {\n                            var elTop = dragEl.offsetTop,\n                                tgTop = target.offsetTop;\n\n                            if (elTop === tgTop) {\n                                after =\n                                    (target.previousElementSibling === dragEl && !isWide) ||\n                                    (halfway && isWide);\n                            } else if (\n                                target.previousElementSibling === dragEl ||\n                                dragEl.previousElementSibling === target\n                            ) {\n                                after = (evt.clientY - targetRect.top) / height > 0.5;\n                            } else {\n                                after = tgTop > elTop;\n                            }\n                        } else {\n                            after = (nextSibling !== dragEl && !isLong) || (halfway && isLong);\n                        }\n\n                        if (!dragEl.contains(el)) {\n                            if (after && !nextSibling) {\n                                el.appendChild(dragEl);\n                            } else {\n                                target.parentNode.insertBefore(\n                                    dragEl,\n                                    after ? nextSibling : target\n                                );\n                            }\n                        }\n\n                        parentEl = dragEl.parentNode; // actualization\n\n                        this._animate(dragRect, dragEl);\n                        this._animate(targetRect, target);\n                    }\n                }\n            }\n        },\n\n        _animate: function (prevRect, target) {\n            var ms = this.options.animation;\n\n            if (ms) {\n                var currentRect = target.getBoundingClientRect();\n\n                _css(target, \"transition\", \"none\");\n                _css(\n                    target,\n                    \"transform\",\n                    \"translate3d(\" +\n                        (prevRect.left - currentRect.left) +\n                        \"px,\" +\n                        (prevRect.top - currentRect.top) +\n                        \"px,0)\"\n                );\n\n                target.offsetWidth; // repaint\n\n                _css(target, \"transition\", \"all \" + ms + \"ms\");\n                _css(target, \"transform\", \"translate3d(0,0,0)\");\n\n                clearTimeout(target.animated);\n                target.animated = setTimeout(function () {\n                    _css(target, \"transition\", \"\");\n                    _css(target, \"transform\", \"\");\n                    target.animated = false;\n                }, ms);\n            }\n        },\n\n        _offUpEvents: function () {\n            var ownerDocument = this.el.ownerDocument;\n\n            _off(document, \"touchmove\", this._onTouchMove);\n            _off(ownerDocument, \"mouseup\", this._onDrop);\n            _off(ownerDocument, \"touchend\", this._onDrop);\n            _off(ownerDocument, \"touchcancel\", this._onDrop);\n        },\n\n        _onDrop: function (/**Event*/ evt) {\n            var el = this.el,\n                options = this.options;\n\n            clearInterval(this._loopId);\n            clearInterval(autoScroll.pid);\n            clearTimeout(this._dragStartTimer);\n\n            // Unbind events\n            _off(document, \"mousemove\", this._onTouchMove);\n\n            if (this.nativeDraggable) {\n                _off(document, \"drop\", this);\n                _off(el, \"dragstart\", this._onDragStart);\n            }\n\n            this._offUpEvents();\n\n            if (evt) {\n                if (moved) {\n                    evt.preventDefault();\n                    !options.dropBubble && evt.stopPropagation();\n                }\n\n                ghostEl && ghostEl.parentNode.removeChild(ghostEl);\n\n                if (dragEl) {\n                    if (this.nativeDraggable) {\n                        _off(dragEl, \"dragend\", this);\n                    }\n\n                    _disableDraggable(dragEl);\n                    dragEl.style[\"will-change\"] = \"\";\n\n                    // Remove class's\n                    _toggleClass(dragEl, this.options.ghostClass, false);\n                    _toggleClass(dragEl, this.options.chosenClass, false);\n\n                    if (rootEl !== parentEl) {\n                        newIndex = _index(dragEl, options.draggable);\n\n                        if (newIndex >= 0) {\n                            // Add event\n                            _dispatchEvent(\n                                null,\n                                parentEl,\n                                \"add\",\n                                dragEl,\n                                rootEl,\n                                oldIndex,\n                                newIndex\n                            );\n\n                            // Remove event\n                            _dispatchEvent(\n                                this,\n                                rootEl,\n                                \"remove\",\n                                dragEl,\n                                rootEl,\n                                oldIndex,\n                                newIndex\n                            );\n\n                            // drag from one list and drop into another\n                            _dispatchEvent(\n                                null,\n                                parentEl,\n                                \"sort\",\n                                dragEl,\n                                rootEl,\n                                oldIndex,\n                                newIndex\n                            );\n                            _dispatchEvent(\n                                this,\n                                rootEl,\n                                \"sort\",\n                                dragEl,\n                                rootEl,\n                                oldIndex,\n                                newIndex\n                            );\n                        }\n                    } else {\n                        // Remove clone\n                        cloneEl && cloneEl.parentNode.removeChild(cloneEl);\n\n                        if (dragEl.nextSibling !== nextEl) {\n                            // Get the index of the dragged element within its parent\n                            newIndex = _index(dragEl, options.draggable);\n\n                            if (newIndex >= 0) {\n                                // drag & drop within the same list\n                                _dispatchEvent(\n                                    this,\n                                    rootEl,\n                                    \"update\",\n                                    dragEl,\n                                    rootEl,\n                                    oldIndex,\n                                    newIndex\n                                );\n                                _dispatchEvent(\n                                    this,\n                                    rootEl,\n                                    \"sort\",\n                                    dragEl,\n                                    rootEl,\n                                    oldIndex,\n                                    newIndex\n                                );\n                            }\n                        }\n                    }\n\n                    if (Sortable.active) {\n                        /* jshint eqnull:true */\n                        if (newIndex == null || newIndex === -1) {\n                            newIndex = oldIndex;\n                        }\n\n                        _dispatchEvent(this, rootEl, \"end\", dragEl, rootEl, oldIndex, newIndex);\n\n                        // Save sorting\n                        this.save();\n                    }\n                }\n            }\n\n            this._nulling();\n        },\n\n        _nulling: function () {\n            rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = scrollEl = scrollParentEl = tapEvt = touchEvt = moved = newIndex = lastEl = lastCSS = putSortable = activeGroup = Sortable.active = null;\n        },\n\n        handleEvent: function (/**Event*/ evt) {\n            var type = evt.type;\n\n            if (type === \"dragover\" || type === \"dragenter\") {\n                if (dragEl) {\n                    this._onDragOver(evt);\n                    _globalDragOver(evt);\n                }\n            } else if (type === \"drop\" || type === \"dragend\") {\n                this._onDrop(evt);\n            }\n        },\n\n        /**\n         * Serializes the item into an array of string.\n         * @returns {String[]}\n         */\n        toArray: function () {\n            var order = [],\n                el,\n                children = this.el.children,\n                i = 0,\n                n = children.length,\n                options = this.options;\n\n            for (; i < n; i++) {\n                el = children[i];\n                if (_closest(el, options.draggable, this.el)) {\n                    order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n                }\n            }\n\n            return order;\n        },\n\n        /**\n         * Sorts the elements according to the array.\n         * @param  {String[]}  order  order of the items\n         */\n        sort: function (order) {\n            var items = {},\n                rootEl = this.el;\n\n            this.toArray().forEach(function (id, i) {\n                var el = rootEl.children[i];\n\n                if (_closest(el, this.options.draggable, rootEl)) {\n                    items[id] = el;\n                }\n            }, this);\n\n            order.forEach(function (id) {\n                if (items[id]) {\n                    rootEl.removeChild(items[id]);\n                    rootEl.appendChild(items[id]);\n                }\n            });\n        },\n\n        /**\n         * Save the current sorting\n         */\n        save: function () {\n            var store = this.options.store;\n            store && store.set(this);\n        },\n\n        /**\n         * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n         * @param   {HTMLElement}  el\n         * @param   {String}       [selector]  default: `options.draggable`\n         * @returns {HTMLElement|null}\n         */\n        closest: function (el, selector) {\n            return _closest(el, selector || this.options.draggable, this.el);\n        },\n\n        /**\n         * Set/get option\n         * @param   {string} name\n         * @param   {*}      [value]\n         * @returns {*}\n         */\n        option: function (name, value) {\n            var options = this.options;\n\n            if (value === void 0) {\n                return options[name];\n            } else {\n                options[name] = value;\n\n                if (name === \"group\") {\n                    _prepareGroup(options);\n                }\n            }\n        },\n\n        /**\n         * Destroy\n         */\n        destroy: function () {\n            var el = this.el;\n\n            el[expando] = null;\n\n            _off(el, \"mousedown\", this._onTapStart);\n            _off(el, \"touchstart\", this._onTapStart);\n\n            if (this.nativeDraggable) {\n                _off(el, \"dragover\", this);\n                _off(el, \"dragenter\", this);\n            }\n\n            // Remove draggable attributes\n            Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function (el) {\n                el.removeAttribute(\"draggable\");\n            });\n\n            touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1);\n\n            this._onDrop();\n\n            this.el = el = null;\n        },\n    };\n\n    function _cloneHide(state) {\n        if (cloneEl && cloneEl.state !== state) {\n            _css(cloneEl, \"display\", state ? \"none\" : \"\");\n            !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl);\n            cloneEl.state = state;\n        }\n    }\n\n    function _closest(/**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx) {\n        if (el) {\n            ctx = ctx || document;\n\n            do {\n                if ((selector === \">*\" && el.parentNode === ctx) || _matches(el, selector)) {\n                    return el;\n                }\n                /* jshint boss:true */\n            } while ((el = _getParentOrHost(el)));\n        }\n\n        return null;\n    }\n\n    function _getParentOrHost(el) {\n        var parent = el.host;\n\n        return parent && parent.nodeType ? parent : el.parentNode;\n    }\n\n    function _globalDragOver(/**Event*/ evt) {\n        if (evt.dataTransfer) {\n            evt.dataTransfer.dropEffect = \"move\";\n        }\n        evt.preventDefault();\n    }\n\n    function _on(el, event, fn) {\n        el.addEventListener(event, fn, false);\n    }\n\n    function _off(el, event, fn) {\n        el.removeEventListener(event, fn, false);\n    }\n\n    function _toggleClass(el, name, state) {\n        if (el) {\n            if (el.classList) {\n                el.classList[state ? \"add\" : \"remove\"](name);\n            } else {\n                var className = (\" \" + el.className + \" \")\n                    .replace(RSPACE, \" \")\n                    .replace(\" \" + name + \" \", \" \");\n                el.className = (className + (state ? \" \" + name : \"\")).replace(RSPACE, \" \");\n            }\n        }\n    }\n\n    function _css(el, prop, val) {\n        var style = el && el.style;\n\n        if (style) {\n            if (val === void 0) {\n                if (document.defaultView && document.defaultView.getComputedStyle) {\n                    val = document.defaultView.getComputedStyle(el, \"\");\n                } else if (el.currentStyle) {\n                    val = el.currentStyle;\n                }\n\n                return prop === void 0 ? val : val[prop];\n            } else {\n                if (!(prop in style)) {\n                    prop = \"-webkit-\" + prop;\n                }\n\n                style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n            }\n        }\n    }\n\n    function _find(ctx, tagName, iterator) {\n        if (ctx) {\n            var list = ctx.getElementsByTagName(tagName),\n                i = 0,\n                n = list.length;\n\n            if (iterator) {\n                for (; i < n; i++) {\n                    iterator(list[i], i);\n                }\n            }\n\n            return list;\n        }\n\n        return [];\n    }\n\n    function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) {\n        sortable = sortable || rootEl[expando];\n\n        var evt = document.createEvent(\"Event\"),\n            options = sortable.options,\n            onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n\n        evt.initEvent(name, true, true);\n\n        evt.to = rootEl;\n        evt.from = fromEl || rootEl;\n        evt.item = targetEl || rootEl;\n        evt.clone = cloneEl;\n\n        evt.oldIndex = startIndex;\n        evt.newIndex = newIndex;\n\n        rootEl.dispatchEvent(evt);\n\n        if (options[onName]) {\n            options[onName].call(sortable, evt);\n        }\n    }\n\n    function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvt) {\n        var evt,\n            sortable = fromEl[expando],\n            onMoveFn = sortable.options.onMove,\n            retVal;\n\n        evt = document.createEvent(\"Event\");\n        evt.initEvent(\"move\", true, true);\n\n        evt.to = toEl;\n        evt.from = fromEl;\n        evt.dragged = dragEl;\n        evt.draggedRect = dragRect;\n        evt.related = targetEl || toEl;\n        evt.relatedRect = targetRect || toEl.getBoundingClientRect();\n\n        fromEl.dispatchEvent(evt);\n\n        if (onMoveFn) {\n            retVal = onMoveFn.call(sortable, evt, originalEvt);\n        }\n\n        return retVal;\n    }\n\n    function _disableDraggable(el) {\n        el.draggable = false;\n    }\n\n    function _unsilent() {\n        _silent = false;\n    }\n\n    /** @returns {HTMLElement|false} */\n    function _ghostIsLast(el, evt) {\n        var lastEl = el.lastElementChild,\n            rect = lastEl.getBoundingClientRect();\n\n        // 5 — min delta\n        // abs — нельзя добавлять, а то глюки при наведении сверху\n        return (\n            (evt.clientY - (rect.top + rect.height) > 5 ||\n                evt.clientX - (rect.right + rect.width) > 5) &&\n            lastEl\n        );\n    }\n\n    /**\n     * Generate id\n     * @param   {HTMLElement} el\n     * @returns {String}\n     * @private\n     */\n    function _generateId(el) {\n        var str = el.tagName + el.className + el.src + el.href + el.textContent,\n            i = str.length,\n            sum = 0;\n\n        while (i--) {\n            sum += str.charCodeAt(i);\n        }\n\n        return sum.toString(36);\n    }\n\n    /**\n     * Returns the index of an element within its parent for a selected set of\n     * elements\n     * @param  {HTMLElement} el\n     * @param  {selector} selector\n     * @return {number}\n     */\n    function _index(el, selector) {\n        var index = 0;\n\n        if (!el || !el.parentNode) {\n            return -1;\n        }\n\n        while (el && (el = el.previousElementSibling)) {\n            if (\n                el.nodeName.toUpperCase() !== \"TEMPLATE\" &&\n                (selector === \">*\" || _matches(el, selector))\n            ) {\n                index++;\n            }\n        }\n\n        return index;\n    }\n\n    function _matches(/**HTMLElement*/ el, /**String*/ selector) {\n        if (el) {\n            selector = selector.split(\".\");\n\n            var tag = selector.shift().toUpperCase(),\n                re = new RegExp(\"\\\\s(\" + selector.join(\"|\") + \")(?=\\\\s)\", \"g\");\n\n            return (\n                (tag === \"\" || el.nodeName.toUpperCase() == tag) &&\n                (!selector.length ||\n                    ((\" \" + el.className + \" \").match(re) || []).length == selector.length)\n            );\n        }\n\n        return false;\n    }\n\n    function _throttle(callback, ms) {\n        var args, _this;\n\n        return function () {\n            if (args === void 0) {\n                args = arguments;\n                _this = this;\n\n                setTimeout(function () {\n                    if (args.length === 1) {\n                        callback.call(_this, args[0]);\n                    } else {\n                        callback.apply(_this, args);\n                    }\n\n                    args = void 0;\n                }, ms);\n            }\n        };\n    }\n\n    function _extend(dst, src) {\n        if (dst && src) {\n            for (var key in src) {\n                if (src.hasOwnProperty(key)) {\n                    dst[key] = src[key];\n                }\n            }\n        }\n\n        return dst;\n    }\n\n    function _clone(el) {\n        return $\n            ? $(el).clone(true)[0]\n            : Polymer && Polymer.dom\n            ? Polymer.dom(el).cloneNode(true)\n            : el.cloneNode(true);\n    }\n\n    // Export utils\n    Sortable.utils = {\n        on: _on,\n        off: _off,\n        css: _css,\n        find: _find,\n        is: function (el, selector) {\n            return !!_closest(el, selector, el);\n        },\n        extend: _extend,\n        throttle: _throttle,\n        closest: _closest,\n        toggleClass: _toggleClass,\n        clone: _clone,\n        index: _index,\n    };\n\n    /**\n     * Create sortable instance\n     * @param {HTMLElement}  el\n     * @param {Object}      [options]\n     */\n    Sortable.create = function (el, options) {\n        return new Sortable(el, options);\n    };\n\n    // Export\n    Sortable.version = \"1.4.2\";\n    return Sortable;\n});\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport Sortable from \"../../../../vendor/sortable/sortable.min.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class ImagesFormElement extends FormElement {\n    searchType: string;\n    images: { [key: string]: string }[];\n    mediaUploader: any;\n    button_text: string;\n    sortable: Sortable;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.searchType = options.searchType || \"fulltext\";\n        this.mediaUploader = external.mediaUploader;\n\n        this.button_text = options.button_text || \"Browse...\";\n        this.db_type = \"text\";\n        this.label = options.label || \"Images\";\n        this.name = options.name || \"images\";\n\n        this.images = this.value || [];\n        this.value = JSON.stringify(this.value);\n    }\n\n    init() {\n        super.init();\n        this.redrawImages();\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        // this.domElements.btnUpload = <HTMLElement>$(this.domElements.main).find('.mapsvg-upload-image')[0];\n        // this.domElements.btnImageDelete = <HTMLElement>$(this.domElements.main).find('.mapsvg-upload-image')[0];\n        // this.inputs.text = <HTMLInputElement>$(this.domElements.main).find('input[type=\"text\"]')[0];\n    }\n\n    getData(): { name: string; value: any } {\n        this.updateData();\n        // if(this.images && this.images.length && this.images[0]!=null){\n        //     var newList = [];\n        //     $(this.domElements.main).find('.mapsvg-thumbnail-wrap').each(function(index, el){\n        //         var imageData = $(el).data('image');\n        //         newList.push(imageData);\n        //     });\n        //     this.images = newList;\n        //     // data[control.name] = data[control.name].concat(control.images);\n        // }\n        return { name: this.name, value: this.images };\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.button_text = this.button_text;\n        return schema;\n    }\n\n    updateData() {\n        const newListOfImages = [];\n\n        $(this.domElements.main)\n            .find(\".mapsvg-thumbnail-wrap\")\n            .each(function (index, el) {\n                const imageData = $(el).data(\"image\");\n                newListOfImages.push(imageData);\n            });\n        this.images = newListOfImages;\n        this.value = JSON.stringify(this.images);\n        $(this.domElements.main).find(\"input\").val(this.value);\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n\n        if (this.formBuilder.editMode) {\n            return;\n        }\n\n        const _this = this;\n\n        const imageDOM = $(this.domElements.main).find(\".mapsvg-data-images\");\n\n        // this.external.mediaUploader.off(\"select\");\n\n        // When a file is selected, grab the URL and set it as the text field's value\n        this.external.mediaUploader.on(\"select\", () => {\n            if (_this.formBuilder.mediaUploaderisOpenedFor !== _this) return false;\n            const attachments = _this.external.mediaUploader.state().get(\"selection\").toJSON();\n            attachments.forEach(function (img) {\n                const image: any = { sizes: {} };\n                for (const type in img.sizes) {\n                    image[type] = img.sizes[type].url\n                        .replace(\"http://\", \"//\")\n                        .replace(\"https://\", \"//\");\n                    image.sizes[type] = {\n                        width: img.sizes[type].width,\n                        height: img.sizes[type].height,\n                    };\n                }\n                if (!image.thumbnail) {\n                    image.thumbnail = image.full;\n                    image.sizes.thumbnail = {\n                        width: img.sizes.full.width,\n                        height: img.sizes.full.height,\n                    };\n                }\n                if (!image.medium) {\n                    image.medium = image.full;\n                    image.sizes.medium = {\n                        width: img.sizes.full.width,\n                        height: img.sizes.full.height,\n                    };\n                }\n\n                // image.title = img.title;\n                image.caption = img.caption;\n                image.description = img.description;\n\n                _this.images.push(image);\n            });\n            this.setValue(this.images);\n            _this.redrawImages();\n        });\n        $(_this.domElements.main).on(\"click\", \".mapsvg-upload-image\", function (e) {\n            e.preventDefault();\n            // Open the uploader dialog\n            _this.formBuilder.mediaUploaderisOpenedFor = _this;\n            _this.external.mediaUploader.open();\n        });\n        $(_this.domElements.main).on(\"click\", \".mapsvg-image-delete\", function (e) {\n            e.preventDefault();\n            $(this).closest(\".mapsvg-thumbnail-wrap\").remove();\n            _this.updateData();\n            // _this.images = [];\n            // $(_this.domElements.main).find('img').each(function (i, image) {\n            //     _this.images.push($(image).data('image'));\n            // });\n            // $(_this.domElements.main).find('input').val(JSON.stringify(_this.images));\n        });\n\n        _this.sortable = new Sortable(imageDOM[0], {\n            animation: 150,\n            onStart: function () {\n                $(_this.domElements.main).addClass(\"sorting\");\n            },\n            onEnd: function (evt) {\n                _this.images = [];\n                $(_this.domElements.main)\n                    .find(\"img\")\n                    .each(function (i, image) {\n                        _this.images.push($(image).data(\"image\"));\n                    });\n                this.value = JSON.stringify(_this.images);\n                $(_this.domElements.main).find(\"input\").val(this.value);\n                $(_this.domElements.main).removeClass(\"sorting\");\n            },\n        });\n    }\n\n    redrawImages() {\n        const _this = this;\n        const imageDOM = $(this.domElements.main).find(\".mapsvg-data-images\");\n        imageDOM.empty();\n        this.images &&\n            this.images.forEach(function (image) {\n                const img = $('<img class=\"mapsvg-data-thumbnail\" />')\n                    .attr(\"src\", image.thumbnail)\n                    .data(\"image\", image);\n                const imgContainer = $('<div class=\"mapsvg-thumbnail-wrap\"></div>').data(\n                    \"image\",\n                    image\n                );\n                imgContainer.append(img);\n                imgContainer.append('<i class=\"mfa mfa-times  mapsvg-image-delete\"></i>');\n                imageDOM.append(imgContainer);\n            });\n        $(this.domElements.main).find(\"input\").val(this.value);\n    }\n\n    destroy() {\n        super.destroy();\n        this.external.mediaUploader.off(\"select\");\n    }\n}\n","import { MapSVG } from \"../../../Core/globals.js\";\nimport { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { GeoPoint, Location } from \"../../../Location/Location.js\";\nimport { Marker } from \"../../../Marker/Marker.js\";\n// import {Handlebars} from \"../../../handlebars.js\";\n// @ts-ignore\nimport Handlebars from \"Handlebars\";\n// @ts-ignore\nimport Bloodhound from \"Bloodhound\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\nimport { Server } from \"../../../Infrastructure/Server/Server\";\n\nconst $ = jQuery;\n\nexport class LocationFormElement extends FormElement {\n    language: string;\n    markerImages: Array<string>;\n    markersByField: { [key: string]: any };\n    markerField: string;\n    markersByFieldEnabled: boolean;\n    defaultMarkerPath: string;\n    location: Location;\n    marker: Marker;\n    languages: { label: string; value: string }[];\n    backupData?: {\n        location: Location;\n        Marker: Marker;\n    };\n    isGeo: boolean;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.label = this.label || (options.label === undefined ? \"Location\" : options.label);\n        this.name = \"location\";\n        this.db_type = \"text\";\n        this.languages = [\n            { value: \"sq\", label: \"Albanian\" },\n            { value: \"ar\", label: \"Arabic\" },\n            {\n                value: \"eu\",\n                label: \"Basque\",\n            },\n            { value: \"be\", label: \"Belarusian\" },\n            { value: \"bg\", label: \"Bulgarian\" },\n            {\n                value: \"my\",\n                label: \"Burmese\",\n            },\n            { value: \"bn\", label: \"Bengali\" },\n            { value: \"ca\", label: \"Catalan\" },\n            {\n                value: \"zh-cn\",\n                label: \"Chinese (simplified)\",\n            },\n            { value: \"zh-tw\", label: \"Chinese (traditional)\" },\n            {\n                value: \"hr\",\n                label: \"Croatian\",\n            },\n            { value: \"cs\", label: \"Czech\" },\n            { value: \"da\", label: \"Danish\" },\n            {\n                value: \"nl\",\n                label: \"Dutch\",\n            },\n            { value: \"en\", label: \"English\" },\n            {\n                value: \"en-au\",\n                label: \"English (australian)\",\n            },\n            { value: \"en-gb\", label: \"English (great Britain)\" },\n            {\n                value: \"fa\",\n                label: \"Farsi\",\n            },\n            { value: \"fi\", label: \"Finnish\" },\n            { value: \"fil\", label: \"Filipino\" },\n            {\n                value: \"fr\",\n                label: \"French\",\n            },\n            { value: \"gl\", label: \"Galician\" },\n            { value: \"de\", label: \"German\" },\n            {\n                value: \"el\",\n                label: \"Greek\",\n            },\n            { value: \"gu\", label: \"Gujarati\" },\n            { value: \"iw\", label: \"Hebrew\" },\n            {\n                value: \"hi\",\n                label: \"Hindi\",\n            },\n            { value: \"hu\", label: \"Hungarian\" },\n            { value: \"id\", label: \"Indonesian\" },\n            {\n                value: \"it\",\n                label: \"Italian\",\n            },\n            { value: \"ja\", label: \"Japanese\" },\n            { value: \"kn\", label: \"Kannada\" },\n            {\n                value: \"kk\",\n                label: \"Kazakh\",\n            },\n            { value: \"ko\", label: \"Korean\" },\n            { value: \"ky\", label: \"Kyrgyz\" },\n            {\n                value: \"lt\",\n                label: \"Lithuanian\",\n            },\n            { value: \"lv\", label: \"Latvian\" },\n            { value: \"mk\", label: \"Macedonian\" },\n            {\n                value: \"ml\",\n                label: \"Malayalam\",\n            },\n            { value: \"mr\", label: \"Marathi\" },\n            { value: \"no\", label: \"Norwegian\" },\n            {\n                value: \"pl\",\n                label: \"Polish\",\n            },\n            { value: \"pt\", label: \"Portuguese\" },\n            {\n                value: \"pt-br\",\n                label: \"Portuguese (brazil)\",\n            },\n            { value: \"pt-pt\", label: \"Portuguese (portugal)\" },\n            {\n                value: \"pa\",\n                label: \"Punjabi\",\n            },\n            { value: \"ro\", label: \"Romanian\" },\n            { value: \"ru\", label: \"Russian\" },\n            {\n                value: \"sr\",\n                label: \"Serbian\",\n            },\n            { value: \"sk\", label: \"Slovak\" },\n            { value: \"sl\", label: \"Slovenian\" },\n            {\n                value: \"es\",\n                label: \"Spanish\",\n            },\n            { value: \"sv\", label: \"Swedish\" },\n            { value: \"tl\", label: \"Tagalog\" },\n            {\n                value: \"ta\",\n                label: \"Tamil\",\n            },\n            { value: \"te\", label: \"Telugu\" },\n            { value: \"th\", label: \"Thai\" },\n            {\n                value: \"tr\",\n                label: \"Turkish\",\n            },\n            { value: \"uk\", label: \"Ukrainian\" },\n            { value: \"uz\", label: \"Uzbek\" },\n            {\n                value: \"vi\",\n                label: \"Vietnamese\",\n            },\n        ];\n        this.language = options.language;\n        // @ts-ignore\n        this.markerImages = MapSVG.markerImages;\n        this.markersByField = options.markersByField;\n        this.markerField = options.markerField;\n        this.markersByFieldEnabled = MapSVG.parseBoolean(options.markersByFieldEnabled);\n        this.defaultMarkerPath =\n            options.defaultMarkerPath ||\n            this.formBuilder.mapsvg.getData().options.defaultMarkerImage;\n\n        this.templates.marker = Handlebars.compile($(\"#mapsvg-data-tmpl-marker\").html());\n    }\n\n    init() {\n        super.init();\n        if (this.value) {\n            this.renderMarker();\n        }\n\n        this.renderMarkerSelector();\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.language = this.language;\n        schema.defaultMarkerPath = this.defaultMarkerPath;\n        schema.markersByField = this.markersByField;\n        schema.markerField = this.markerField;\n        schema.markersByFieldEnabled = MapSVG.parseBoolean(this.markersByFieldEnabled);\n        return schema;\n    }\n\n    getData(): { name: string; value: any } {\n        return { name: this.name, value: this.value };\n    }\n\n    getDataForTemplate(): { [p: string]: any } {\n        const data = super.getDataForTemplate();\n\n        if (this.formBuilder.admin) {\n            data.languages = this.languages;\n            data.markerImages = MapSVG.markerImages;\n            data.markersByField = this.markersByField;\n            data.markerField = this.markerField;\n            data.markersByFieldEnabled = MapSVG.parseBoolean(this.markersByFieldEnabled);\n            const _this = this;\n            data.markerImages.forEach(function (m) {\n                if (m.relativeUrl === _this.defaultMarkerPath) {\n                    m.default = true;\n                } else {\n                    m.default = false;\n                }\n            });\n        }\n        data.language = this.language;\n\n        if (this.value) {\n            data.location = this.value;\n            if (data.location.marker) {\n                data.location.img =\n                    (this.value.marker.src.indexOf(MapSVG.urls.uploads) === 0 ? \"uploads/\" : \"\") +\n                    this.value.marker.src.split(\"/\").pop();\n            }\n        }\n\n        data.showUploadBtn = data.external.filtersMode;\n\n        return data;\n    }\n\n    initEditor() {\n        super.initEditor();\n        this.renderMarkerSelector();\n        this.fillMarkersByFieldOptions(this.markerField);\n    }\n\n    setDomElements() {\n        super.setDomElements();\n\n        this.domElements.markerImageButton = $(this.domElements.main).find(\"img\")[0];\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n\n        const _this = this;\n\n        // Google geocoding\n        const server = new Server();\n\n        if (_this.formBuilder.mapsvg.isGeo()) {\n            const locations = new Bloodhound({\n                datumTokenizer: Bloodhound.tokenizers.obj.whitespace(\"formatted_address\"),\n                queryTokenizer: Bloodhound.tokenizers.whitespace,\n                remote: {\n                    url: server.getUrl(\"geocoding\") + \"?address=%QUERY%&language=\" + this.language,\n                    wildcard: \"%QUERY%\",\n                    transform: function (response) {\n                        if (response.error_message) {\n                            alert(response.error_message);\n                        }\n                        return response.results;\n                    },\n                    rateLimitWait: 600,\n                },\n            });\n            const thContainer = $(this.domElements.main).find(\".typeahead\");\n            const tH = thContainer\n                .typeahead(\n                    { minLength: 3 },\n                    {\n                        name: \"mapsvg-addresses\",\n                        display: \"formatted_address\",\n                        async: true,\n                        // @ts-ignore\n                        source: (query, sync, async) => {\n                            const preg = new RegExp(\n                                /^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$/\n                            );\n\n                            if (preg.test(query)) {\n                                const latlng = query.split(\",\").map((item) => item.trim());\n                                const item = {\n                                    formatted_address: latlng.join(\",\"),\n                                    address_components: [],\n                                    geometry: {\n                                        location: {\n                                            lat: () => latlng[0],\n                                            lng: () => latlng[1],\n                                        },\n                                    },\n                                };\n                                sync([item]);\n                                return;\n                            }\n\n                            MapSVG.geocode({ address: query }, async);\n                        },\n                    }\n                )\n                .on(\"typeahead:asyncrequest\", function (e) {\n                    $(e.target).addClass(\"tt-loading\");\n                })\n                .on(\"typeahead:asynccancel typeahead:asyncreceive\", function (e) {\n                    $(e.target).removeClass(\"tt-loading\");\n                });\n\n            thContainer.on(\"typeahead:select\", (ev, item) => {\n                this.setValue(null, false);\n\n                const address: { [key: string]: string } = {};\n                address.formatted = item.formatted_address;\n                item.address_components.forEach((addr_item) => {\n                    const type = addr_item.types[0];\n                    address[type] = addr_item.long_name;\n                    if (addr_item.short_name != addr_item.long_name) {\n                        address[type + \"_short\"] = addr_item.short_name;\n                    }\n                });\n\n                const locationData = {\n                    address: address,\n                    geoPoint: new GeoPoint(\n                        item.geometry.location.lat(),\n                        item.geometry.location.lng()\n                    ),\n                    img: this.getMarkerImage(this.formBuilder.getData()),\n                    imagePath: this.getMarkerImage(this.formBuilder.getData()),\n                };\n\n                this.setValue(locationData, false);\n                thContainer.typeahead(\"val\", \"\");\n                this.triggerChanged();\n            });\n        }\n\n        $(this.domElements.main).on(\"change\", \".marker-file-uploader\", function () {\n            _this.markerIconUpload(this);\n        });\n\n        $(this.domElements.main).on(\"click\", \".mapsvg-marker-image-btn-trigger\", function (e) {\n            e.preventDefault();\n\n            $(this).toggleClass(\"active\");\n            _this.toggleMarkerSelector();\n        });\n\n        $(this.domElements.main).on(\"click\", \".mapsvg-marker-delete\", function (e) {\n            e.preventDefault();\n            _this.setValue(null);\n            _this.triggerChanged();\n        });\n    }\n\n    setEditorEventHandlers() {\n        super.setEditorEventHandlers();\n\n        const _this = this;\n\n        $(this.domElements.edit).on(\"change\", \".marker-file-uploader\", function () {\n            _this.markerIconUpload(this);\n        });\n\n        $(this.domElements.edit).on(\"change\", 'select[name=\"markerField\"]', function () {\n            const fieldName = $(this).val();\n            _this.resetMarkersByField();\n            const newOptions = _this.fillMarkersByFieldOptions(fieldName);\n            _this.setMarkersByField(newOptions);\n        });\n        $(this.domElements.edit).on(\"click\", \".mapsvg-marker-image-selector button\", function (e) {\n            e.preventDefault();\n            const src = $(this).find(\"img\").attr(\"src\");\n            $(this).parent().find(\"button\").removeClass(\"active\");\n            $(this).addClass(\"active\");\n            _this.setDefaultMarkerPath(src);\n        });\n        $(this.domElements.edit).on(\"click\", \".mapsvg-marker-image-btn-trigger\", function (e) {\n            $(this).toggleClass(\"active\");\n            _this.toggleMarkerSelectorInLocationEditor.call(_this, $(this), e);\n        });\n    }\n\n    /**\n     * Upload new marker icon\n     *\n     * @param {HTMLInputElement} input\n     */\n    markerIconUpload(input) {\n        const uploadBtn = $(input).closest(\".btn-file\").buttonLoading(true);\n\n        for (let i = 0; i < input.files.length; i++) {\n            const data = new FormData();\n\n            data.append(\"file\", input.files[0]);\n\n            const server = new Server();\n\n            server\n                .ajax(\"markers\", {\n                    type: \"POST\",\n                    data: data,\n                    processData: false,\n                    contentType: false,\n                })\n                .done((resp) => {\n                    if (resp.error) {\n                        alert(resp.error);\n                    } else {\n                        const marker = resp.marker;\n                        const newMarker = `\n                            <button class=\"btn btn-outline-secondary mapsvg-marker-image-btn mapsvg-marker-image-btn-choose active\">\n                                <img src=\"${marker.relativeUrl}\" />\n                            </button>\n                            </button>\n                        `;\n\n                        $(this.domElements.markerSelector)\n                            .find(\".mapsvg-marker-image-btn.active\")\n                            .removeClass(\"active\");\n                        $(newMarker).appendTo(this.domElements.markerSelector);\n\n                        this.setMarkerImage(marker.relativeUrl);\n                        MapSVG.markerImages.push(marker);\n                    }\n                })\n                .always(function () {\n                    uploadBtn.buttonLoading(false);\n                });\n        }\n    }\n\n    mayBeAddDistanceRow() {\n        const _this = this;\n        if (!this.domElements.editDistanceRow) {\n            this.domElements.editDistanceRow = $($(\"#mapsvg-edit-distance-row\").html())[0];\n        }\n        // if there's something in the last status edit field, add +1 status row\n        const z = $(this.domElements.edit).find(\".mapsvg-edit-distance-row:last-child input\");\n        if (z && z.last() && z.last().val() && (z.last().val() + \"\").trim().length) {\n            const newRow = $(this.templates.editDistanceRow).clone();\n            newRow.insertAfter(\n                $(_this.domElements.edit).find(\".mapsvg-edit-distance-row:last-child\")\n            );\n        }\n        const rows = $(_this.domElements.edit).find(\".mapsvg-edit-distance-row\");\n        const row1 = rows.eq(rows.length - 2);\n        const row2 = rows.eq(rows.length - 1);\n\n        if (\n            row1.length &&\n            row2.length &&\n            !row1.find(\"input:eq(0)\").val().toString().trim() &&\n            !row2.find(\"input:eq(0)\").val().toString().trim()\n        ) {\n            row2.remove();\n        }\n    }\n\n    fillMarkersByFieldOptions(fieldName) {\n        const _this = this;\n        const field = _this.formBuilder.mapsvg.objectsRepository.getSchema().getField(fieldName);\n        const options = {};\n\n        if (field) {\n            const markerImg = _this.formBuilder.mapsvg.options.defaultMarkerImage;\n            const rows = [];\n            field.options.forEach(function (option) {\n                const value = field.type === \"region\" ? option.id : option.value;\n                const label = field.type === \"region\" ? option.title || option.id : option.label;\n                const img =\n                    _this.markersByField && _this.markersByField[value]\n                        ? _this.markersByField[value]\n                        : markerImg;\n                rows.push(\n                    '<tr data-option-id=\"' +\n                        value +\n                        '\"><td>' +\n                        label +\n                        '</td><td><button class=\"btn dropdown-toggle btn-outline-secondary mapsvg-marker-image-btn-trigger mapsvg-marker-image-btn\"><img src=\"' +\n                        img +\n                        '\" class=\"new-marker-img\" /><span class=\"caret\"></span></button></td></tr>'\n                );\n                options[value] = img;\n            });\n            $(\"#markers-by-field\").empty().append(rows);\n        }\n        return options;\n    }\n\n    renderMarker(marker?: Marker) {\n        // if (!this.value && !(marker && marker.location)) {\n        //     return false;\n        // }\n        if (marker && marker.location) {\n            this.value = marker.location.getData();\n        }\n        this.renderMarkerHtml();\n    }\n\n    renderMarkerHtml() {\n        if (!this.value) {\n            $(this.domElements.main).find(\".mapsvg-new-marker\").hide();\n        } else {\n            $(this.domElements.main)\n                .find(\".mapsvg-new-marker\")\n                .show()\n                .html(this.templates.marker(this.value));\n        }\n    }\n\n    toggleMarkerSelector() {\n        if (\n            this.domElements.markerSelectorWrap &&\n            $(this.domElements.markerSelectorWrap).is(\":visible\")\n        ) {\n            $(this.domElements.markerSelectorWrap).hide();\n            return;\n        }\n        if (\n            this.domElements.markerSelectorWrap &&\n            $(this.domElements.markerSelectorWrap).not(\":visible\")\n        ) {\n            $(this.domElements.markerSelector).find(\".active\").removeClass(\"active\");\n            if (this.value && this.value.markerImagePath) {\n                $(this.domElements.markerSelector)\n                    .find('[src=\"' + this.value.markerImagePath + '\"]')\n                    .parent()\n                    .addClass(\"active\");\n            }\n            $(this.domElements.markerSelectorWrap).show();\n            return;\n        }\n    }\n\n    renderMarkerSelector() {\n        const _this = this;\n        const view = this.formBuilder.editMode ? this.domElements.edit : this.domElements.main;\n        if (!view) return;\n        const currentImage = this.value ? this.value.markerImagePath : null;\n        const images = MapSVG.markerImages.map(function (image) {\n            return (\n                '<button class=\"btn btn-outline-secondary mapsvg-marker-image-btn mapsvg-marker-image-btn-choose ' +\n                (currentImage == image.relativeUrl ? \"active\" : \"\") +\n                '\"><img src=\"' +\n                image.relativeUrl +\n                '\" /></button>'\n            );\n        });\n\n        this.domElements.markerSelectorWrap = $(view).find(\".mapsvg-marker-image-selector\")[0];\n        this.domElements.markerSelector = $(this.domElements.markerSelectorWrap).find(\n            \".mapsvg-marker-images\"\n        )[0];\n\n        // delete previous marker image selector and reset events\n        if (this.domElements.markerSelector) {\n            $(this.domElements.markerSelector).empty();\n        }\n\n        if (!this.formBuilder.editMode) {\n            this.domElements.markerSelectorWrap.style.display = \"none\";\n            $(this.domElements.markerSelector).on(\n                \"click\",\n                \".mapsvg-marker-image-btn-choose\",\n                function (e) {\n                    e.preventDefault();\n                    const src = $(this).find(\"img\").attr(\"src\");\n\n                    $(_this.domElements.markerSelectorWrap).hide();\n                    $(_this.domElements.markerSelector).find(\".active\").removeClass(\"active\");\n                    $(this).addClass(\"active\");\n                    $(_this.domElements.main)\n                        .find(\".mapsvg-marker-image-btn-trigger\")\n                        .toggleClass(\"active\", false);\n                    $(_this.domElements.markerImageButton).attr(\"src\", src);\n\n                    _this.setMarkerImage(src);\n                }\n            );\n        }\n        $(this.domElements.markerSelector).html(images.join(\"\"));\n    }\n\n    private setMarkerImage(src: string) {\n        this.setDefaultMarkerPath(src);\n        const value = this.value;\n        if (value) {\n            value.img = src;\n            value.imagePath = src;\n            this.setValue(value);\n            this.triggerChanged();\n            this.renderMarker();\n        }\n    }\n\n    toggleMarkerSelectorInLocationEditor(jQueryObj, e) {\n        e.preventDefault();\n        const _this = this;\n        if (jQueryObj.data(\"markerSelector\") && jQueryObj.data(\"markerSelector\").is(\":visible\")) {\n            jQueryObj.data(\"markerSelector\").hide();\n            return;\n        }\n        if (jQueryObj.data(\"markerSelector\") && jQueryObj.data(\"markerSelector\").not(\":visible\")) {\n            jQueryObj.data(\"markerSelector\").show();\n            return;\n        }\n\n        const markerBtn = $(this).closest(\"td\").find(\".mapsvg-marker-image-btn-trigger\");\n        const currentImage = markerBtn.attr(\"src\");\n        const images = MapSVG.markerImages.map(function (image) {\n            return (\n                '<button class=\"btn btn-outline-secondary mapsvg-marker-image-btn mapsvg-marker-image-btn-choose ' +\n                (currentImage == image.relativeUrl ? \"active\" : \"\") +\n                '\"><img src=\"' +\n                image.relativeUrl +\n                '\" /></button>'\n            );\n        });\n\n        if (!jQueryObj.data(\"markerSelector\")) {\n            const ms = $('<div class=\"mapsvg-marker-image-selector\"></div>');\n            jQueryObj.closest(\"td\").append(ms);\n            jQueryObj.data(\"markerSelector\", ms);\n        } else {\n            jQueryObj.data(\"markerSelector\").empty();\n        }\n\n        jQueryObj.data(\"markerSelector\").html(images.join(\"\"));\n\n        jQueryObj\n            .data(\"markerSelector\")\n            .on(\"click\", \".mapsvg-marker-image-btn-choose\", function (e) {\n                e.preventDefault();\n                const src = $(this).find(\"img\").attr(\"src\");\n                jQueryObj.data(\"markerSelector\").hide();\n                const td = $(this).closest(\"td\");\n                const fieldId = $(this).closest(\"tr\").data(\"option-id\");\n                const btn = td.find(\".mapsvg-marker-image-btn-trigger\");\n                btn.toggleClass(\"active\", false);\n                btn.find(\"img\").attr(\"src\", src);\n                _this.setMarkerByField(fieldId, src);\n            });\n    }\n\n    setMarkersByField(options: { [key: string]: string }): void {\n        this.markersByField = options;\n    }\n    resetMarkersByField() {\n        this.markersByField = {};\n    }\n    setMarkerByField(fieldId, markerImg) {\n        this.markersByField = this.markersByField || {};\n        this.markersByField[fieldId] = markerImg;\n    }\n\n    deleteMarker() {\n        const _this = this;\n\n        $(this.domElements.main).find(\".mapsvg-new-marker\").hide();\n        $(this.domElements.main).find(\".mapsvg-marker-id\").attr(\"disabled\", \"disabled\");\n    }\n\n    destroy() {\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                sel.mselect2(\"destroy\");\n            }\n        }\n        this.domElements.markerSelector && $(this.domElements.markerSelector).popover(\"dispose\");\n    }\n\n    setDefaultMarkerPath(path: string): void {\n        this.defaultMarkerPath = path;\n        this.formBuilder.mapsvg.setDefaultMarkerImage(path);\n    }\n\n    getMarkerImage(data: { [key: string]: any }): string {\n        let fieldValue;\n\n        if (this.markersByFieldEnabled) {\n            fieldValue = data[this.markerField];\n            if (!fieldValue) {\n                return this.defaultMarkerPath || MapSVG.defaultMarkerImage;\n            } else {\n                if (this.markerField === \"regions\") {\n                    fieldValue = fieldValue[0] && fieldValue[0].id;\n                } else if (typeof fieldValue === \"object\" && fieldValue.length) {\n                    fieldValue = fieldValue[0].value;\n                }\n                if (this.markersByField[fieldValue]) {\n                    return (\n                        this.markersByField[fieldValue] ||\n                        this.defaultMarkerPath ||\n                        MapSVG.defaultMarkerImage\n                    );\n                }\n            }\n        } else {\n            return this.defaultMarkerPath || MapSVG.defaultMarkerImage;\n        }\n    }\n\n    setValue(value: any, updateInput = true): void {\n        this.value = value;\n        if (this.value) {\n            if (!this.value.address) {\n                this.value.address = {};\n            }\n            if (Object.keys(this.value.address).length < 2 && this.value.geoPoint) {\n                this.value.address.formatted =\n                    this.value.geoPoint.lat + \",\" + this.value.geoPoint.lng;\n            }\n        }\n        this.renderMarker();\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class ModalFormElement extends FormElement {\n    showButtonText: boolean;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.showButtonText = options.showButtonText;\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.showButtonText = this.showButtonText;\n        return schema;\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\nimport { Server } from \"../../../Infrastructure/Server/Server\";\nimport { PostInterface } from \"../../../Post/PostInterface\";\n\nconst $ = jQuery;\n\nexport class PostFormElement extends FormElement {\n    id: number;\n    post?: PostInterface;\n    inputs: { postSelect: HTMLSelectElement };\n    add_fields: boolean;\n    post_type: boolean;\n    post_types: string[];\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        if (this.formBuilder.admin) this.post_types = this.formBuilder.admin.getPostTypes();\n        this.post_type = options.post_type || this.post_types[0];\n        this.add_fields = MapSVG.parseBoolean(options.add_fields);\n        this.db_type = \"int(11)\";\n        this.name = \"post\";\n        this.post = options.post;\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.postSelect = <HTMLSelectElement>(\n            $(this.domElements.main).find(\".mapsvg-find-post\")[0]\n        );\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.post_type = this.post_type;\n        schema.add_fields = this.add_fields;\n        return schema;\n    }\n\n    destroy() {\n        // @ts-ignore\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                //@ts-ignore\n                sel.mselect2(\"destroy\");\n            }\n        }\n    }\n\n    getDataForTemplate(): { [p: string]: any } {\n        const data = super.getDataForTemplate();\n\n        if (this.formBuilder.admin) data.post_types = this.formBuilder.admin.getPostTypes();\n        data.post_type = this.post_type;\n        data.post = this.post;\n        data.add_fields = this.add_fields || 0;\n        return data;\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n\n        const server = new Server();\n\n        // @ts-ignore\n        $(this.inputs.postSelect)\n            .mselect2({\n                placeholder: \"Search post by title\",\n                allowClear: true,\n                disabled: this.readonly,\n                ajax: {\n                    url: server.getUrl(\"posts\"), //MapSVG.urls.ajaxurl + '?action=mapsvg_search_posts&post_type=' + this.post_type,\n                    dataType: \"json\",\n                    delay: 250,\n                    data: (params) => {\n                        return {\n                            filters: { post_type: this.post_type },\n                            search: params.term, // search term\n                            page: params.page,\n                        };\n                    },\n                    processResults: (data, params) => {\n                        // parse the results into the format expected by Select2\n                        // since we are using custom formatting functions we do not need to\n                        // alter the remote JSON data, except to indicate that infinite\n                        // scrolling can be used\n                        params.page = params.page || 1;\n\n                        return {\n                            results: data.posts ? data.posts : [],\n                            pagination: {\n                                more: false, //(params.page * 30) < data.total_count\n                            },\n                        };\n                    },\n                    cache: true,\n                },\n                escapeMarkup: (markup) => {\n                    return markup;\n                }, // let our custom formatter work\n                minimumInputLength: 1,\n                templateResult: this.formatRepo, // omitted for brevity, see the source of this page\n                templateSelection: this.formatRepoSelection, // omitted for brevity, see the source of this page\n            })\n            .on(\"select2:select\", (e) => {\n                const post = e.params.data;\n                this.setValue(post);\n                this.setInputValue(post);\n                this.triggerChanged();\n            })\n            .on(\"change\", (e) => {\n                if (e.target.value === \"\") {\n                    $(this.domElements.main).find(\".mapsvg-post-id\").text(\"\");\n                    $(this.domElements.main).find(\".mapsvg-post-url\").text(\"\");\n                    this.setValue(null, false);\n                    this.triggerChanged();\n                }\n            });\n    }\n\n    formatRepo(repo): string {\n        if (repo.loading) {\n            return repo.text;\n        } else {\n            return \"<div class='select2-result-repository clearfix'>\" + repo.post_title + \"</div>\";\n        }\n    }\n\n    formatRepoSelection(repo): string {\n        return repo.post_title || repo.text;\n    }\n\n    setValue(post: PostInterface, updateInput = true) {\n        this.value = post;\n        if (updateInput) {\n            this.setInputValue(post);\n        }\n    }\n\n    setInputValue(post: PostInterface): void {\n        $(this.domElements.main).find(\".mapsvg-post-id\").text(post.id);\n        $(this.domElements.main).find(\".mapsvg-post-url\").text(post.url).attr(\"href\", post.url);\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class RadioFormElement extends FormElement {\n    inputs: { radios: RadioNodeList };\n    $radios: any;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.setOptions(options.options);\n    }\n\n    setDomElements(): void {\n        super.setDomElements();\n        this.inputs.radios = this.formBuilder.getForm().elements[this.name];\n        this.$radios = $(this.domElements.main).find('input[type=\"radio\"]');\n    }\n\n    setEventHandlers(): void {\n        super.setEventHandlers();\n\n        this.$radios.on(\"change\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    setInputValue(value: string | null): void {\n        if (value === null) {\n            this.$radios.prop(\"checked\", false);\n        } else {\n            this.inputs.radios.value = value;\n        }\n    }\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\n// TODO extend RegionsFormElement from the (not yet created) MultiselectFormElement\n\nexport class RegionsFormElement extends FormElement {\n    inputs: { select: HTMLSelectElement };\n    regionsTableName: string;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchable = MapSVG.parseBoolean(options.searchable);\n        this.options = this.formBuilder.getRegionsList();\n        this.label = options.label === undefined ? \"Regions\" : options.label;\n        this.name = \"regions\";\n        this.db_type = \"text\";\n        if (typeof this.value === \"undefined\") {\n            this.value = [];\n        }\n        // TODO inject the table name as a dependency\n        this.regionsTableName = this.formBuilder.mapsvg.regionsRepository.getSchema().name;\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.select = $(this.domElements.main).find(\"select\")[0];\n    }\n\n    getData(): { name: string; value: any } {\n        return { name: \"regions\", value: this.value };\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        if (schema.multiselect) schema.db_type = \"text\";\n        const opts = $.extend(true, {}, { options: this.options });\n        schema.options = opts.options;\n        schema.optionsDict = {};\n        schema.options.forEach(function (option) {\n            schema.optionsDict[option.id] = option.title || option.id;\n        });\n\n        return schema;\n    }\n\n    getDataForTemplate(): { [p: string]: any } {\n        const data = super.getDataForTemplate();\n        data.regionsTableName = this.regionsTableName;\n        data.regionsFromCurrentTable = this.getRegionsForCurrentTable();\n        return data;\n    }\n\n    getRegionsForCurrentTable(): Array<{ id: string; title: string; tableName: string }> {\n        return this.value\n            ? this.value.filter((region) => region.tableName === this.regionsTableName)\n            : [];\n    }\n\n    setEventHandlers(): void {\n        super.setEventHandlers();\n        $(this.inputs.select).on(\"change\", (e) => {\n            const selectedOptions = Array.from(this.inputs.select.selectedOptions);\n            const selectedValues = selectedOptions.map((option) => option.value);\n            this.setValue(selectedValues, false);\n            this.triggerChanged();\n        });\n    }\n\n    destroy(): void {\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                //@ts-ignore\n                sel.mselect2(\"destroy\");\n            }\n        }\n    }\n\n    setValue(regionIds: string[], updateInput = true) {\n        const regionsFromOtherTables = this.value.filter(\n            (region) => region.tableName !== this.regionsTableName\n        );\n        const regions = [];\n        regionIds.forEach((regionId: string) => {\n            const region = this.formBuilder.mapsvg.getRegion(regionId);\n            regions.push({ id: region.id, title: region.title, tableName: this.regionsTableName });\n        });\n        this.value = regions.concat(regionsFromOtherTables);\n        if (updateInput) {\n            this.setInputValue(regionIds);\n        }\n    }\n\n    // TODO add setInpuValue\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class SaveFormElement extends FormElement {\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.readonly = true;\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.btnSave = <HTMLButtonElement>$(this.domElements.main).find(\".btn-save\")[0];\n        this.inputs.btnClose = <HTMLButtonElement>$(this.domElements.main).find(\".mapsvg-close\")[0];\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.btnSave).on(\"click\", (e) => {\n            e.preventDefault();\n            this.events.trigger(\"click.btn.save\");\n        });\n        $(this.inputs.btnClose).on(\"click\", (e) => {\n            e.preventDefault();\n            this.events.trigger(\"click.btn.close\");\n        });\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class SearchFormElement extends FormElement {\n    searchFallback: boolean;\n    width: string;\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n\n        this.searchFallback = MapSVG.parseBoolean(options.searchFallback) || false;\n        this.width = options.width || \"100%\";\n        this.name = \"search\";\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.text = $(this.domElements.main).find(\"input\")[0];\n    }\n\n    setEventHandlers(): void {\n        super.setEventHandlers();\n        $(this.inputs.text).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    setInputValue(value: string | null): void {\n        this.inputs.text.value = value;\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.searchFallback = MapSVG.parseBoolean(this.searchFallback);\n        schema.placeholder = this.placeholder;\n        schema.width = this.width;\n        return schema;\n    }\n}\n","/// <reference path=\"../../../../vendor/jquery-plugins.d.ts\" />\nimport { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\n// TODO extract \"multiselect\" class and make it inherited from SelectFormElement\n\nexport class SelectFormElement extends FormElement {\n    multiselect: boolean;\n    optionsGrouped: any;\n    inputs: { select: HTMLSelectElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchable = MapSVG.parseBoolean(options.searchable);\n        this.multiselect = MapSVG.parseBoolean(options.multiselect);\n        this.optionsGrouped = options.optionsGrouped;\n        this.db_type = this.multiselect ? \"text\" : \"varchar(255)\";\n\n        this.setOptions(options.options);\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.select = $(this.domElements.main).find(\"select\")[0];\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.multiselect = MapSVG.parseBoolean(this.multiselect);\n        if (schema.multiselect) schema.db_type = \"text\";\n        schema.optionsGrouped = this.optionsGrouped;\n        const opts = $.extend(true, {}, { options: this.options });\n        schema.options = opts.options || [];\n        schema.optionsDict = {};\n        schema.options.forEach(function (option) {\n            schema.optionsDict[option.value] = option.label;\n        });\n\n        return schema;\n    }\n\n    // getData(){\n    // TODO check this and uncomment maybe\n    // data[control.name] = data[control.name].map(function(value){\n    //     return {value: value, label: control.optionsDict[value]};\n    // });\n\n    // TODO: check about multiselect\n    // return {value: value, label: control.optionsDict[value]};\n    // }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n\n        // TODO: check about multiselect\n        $(this.inputs.select).on(\"change\", (e) => {\n            if (this.multiselect) {\n                // Comment by Roman: AirBNB JS guide suggest using a spread operator:\n                // [...this.inputs.select.selectedOptions]\n                // instead of\n                // Array.from(this.inputs.select.selectedOptions)\n                // but Typescript compiler thinks it's incorrect and underlines that code\n                // with a red line - so I'm using Array.from()\n                const selectedOptions = Array.from(this.inputs.select.selectedOptions);\n                const selectedValues = selectedOptions.map((option) => {\n                    return { label: option.label, value: option.value };\n                });\n                this.setValue(selectedValues, false);\n                this.triggerChanged();\n            } else {\n                this.setValue(this.inputs.select.value, false);\n                this.triggerChanged();\n            }\n        });\n    }\n\n    addSelect2() {\n        if ($().mselect2) {\n            const select2Options: { placeholder?: string; allowClear?: boolean } = {};\n            if (this.formBuilder.filtersMode && this.type == \"select\") {\n                select2Options.placeholder = this.placeholder;\n                if (!this.multiselect) {\n                    select2Options.allowClear = true;\n                }\n            }\n            $(this.domElements.main)\n                .find(\"select\")\n                .css({ width: \"100%\", display: \"block\" })\n                .mselect2(select2Options)\n                .on(\"select2:focus\", function () {\n                    $(this).mselect2(\"open\");\n                });\n            $(this.domElements.main)\n                .find(\".select2-selection--multiple .select2-search__field\")\n                .css(\"width\", \"100%\");\n        }\n    }\n\n    setOptions(options?: any[]): any[] {\n        if (options) {\n            this.options = [];\n            this.optionsDict = {};\n            options.forEach((value, key) => {\n                this.options.push(value);\n                if (this.optionsGrouped) {\n                    value.options.forEach((value2, key2) => {\n                        this.optionsDict[value2.value] = value2;\n                    });\n                } else {\n                    this.optionsDict[key] = value;\n                }\n            });\n            return this.options;\n        } else {\n            return this.setOptions([\n                { label: \"Option one\", name: \"option_one\", value: 1 },\n                { label: \"Option two\", name: \"option_two\", value: 2 },\n            ]);\n        }\n    }\n\n    setInputValue(value: string | Array<{ label: string; value: string | number }>): void {\n        if (this.multiselect) {\n            if (this.value) {\n                $(this.inputs.select).val(this.value.map((el) => el.value));\n            } else {\n                $(this.inputs.select).val([]);\n            }\n        } else {\n            this.inputs.select.value = this.value;\n        }\n        $(this.inputs.select).trigger(\"change.select2\");\n    }\n}\n","/// <reference path=\"../../../../vendor/jquery-plugins.d.ts\" />\n\nimport {FormElement} from \"../FormElement\";\nimport {FormBuilder} from \"../../FormBuilder\";\nimport {MapSVG} from \"../../../Core/globals.js\";\nimport {SchemaField} from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class StatusFormElement extends FormElement {\n    inputs: { select: HTMLSelectElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.label = options.label || \"Status\";\n        this.name = \"status\";\n        this.setOptions(options.options);\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.select = $(this.domElements.main).find(\"select\")[0];\n        if ($().colorpicker) {\n            $(this.domElements.main)\n                .find(\".cpicker\")\n                .colorpicker()\n                .on(\"changeColor.colorpicker\", function (event) {\n                    const input = $(this).find(\"input\");\n                    if (input.val() == \"\") $(this).find(\"i\").css({\"background-color\": \"\"});\n                });\n            this.domElements.edit &&\n            $(this.domElements.edit)\n                .find(\".cpicker\")\n                .colorpicker()\n                .on(\"changeColor.colorpicker\", function (event) {\n                    const input = $(this).find(\"input\");\n                    if (input.val() == \"\") $(this).find(\"i\").css({\"background-color\": \"\"});\n                });\n        }\n    }\n\n    destroy() {\n        if ($().mselect2) {\n            const sel = $(this.domElements.main).find(\".mapsvg-select2\");\n            if (sel.length) {\n                sel.mselect2(\"destroy\");\n            }\n        }\n    }\n\n    setEditorEventHandlers() {\n        super.setEditorEventHandlers();\n        const _this = this;\n        $(this.domElements.edit).on(\n            \"keyup change paste\",\n            \".mapsvg-edit-status-row input\",\n            function () {\n                _this.mayBeAddStatusRow();\n            }\n        );\n    }\n\n    initEditor() {\n        super.initEditor();\n        const _this = this;\n        $(_this.domElements.edit)\n            .find(\".cpicker\")\n            .colorpicker()\n            .on(\"changeColor.colorpicker\", function (event) {\n                const input = $(this).find(\"input\");\n                const index = $(this).closest(\"tr\").index();\n                if (input.val() == \"\") $(this).find(\"i\").css({\"background-color\": \"\"});\n                _this.options[index] = _this.options[index] || {\n                    label: \"\",\n                    value: \"\",\n                    color: \"\",\n                    disabled: false,\n                };\n                _this.options[index][\"color\"] = input.val();\n            });\n        _this.mayBeAddStatusRow();\n    }\n\n    mayBeAddStatusRow(): void {\n        const _this = this;\n        const editStatusRow = $($(\"#mapsvg-edit-status-row\").html());\n        // if there's something in the last status edit field, add +1 status row\n        const z = $(_this.domElements.edit).find(\".mapsvg-edit-status-label:last-child\");\n        if (z && z.last() && z.last().val() && (z.last().val() + \"\").trim().length) {\n            const newRow = editStatusRow.clone();\n            newRow.insertAfter(\n                $(_this.domElements.edit).find(\".mapsvg-edit-status-row:last-child\")\n            );\n            newRow\n                .find(\".cpicker\")\n                .colorpicker()\n                .on(\"changeColor.colorpicker\", function (event) {\n                    const input = $(this).find(\"input\");\n                    const index = $(this).closest(\"tr\").index();\n                    if (input.val() == \"\") $(this).find(\"i\").css({\"background-color\": \"\"});\n                    _this.options[index] = _this.options[index] || {\n                        label: \"\",\n                        value: \"\",\n                        color: \"\",\n                        disabled: false,\n                    };\n                    _this.options[index][\"color\"] = input.val();\n                });\n        }\n        const rows = $(_this.domElements.edit).find(\".mapsvg-edit-status-row\");\n        const row1 = rows.eq(rows.length - 2);\n        const row2 = rows.eq(rows.length - 1);\n\n        if (\n            row1.length &&\n            row2.length &&\n            !(\n                row1.find(\"input:eq(0)\").val().toString().trim() ||\n                row1.find(\"input:eq(1)\").val().toString().trim() ||\n                row1.find(\"input:eq(2)\").val().toString().trim()\n            ) &&\n            !(\n                row2.find(\"input:eq(0)\").val().toString().trim() ||\n                row2.find(\"input:eq(1)\").val().toString().trim() ||\n                row2.find(\"input:eq(2)\").val().toString().trim()\n            )\n        ) {\n            row2.remove();\n        }\n    }\n\n    setEventHandlers(): void {\n        super.setEventHandlers();\n        $(this.inputs.select).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n\n        const opts = $.extend(true, {}, {options: this.options});\n        schema.options = opts.options;\n        schema.optionsDict = {};\n\n        schema.options.forEach(function (option, index) {\n            if (schema.options[index].value === \"\") {\n                schema.options.splice(index, 1);\n            } else {\n                schema.options[index].disabled = MapSVG.parseBoolean(\n                    schema.options[index].disabled\n                );\n                schema.optionsDict[option.value] = option;\n            }\n        });\n\n        return schema;\n    }\n\n    setInputValue(value: string): void {\n        this.inputs.select.value = value;\n    }\n}\n","import { FormElement } from \"../FormElement\";\nimport { FormBuilder } from \"../../FormBuilder\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport * as CodeMirror from \"CodeMirror\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class TextareaFormElement extends FormElement {\n    searchType: string;\n    html: boolean;\n    htmlEditor: any;\n    autobr: boolean;\n    editor: CodeMirror.Editor;\n    inputs: { textarea: HTMLTextAreaElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchType = options.searchType || \"fulltext\";\n        this.searchable = MapSVG.parseBoolean(options.searchable);\n        this.autobr = options.autobr;\n        this.html = options.html;\n        this.db_type = \"text\";\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.textarea = $(this.domElements.main).find(\"textarea\")[0];\n\n        if (this.html) {\n            this.editor = CodeMirror.fromTextArea(this.inputs.textarea, {\n                mode: { name: \"handlebars\", base: \"text/html\" },\n                //@ts-ignore\n                matchBrackets: true,\n                lineNumbers: true,\n            });\n            if (this.formBuilder.admin) {\n                this.editor.on(\"change\", this.setTextareaValue);\n            }\n        }\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.textarea).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.autobr = this.autobr;\n        schema.html = this.html;\n        return schema;\n    }\n\n    getDataForTemplate(): { [p: string]: any } {\n        const data = super.getDataForTemplate();\n        data.html = this.html;\n        return data;\n    }\n\n    setTextareaValue(codemirror, changeobj) {\n        const handler = codemirror.getValue();\n        const textarea = $(codemirror.getTextArea());\n        textarea.val(handler).trigger(\"change\");\n    }\n\n    destroy() {\n        const cm = $(this.domElements.main).find(\".CodeMirror\");\n        if (cm.length) {\n            cm.empty().remove();\n        }\n    }\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class TextFormElement extends FormElement {\n    searchType: string;\n    searchFallback: boolean;\n    placeholder: string;\n    noResultsText: string;\n    width: string;\n    inputs: { text: HTMLInputElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchFallback = MapSVG.parseBoolean(options.searchFallback);\n        this.searchType = options.searchType;\n        this.width =\n            this.formBuilder.filtersHide && !this.formBuilder.modal\n                ? null\n                : options.width || \"100%\";\n        this.db_type = \"varchar(255)\";\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.text = <HTMLInputElement>$(this.domElements.main).find('input[type=\"text\"]')[0];\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.searchType = this.searchType;\n        return schema;\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.text).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    setInputValue(value: string): void {\n        this.inputs.text.value = value;\n    }\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class TitleFormElement extends FormElement {\n    searchType: string;\n    searchFallback: boolean;\n    placeholder: string;\n    noResultsText: string;\n    width: string;\n    inputs: { text: HTMLInputElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchFallback = MapSVG.parseBoolean(options.searchFallback);\n        this.width =\n            this.formBuilder.filtersHide && !this.formBuilder.modal\n                ? null\n                : options.width || \"100%\";\n        this.db_type = \"varchar(255)\";\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.text = <HTMLInputElement>$(this.domElements.main).find('input[type=\"text\"]')[0];\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.searchType = this.searchType;\n        return schema;\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.text).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n    }\n\n    setInputValue(value: string): void {\n        this.inputs.text.value = value;\n    }\n}\n","import { FormElement } from \"../FormElement.js\";\nimport { FormBuilder } from \"../../FormBuilder.js\";\nimport { MapSVG } from \"../../../Core/globals.js\";\nimport { SchemaField } from \"../../../Infrastructure/Server/SchemaField\";\n\nconst $ = jQuery;\n\nexport class ColorPickerFormElement extends FormElement {\n    searchType: string;\n    searchFallback: boolean;\n    placeholder: string;\n    noResultsText: string;\n    width: string;\n    inputs: { text: HTMLInputElement };\n\n    constructor(options: SchemaField, formBuilder: FormBuilder, external: { [key: string]: any }) {\n        super(options, formBuilder, external);\n        this.searchFallback = MapSVG.parseBoolean(options.searchFallback);\n        this.width =\n            this.formBuilder.filtersHide && !this.formBuilder.modal\n                ? null\n                : options.width || \"100%\";\n        this.db_type = \"varchar(255)\";\n    }\n\n    setDomElements() {\n        super.setDomElements();\n        this.inputs.text = <HTMLInputElement>$(this.domElements.main).find(\"input.cpicker\")[0];\n        $(this.domElements.main).find(\".colorpicker-element\").colorpicker();\n    }\n\n    getSchema(): { [p: string]: any } {\n        const schema = super.getSchema();\n        schema.searchType = this.searchType;\n        return schema;\n    }\n\n    setEventHandlers() {\n        super.setEventHandlers();\n        $(this.inputs.text).on(\"change keyup paste\", (e) => {\n            this.setValue(e.target.value, false);\n            this.triggerChanged();\n        });\n        $(this.domElements.main).find(\".colorpicker-element\").colorpicker().on(\n            \"changeColor.colorpicker\",\n            (e) => {\n                this.setValue(this.inputs.text.value, false);\n                this.triggerChanged();\n            }\n        );\n    }\n\n    setInputValue(value: string): void {\n        this.inputs.text.value = value;\n    }\n}\n","import * as FormElementTypes from \"./index.js\";\nimport { MapSVGMap } from \"../../Map/Map\";\nimport { FormBuilder } from \"../FormBuilder\";\nimport { SchemaField } from \"../../Infrastructure/Server/SchemaField\";\nimport { ArrayIndexed } from \"../../Core/ArrayIndexed\";\n\nconst $ = jQuery;\n\nexport class FormElementFactory {\n    mapsvg: MapSVGMap;\n    formBuilder: FormBuilder;\n    namespace: string;\n    editMode: boolean;\n    filtersMode: boolean;\n    mediaUploader: any;\n    showNames: boolean;\n\n    constructor(options: {\n        mapsvg: MapSVGMap;\n        formBuilder: FormBuilder;\n        editMode: boolean;\n        filtersMode: boolean;\n        namespace: string;\n        mediaUploader: any;\n        showNames?: boolean;\n    }) {\n        this.mapsvg = options.mapsvg;\n        this.editMode = options.editMode;\n        this.filtersMode = options.filtersMode;\n        this.namespace = options.namespace;\n        this.mediaUploader = options.mediaUploader;\n        this.formBuilder = options.formBuilder;\n        this.showNames = options.showNames !== false;\n    }\n\n    create(options: SchemaField): FormElementTypes.FormElementInterface {\n        const types = {\n            checkbox: FormElementTypes.CheckboxFormElement,\n            checkboxes: FormElementTypes.CheckboxesFormElement,\n            date: FormElementTypes.DateFormElement,\n            distance: FormElementTypes.DistanceFormElement,\n            empty: FormElementTypes.EmptyFormElement,\n            id: FormElementTypes.IdFormElement,\n            image: FormElementTypes.ImagesFormElement,\n            location: FormElementTypes.LocationFormElement,\n            modal: FormElementTypes.ModalFormElement,\n            post: FormElementTypes.PostFormElement,\n            radio: FormElementTypes.RadioFormElement,\n            region: FormElementTypes.RegionsFormElement,\n            save: FormElementTypes.SaveFormElement,\n            search: FormElementTypes.SearchFormElement,\n            select: FormElementTypes.SelectFormElement,\n            status: FormElementTypes.StatusFormElement,\n            text: FormElementTypes.TextFormElement,\n            textarea: FormElementTypes.TextareaFormElement,\n            title: FormElementTypes.TitleFormElement,\n            colorpicker: FormElementTypes.ColorPickerFormElement,\n        };\n\n        const formElement = new types[options.type](\n            options,\n            this.formBuilder,\n            this.getExtraParams()\n        );\n        formElement.init();\n        return formElement;\n    }\n\n    getExtraParams() {\n        const databaseFields = [];\n        const databaseFieldsFilterable = [];\n        const databaseFieldsFilterableShort = [];\n        const regionFields = [];\n        const regionFieldsFilterable = [];\n        const regions = new ArrayIndexed(\"id\");\n        let mapIsGeo = false;\n\n        if (this.mapsvg) {\n            mapIsGeo = this.mapsvg.isGeo();\n            const schemaObjects = this.mapsvg.objectsRepository.getSchema();\n            if (schemaObjects) {\n                schemaObjects.getFields().forEach(function (obj) {\n                    if (\n                        obj.type == \"text\" ||\n                        obj.type == \"region\" ||\n                        obj.type == \"textarea\" ||\n                        obj.type == \"post\" ||\n                        obj.type == \"select\" ||\n                        obj.type == \"radio\" ||\n                        obj.type == \"checkbox\"\n                    ) {\n                        if (obj.type == \"post\") {\n                            databaseFields.push(\"Object.post.post_title\");\n                        } else {\n                            databaseFields.push(\"Object.\" + obj.name);\n                        }\n                    }\n                    if (obj.type == \"region\" || obj.type == \"select\" || obj.type == \"radio\") {\n                        databaseFieldsFilterable.push(\"Object.\" + obj.name);\n                        databaseFieldsFilterableShort.push(obj.name);\n                    }\n                });\n            }\n\n            const schemaRegions = this.mapsvg.regionsRepository.getSchema();\n\n            if (schemaRegions) {\n                schemaRegions.getFieldsAsArray().forEach(function (obj) {\n                    if (\n                        obj.type == \"status\" ||\n                        obj.type == \"text\" ||\n                        obj.type == \"textarea\" ||\n                        obj.type == \"post\" ||\n                        obj.type == \"select\" ||\n                        obj.type == \"radio\" ||\n                        obj.type == \"checkbox\"\n                    ) {\n                        if (obj.type == \"post\") {\n                            regionFields.push(\"Region.post.post_title\");\n                        } else {\n                            regionFields.push(\"Region.\" + obj.name);\n                        }\n                    }\n                    if (obj.type == \"status\" || obj.type == \"select\" || obj.type == \"radio\") {\n                        regionFieldsFilterable.push(\"Region.\" + obj.name);\n                    }\n                });\n            }\n\n            this.mapsvg.regions.forEach((region) => {\n                regions.push({ id: region.id, title: region.title });\n            });\n        }\n\n        return {\n            databaseFields: databaseFields,\n            databaseFieldsFilterable: databaseFieldsFilterable,\n            databaseFieldsFilterableShort: databaseFieldsFilterableShort,\n            regionFields: regionFields,\n            regionFieldsFilterable: regionFieldsFilterable,\n            regions: regions,\n            mapIsGeo: mapIsGeo,\n            mediaUploader: this.mediaUploader,\n            filtersMode: this.filtersMode,\n            showNames: this.showNames,\n        };\n    }\n}\n","/// <reference path=\"../../vendor/jquery-plugins.d.ts\" />\nimport { MapSVG } from \"../Core/globals.js\";\nimport { MapSVGMap } from \"../Map/Map\";\nimport { Schema } from \"../Infrastructure/Server/Schema\";\n// import {Handlebars} from \"../../handlebars.js\"\n// @ts-ignore\nimport Handlebars from \"Handlebars\";\nimport { ResizeSensor } from \"../Core/ResizeSensor\";\nimport { Events } from \"../Core/Events\";\nimport * as FormElementTypes from \"./FormElements/index.js\";\nimport { FormElementFactory } from \"./FormElements/FormElementFactory.js\";\nimport { GeoPoint, Location, SVGPoint } from \"../Location/Location.js\";\nimport { Marker } from \"../Marker/Marker.js\";\nimport { Region } from \"../Region/Region.js\";\nimport { FormElementInterface, LocationFormElement } from \"./FormElements/index.js\";\nimport { ArrayIndexed } from \"../Core/ArrayIndexed\";\nimport { SchemaField } from \"../Infrastructure/Server/SchemaField\";\nimport { FormElement } from \"./FormElements/FormElement\";\nconst $ = jQuery;\n\nexport class FormBuilder {\n    container: HTMLElement;\n    namespace: string;\n    mediaUploader: any; // WP Media uploader class\n    schema: Schema;\n    events: Events;\n    formElementFactory: FormElementFactory;\n\n    structureChanged: boolean;\n\n    isLoading: boolean;\n\n    editMode: boolean;\n    filtersMode: boolean;\n    filtersHide: boolean;\n    showFiltersButton: FormElementTypes.FormElementInterface;\n    modal: boolean;\n    admin: any; // MapSVG Admin class?\n    mapsvg: MapSVGMap;\n    data: { [key: string]: any };\n    clearButton: boolean;\n    clearButtonText: string;\n    searchButton: boolean;\n    searchButtonText: string;\n    showButtonText: string;\n    template: string;\n    closeOnSave: boolean;\n    newRecord: boolean;\n    types: string[];\n    sortable: any;\n    saved: boolean;\n    scrollable: boolean;\n    showNames: boolean;\n\n    templates: { [key: string]: Function };\n    elements: { [key: string]: { [key: string]: HTMLElement } };\n    form: HTMLFormElement;\n    formEditor: HTMLFormElement;\n    view: HTMLElement;\n\n    formElements: ArrayIndexed<FormElementTypes.FormElementInterface>;\n    currentlyEditing: FormElementTypes.FormElementInterface;\n    markerBackup: { id: string; src: string; svgPoint: SVGPoint; geoPoint: GeoPoint };\n    location: Location;\n    scrollApi: any; // jScrollPane instance\n\n    backupData?: {\n        location: Location;\n        marker: Marker;\n    };\n    editingMarker?: Marker;\n    mediaUploaderisOpenedFor: FormElementInterface;\n\n    constructor(options: { [key: string]: any }) {\n        // schema, editMode, mapsvg, mediaUploader, data, admin, namespace\n        const _this = this;\n\n        this.events = new Events();\n\n        // options\n        this.container = options.container;\n        this.namespace = options.namespace;\n        this.mediaUploader = options.mediaUploader;\n        this.schema = options.schema || [];\n        this.editMode = options.editMode == undefined ? false : options.editMode;\n        this.filtersMode = options.filtersMode == undefined ? false : options.filtersMode;\n        this.filtersHide = options.filtersHide == undefined ? false : options.filtersHide;\n        this.modal = options.modal == undefined ? false : options.modal;\n        this.admin = options.admin;\n        this.mapsvg = <MapSVGMap>options.mapsvg;\n        this.data = options.data || {};\n        this.clearButton = options.clearButton || false;\n        this.clearButtonText = options.clearButtonText || \"\";\n        this.searchButton = options.searchButton || false;\n        this.searchButtonText = options.searchButtonText || \"\";\n        this.showButtonText = options.showButtonText || \"\";\n        this.scrollable =\n            typeof options.scrollable !== \"undefined\"\n                ? options.scrollable\n                : !_this.editMode && !_this.filtersMode;\n        this.showNames = typeof options.showNames !== \"undefined\" ? options.showNames : true;\n\n        this.formElementFactory = new FormElementFactory({\n            mapsvg: this.mapsvg,\n            formBuilder: this,\n            mediaUploader: this.mediaUploader,\n            editMode: this.editMode,\n            filtersMode: this.filtersMode,\n            namespace: this.namespace,\n            showNames: this.showNames,\n        });\n\n        this.events = new Events(this);\n        if (options.events && Object.keys(options.events).length > 0) {\n            for (const eventName in options.events) {\n                this.events.on(eventName, options.events[eventName]);\n            }\n        }\n        this.template = \"form-builder\";\n        this.closeOnSave = options.closeOnSave === true;\n        this.newRecord = options.newRecord === true;\n        this.types = options.types || [\n            \"text\",\n            \"textarea\",\n            \"checkbox\",\n            \"radio\",\n            \"select\",\n            \"image\",\n            \"region\",\n            \"location\",\n            \"post\",\n            \"date\",\n        ];\n\n        this.templates = {};\n        this.elements = {};\n        this.view = $(\"<div />\").addClass(\"mapsvg-form-builder\")[0];\n        if (this.editMode) $(this.view).addClass(\"full-flex\");\n        if (!this.showNames) {\n            $(this.view).addClass(\"hide-names\");\n        }\n\n        this.formElements = new ArrayIndexed(\"name\");\n\n        if (!MapSVG.templatesLoaded[this.template]) {\n            this.loadTemplates(() => this.init());\n        } else {\n            this.init();\n        }\n    }\n\n    private loadTemplates(callback: () => void): void {\n        $.get(MapSVG.urls.root + \"dist/\" + this.template + \".html?v=\" + MapSVG.version, (data) => {\n            $(data).appendTo(\"body\");\n            MapSVG.templatesLoaded[this.template] = true;\n            Handlebars.registerPartial(\"dataMarkerPartial\", $(\"#mapsvg-data-tmpl-marker\").html());\n            if (this.editMode) {\n                Handlebars.registerPartial(\n                    \"markerByFieldPartial\",\n                    $(\"#mapsvg-markers-by-field-tmpl-partial\").html()\n                );\n            }\n            callback();\n        });\n    }\n\n    init() {\n        const _this = this;\n\n        // The global formBuilder property is needed to handle hotkeys (close / OK buttons)\n        // @ts-ignore\n        MapSVG.formBuilder = this;\n\n        this.form = document.createElement(\"form\");\n        this.form.className = \"mapsvg-data-form-view\";\n        if (!this.filtersMode) {\n            this.form.classList.add(\"form-horizontal\");\n        }\n\n        if (this.editMode) {\n            const template = document.getElementById(\"mapsvg-form-editor-tmpl-ui\").innerHTML;\n            const templateCompiled = Handlebars.compile(template);\n            this.view.innerHTML = templateCompiled({ types: this.types });\n            this.view.classList.add(\"edit\");\n            this.form.classList.add(\"mapsvg-data-flex-full\");\n            this.form.classList.add(\"mapsvg-data-container\");\n            $(this.view).find(\".mapsvg-data-preview\").prepend(this.form);\n            this.formEditor = <HTMLFormElement>$(this.view).find(\"#mapsvg-data-form-edit\")[0];\n        } else {\n            this.view.appendChild(this.form);\n        }\n\n        _this.elements = {\n            buttons: {\n                text: $(_this.view).find(\"#mapsvg-data-btn-text\")[0],\n                textarea: $(_this.view).find(\"#mapsvg-data-btn-textarea\")[0],\n                checkbox: $(_this.view).find(\"#mapsvg-data-btn-checkbox\")[0],\n                radio: $(_this.view).find(\"#mapsvg-data-btn-radio\")[0],\n                select: $(_this.view).find(\"#mapsvg-data-btn-select\")[0],\n                image: $(_this.view).find(\"#mapsvg-data-btn-image\")[0],\n                region: $(_this.view).find(\"#mapsvg-data-btn-region\")[0],\n                marker: $(_this.view).find(\"#mapsvg-data-btn-marker\")[0],\n                saveSchema: $(_this.view).find(\"#mapsvg-data-btn-save-schema\")[0],\n            },\n            containers: {\n                buttons_add: $(_this.view).find(\"#mapsvg-data-buttons-add\")[0],\n            },\n        };\n\n        _this.redraw();\n    }\n\n    getForm(): HTMLFormElement {\n        return this.form;\n    }\n    getFormEditor(): HTMLFormElement {\n        return this.formEditor;\n    }\n\n    viewDidLoad() {}\n\n    setEventHandlers() {\n        const _this = this;\n\n        $(this.getForm()).on(\"submit\", (e) => {\n            e.preventDefault();\n        });\n\n        if (this.filtersMode && this.clearButton) {\n            $(this.elements.buttons.clearButton).on(\"click\", (e) => {\n                e.preventDefault();\n                this.clearAllFields();\n            });\n        }\n\n        $(window)\n            .off(\"keydown.form.mapsvg\")\n            .on(\"keydown.form.mapsvg\", function (e) {\n                // @ts-ignore\n                if (MapSVG.formBuilder) {\n                    if ((e.metaKey || e.ctrlKey) && e.keyCode == 13)\n                        // @ts-ignore\n                        MapSVG.formBuilder.save();\n                    else if (e.keyCode == 27)\n                        // @ts-ignore\n                        MapSVG.formBuilder.close();\n                }\n            });\n\n        if (this.editMode) {\n            $(this.view).on(\"click\", \"#mapsvg-data-buttons-add button\", function (e) {\n                e.preventDefault();\n                const type = $(this).data(\"create\");\n                const formElement = _this.formElementFactory.create({ type: type });\n                _this.addField(formElement);\n            });\n            $(this.view).on(\"click\", \"#mapsvg-data-btn-save-schema\", function (e) {\n                e.preventDefault();\n                const fields = _this.getSchema();\n\n                const counts = {};\n                _this.formElements.forEach(function (elem) {\n                    counts[elem.name] = (counts[elem.name] || 0) + 1;\n                });\n\n                $(_this.getForm()).find(\".form-group\").removeClass(\"has-error\");\n                const errors = [];\n\n                const reservedFields = [\n                    \"lat\",\n                    \"lon\",\n                    \"lng\",\n                    \"location\",\n                    \"location_lat\",\n                    \"location_lon\",\n                    \"location_lng\",\n                    \"location_address\",\n                    \"location_img\",\n                    \"marker\",\n                    \"marker_id\",\n                    \"regions\",\n                    \"region_id\",\n                    \"post\",\n                    \"post_title\",\n                    \"post_url\",\n                    \"keywords\",\n                    \"status\",\n                ];\n                const reservedFieldsToTypes = {\n                    regions: \"region\",\n                    status: \"status\",\n                    post: \"post\",\n                    marker: \"marker\",\n                    location: \"location\",\n                };\n\n                let errUnique, errEmpty;\n\n                _this.formElements.forEach(function (\n                    formElement: FormElementTypes.FormElementInterface,\n                    index\n                ) {\n                    let err = false;\n\n                    // If that's not Form Builder for Filters (when there is no \"name\" parameter)\n                    // we should check if names are non-empty and unique\n                    if (!_this.filtersMode) {\n                        if (counts[formElement.name] > 1) {\n                            if (!errUnique) {\n                                errUnique = \"Field names should be unique\";\n                                errors.push(errUnique);\n                                err = true;\n                            }\n                        } else if (formElement.name.length === 0) {\n                            if (!errEmpty) {\n                                errEmpty = \"Field name can't be empty\";\n                                errors.push(errEmpty);\n                                err = true;\n                            }\n                        } else if (reservedFields.indexOf(formElement.name) != -1) {\n                            // if reserved field name is for proper type of object then it's OK\n                            if (\n                                !reservedFieldsToTypes[formElement.name] ||\n                                (reservedFieldsToTypes[formElement.name] &&\n                                    reservedFieldsToTypes[formElement.name] != formElement.type)\n                            ) {\n                                const msg =\n                                    'Field name \"' +\n                                    formElement.name +\n                                    '\" is reserved, please set another name';\n                                errors.push(msg);\n                                err = true;\n                            }\n                        }\n                    }\n\n                    if (\n                        formElement.options &&\n                        formElement.type != \"region\" &&\n                        formElement.type != \"marker\"\n                    ) {\n                        const vals = formElement.options.map(function (obj: {\n                            label: string;\n                            value: string;\n                        }) {\n                            return obj.value;\n                        });\n                        const uniq = [...Array.from(new Set(vals).values())];\n                        if (vals.length != uniq.length) {\n                            errors.push('Check \"Options\" list - values should not repeat');\n                            err = true;\n                        }\n                    }\n\n                    err && $(formElement.domElements.main).addClass(\"has-error\");\n                });\n\n                if (errors.length === 0) {\n                    _this.events.trigger(\"saveSchema\", _this, [_this, fields]);\n                } else {\n                    jQuery.growl.error({ title: \"Errors\", message: errors.join(\"<br />\") });\n                }\n            });\n            setTimeout(function () {\n                const el = _this.getForm();\n                // @ts-ignore\n                _this.sortable = new Sortable(el, {\n                    animation: 150,\n                    onStart: function () {\n                        $(_this.getForm()).addClass(\"sorting\");\n                    },\n                    onEnd: function () {\n                        setTimeout(function () {\n                            $(_this.getForm()).removeClass(\"sorting\");\n                            _this.formElements.clear();\n                            $(el)\n                                .find(\".form-group\")\n                                .each(function (index, elem) {\n                                    _this.formElements.push($(elem).data(\"formElement\"));\n                                });\n                        }, 500);\n                    },\n                });\n            }, 1000);\n        } else {\n            // Save\n            // $(_this.view).on('click','button.btn-save',function(e){\n            //     e.preventDefault();\n            //     _this.save();\n            // });\n            // Close\n            // jQuery(_this.view).on('click','button.btn-close', function(){\n            //     alert(1);\n            // });\n            // $(_this.view).on('click','button.btn-close',function(e){\n            //     e.preventDefault();\n            //     _this.close();\n            // });\n        }\n\n        new ResizeSensor(this.view, function () {\n            _this.scrollApi && _this.scrollApi.reinitialise();\n        });\n    }\n\n    private clearAllFields() {\n        this.formElements.forEach((f) => f.setValue(null));\n        // $(this.getForm())\n        //     .find(\"input\")\n        //     .not(\":button, :submit, :reset, :hidden, :checkbox, :radio\")\n        //     .val(\"\")\n        //     .prop(\"selected\", false);\n        // $(this.getForm()).find('input[type=\"radio\"]').prop(\"checked\", false);\n        // $(this.getForm()).find('input[type=\"checkbox\"]').prop(\"checked\", false);\n        // $(this.getForm()).find(\"select\").val(\"\").trigger(\"change.select2\");\n        this.events.trigger(\"cleared\");\n    }\n\n    setFormElementEventHandlers(formElement: FormElementTypes.FormElementInterface) {\n        const _this = this;\n\n        if (this.editMode) {\n            formElement.events.on(\"click\", (elem) => {\n                this.edit(elem);\n            });\n            formElement.events.on(\"delete\", (elem) => {\n                this.deleteField(elem);\n            });\n        } else {\n            formElement.events.on(\"changed\", (_formElement) => {\n                const name = _formElement.name;\n                const value = _formElement.getValue();\n                // TODO check how this works with names like name[a][b][c]\n                if (_formElement.type !== \"search\") {\n                    this.events.trigger(\"changed.field\", _formElement, [_formElement, name, value]);\n                } else {\n                    this.events.trigger(\"changed.search\", _formElement, [_formElement, value]);\n                }\n            });\n\n            /*\n            const locationField =\n                _this.mapsvg &&\n                _this.mapsvg.objectsRepository &&\n                _this.mapsvg.objectsRepository.getSchema() &&\n                _this.mapsvg.objectsRepository.getSchema().getField(\"location\");\n            // @ts-ignore\n            if (\n                locationField &&\n                locationField.markersByFieldEnabled &&\n                locationField.markerField &&\n                formElement.name == locationField.markerField &&\n                Object.values(locationField.markersByField).length > 0\n            ) {\n                formElement.events.on(\"changed\", (_formElement) => {\n                    const name = _formElement.name;\n                    const value = _formElement.value;\n                    // @ts-ignore\n                    const src = locationField.markersByField[value];\n                    if (src) {\n                        if (_this.markerBackup) {\n                            const marker = _this.mapsvg.getMarker(_this.markerBackup.id);\n                            marker.setImage(src);\n                            $(_this.view).find(\".mapsvg-marker-image-btn img\").attr(\"src\", src);\n                        }\n                        // _this.markerBackupImageButton.attr('src',src);\n                    }\n                });\n            }\n\n             */\n        }\n    }\n\n    save() {\n        const _this = this;\n\n        if (_this.markerBackup) {\n            const marker = _this.mapsvg.getEditingMarker();\n            marker.events.off(\"change\");\n            _this.markerBackup = marker.getOptions();\n            _this.mapsvg.unsetEditingMarker();\n        }\n\n        const data = _this.getData();\n        _this.saved = true;\n\n        this.events.trigger(\"save\", _this, [_this, data]);\n    }\n\n    getFormElementByType(type: string): FormElementTypes.FormElementInterface {\n        return this.formElements.find((el) => el.type === type);\n    }\n\n    getData(): { [key: string]: any } {\n        const data = {};\n        this.formElements.forEach((formElement) => {\n            if (formElement.readonly === false || formElement.type === \"id\") {\n                const _formElementData = formElement.getData();\n                data[_formElementData.name] = _formElementData.value;\n            }\n        });\n        return data;\n    }\n\n    reset(): void {\n        this.formElements.forEach((formElement) => {\n            formElement.setValue(null);\n        });\n    }\n\n    update(data: { [key: string]: any }): void {\n        this.schema.getFields().forEach((field) => {\n            const formElement = <FormElement>this.formElements.get(field.name);\n            if (formElement) {\n                if (typeof data[field.name] !== \"undefined\") {\n                    if (formElement.getValue() !== data[field.name]) {\n                        formElement.setValue(data[field.name]);\n                    }\n                } else {\n                    formElement.setValue(null);\n                }\n            }\n        });\n    }\n\n    redraw(): void {\n        const _this = this;\n\n        delete _this.markerBackup;\n\n        $(this.container).empty();\n        $(this.getForm()).empty();\n        this.formElements.clear();\n\n        this.schema &&\n            this.schema.fields.length > 0 &&\n            this.schema.fields.forEach((fieldSettings: SchemaField) => {\n                if (this.filtersMode) {\n                    if (fieldSettings.type == \"distance\") {\n                        fieldSettings.value = this.data.distance\n                            ? this.data.distance\n                            : fieldSettings.value !== undefined\n                            ? fieldSettings.value\n                            : null;\n                    } else {\n                        fieldSettings.value = this.data[fieldSettings.parameterNameShort];\n                    }\n                } else {\n                    fieldSettings.value = this.data\n                        ? this.data[fieldSettings.name]\n                        : fieldSettings.value !== undefined\n                        ? fieldSettings.value\n                        : null;\n                }\n\n                if (fieldSettings.type == \"location\" && !this.editMode) {\n                    // add Marker Object into formElement\n                    if (\n                        fieldSettings.value &&\n                        fieldSettings.value.marker &&\n                        fieldSettings.value.marker.id\n                    ) {\n                        //this.markerBackup = fieldSettings.value.marker.getOptions();\n                        //this.mapsvg.setEditingMarker(fieldSettings.value.marker);\n                    }\n                    this.admin && this.admin.setMode && this.admin.setMode(\"editMarkers\");\n                    this.admin && this.admin.enableMarkersMode(true);\n                } else if (fieldSettings.type == \"post\") {\n                    fieldSettings.post = this.data[\"post\"];\n                } else if (fieldSettings.type === \"region\") {\n                    fieldSettings.options = new ArrayIndexed(\"id\", this.getRegionsList());\n                }\n\n                const formElement = this.formElementFactory.create(fieldSettings);\n                if (this.filtersMode) {\n                    if (\n                        !this.filtersHide ||\n                        (this.filtersHide && this.modal && fieldSettings.type !== \"search\") ||\n                        (!this.modal && fieldSettings.type === \"search\")\n                    ) {\n                        this.addField(formElement);\n                    }\n                } else {\n                    this.addField(formElement);\n                }\n            });\n\n        if (!_this.editMode) {\n            if (this.schema.fields.length === 0 && !this.filtersMode) {\n                const formElement = this.formElementFactory.create({ type: \"empty\" });\n                _this.addField(formElement);\n            } else {\n                if (_this.admin && !_this.admin.isMetabox) {\n                    const formElement = this.formElementFactory.create({ type: \"save\" });\n                    formElement.events.on(\"click.btn.save\", () => {\n                        this.save();\n                    });\n                    formElement.events.on(\"click.btn.close\", () => {\n                        this.close();\n                    });\n                    _this.addField(formElement);\n                }\n            }\n        }\n\n        // If part of filters is hidden in a modal, and what is showing now is NOT a modal,\n        // then add a \"Show filters\" button that opens a modal with remaining filers.\n        if (_this.filtersMode && _this.filtersHide && !_this.modal) {\n            const formElement = this.formElementFactory.create({\n                type: \"modal\",\n                showButtonText: _this.showButtonText,\n            });\n            this.showFiltersButton = _this.addField(formElement);\n        }\n\n        if (this.scrollable) {\n            const nano = $('<div class=\"nano\"></div>');\n            const nanoContent = $('<div class=\"nano-content\"></div>');\n            nano.append(nanoContent);\n            // nanoContent.html(this.view);\n            // $(_this.container).html(nano.html());\n            nanoContent.append(this.view);\n            $(_this.container).append(nano);\n\n            // @ts-ignore\n            nano.jScrollPane({ contentWidth: \"0px\", mouseWheelSpeed: 30 });\n            _this.scrollApi = nano.data(\"jsp\");\n        } else {\n            // $(_this.container).html(this.view);\n            $(_this.container).append(this.view);\n        }\n\n        // If FormBuilder is used to create filters and \"Add clear button\" option is \"on\"\n        // then add the \"Clear all\" button\n        if (_this.filtersMode && _this.clearButton) {\n            _this.elements.buttons.clearButton = $(\n                '<div class=\"form-group mapsvg-filters-reset-container\">' +\n                    '<button type=\"button\" class=\"btn btn-outline-secondary mapsvg-filters-reset\">' +\n                    _this.clearButtonText +\n                    \"</button></div>\"\n            )[0];\n            $(this.getForm()).append(_this.elements.buttons.clearButton);\n        }\n        if (_this.filtersMode && _this.searchButton) {\n            _this.elements.buttons.searchButton = $(\n                '<div class=\"form-group mapsvg-filters-reset-container\" id=\"mapsvg-search-container\"><button class=\"btn btn-outline-secondary mapsvg-filters-reset\">' +\n                    _this.searchButtonText +\n                    \"</button></div>\"\n            )[0];\n            $(this.getForm()).append(_this.elements.buttons.searchButton);\n        }\n\n        if (!this.editMode && !_this.filtersMode)\n            $(this.view).find(\"input:visible,textarea:visible\").not(\".tt-hint\").first().focus();\n\n        const cm = $(this.container).find(\".CodeMirror\");\n\n        cm.each(function (index, el) {\n            // @ts-ignore\n            el && el.CodeMirror.refresh();\n        });\n        _this.setEventHandlers();\n        this.events.trigger(\"init\", this, [this, this.getData()]);\n        this.events.trigger(\"loaded\", this, [this]);\n    }\n\n    updateExtraParamsInFormElements() {\n        this.formElements.forEach((formElement) => {\n            formElement.setExternal(this.formElementFactory.getExtraParams());\n            if (formElement.type === \"location\") {\n                formElement.redraw();\n            }\n        });\n    }\n\n    deleteField(formElement) {\n        const _this = this;\n        _this.formElements.delete(formElement.name);\n        // _this.formElements.forEach(function(fc, index){\n        //     if(fc === formElement){\n        //         _this.formElements.splice(index,1);\n        //         _this.structureChanged = true;\n        //     }\n        // });\n    }\n\n    getExtraParams() {\n        const databaseFields = [];\n        this.mapsvg.objectsRepository\n            .getSchema()\n            .getFields()\n            .forEach(function (obj) {\n                if (\n                    obj.type == \"text\" ||\n                    obj.type == \"region\" ||\n                    obj.type == \"textarea\" ||\n                    obj.type == \"post\" ||\n                    obj.type == \"select\" ||\n                    obj.type == \"radio\" ||\n                    obj.type == \"checkbox\"\n                ) {\n                    if (obj.type == \"post\") {\n                        databaseFields.push(\"Object.post.post_title\");\n                    } else {\n                        databaseFields.push(\"Object.\" + obj.name);\n                    }\n                }\n            });\n        let databaseFieldsFilterableShort = [];\n        databaseFieldsFilterableShort = this.mapsvg.objectsRepository\n            .getSchema()\n            .getFieldsAsArray()\n            .filter(function (obj) {\n                return obj.type == \"select\" || obj.type == \"radio\" || obj.type == \"region\";\n            })\n            .map(function (obj) {\n                return obj.name;\n            });\n        let markerFieldsShort = [];\n        markerFieldsShort = databaseFieldsFilterableShort.filter(\n            (o) => o.type === \"select\" || o.type === \"radio\"\n        );\n        const regionFields = this.mapsvg.regionsRepository\n            .getSchema()\n            .getFieldsAsArray()\n            .map(function (obj) {\n                if (\n                    obj.type == \"status\" ||\n                    obj.type == \"text\" ||\n                    obj.type == \"textarea\" ||\n                    obj.type == \"post\" ||\n                    obj.type == \"select\" ||\n                    obj.type == \"radio\" ||\n                    obj.type == \"checkbox\"\n                ) {\n                    if (obj.type == \"post\") {\n                        return \"Region.post.post_title\";\n                    } else {\n                        return \"Region.\" + obj.name;\n                    }\n                }\n            });\n        return {\n            databaseFields: databaseFields,\n            databaseFieldsFilterableShort: databaseFieldsFilterableShort,\n            regionFields: regionFields,\n            markerFieldsShort: markerFieldsShort,\n        };\n    }\n\n    addField(formElement: FormElementTypes.FormElementInterface) {\n        const _this = this;\n\n        // Check if field can be added - some fields can be added only once:\n        if (\n            [\"region\", \"marker\", \"post\", \"status\", \"distance\", \"location\", \"search\"].indexOf(\n                formElement.type\n            ) != -1\n        ) {\n            let repeat = false;\n            _this.formElements.forEach(function (control) {\n                if (control.type == formElement.type) repeat = true;\n            });\n            if (repeat) {\n                jQuery.growl.error({\n                    title: \"Error\",\n                    message: 'You can add only 1 \"' + MapSVG.ucfirst(formElement.type) + '\" field',\n                });\n                return;\n            }\n        }\n\n        _this.formElements.push(formElement);\n\n        _this.getForm().append(formElement.domElements.main);\n\n        this.setFormElementEventHandlers(formElement);\n\n        if (this.editMode) {\n            if (formElement.protected) {\n                formElement.hide();\n            } else {\n                this.edit(formElement);\n            }\n        }\n        return formElement;\n    }\n\n    edit(formElement: FormElementTypes.FormElementInterface) {\n        const _this = this;\n\n        // destroy previous editor\n        _this.currentlyEditing && _this.currentlyEditing.destroyEditor();\n\n        // create new  editor\n        this.getFormEditor().appendChild(formElement.getEditor());\n        // setTimeout(function(){\n        formElement.initEditor();\n        _this.currentlyEditing = formElement;\n        $(_this.getForm()).find(\".form-group.active\").removeClass(\"active\");\n        $(formElement.domElements.main).addClass(\"active\");\n        // }, 500);\n    }\n\n    get() {\n        // return this.formElements.map(function(c){\n        //     return c.get();\n        // });\n    }\n\n    getSchema() {\n        return this.formElements.map(function (formElement) {\n            return formElement.getSchema();\n        });\n    }\n\n    close() {\n        const _this = this;\n\n        // $('body').off('keydown.mapsvg');\n\n        this.formElements.forEach((formElement) => formElement.destroy());\n        this.mediaUploader && this.mediaUploader.off(\"select\");\n\n        MapSVG.formBuilder = null;\n        this.events.trigger(\"close\", this, [this]);\n    }\n\n    destroy() {\n        $(this.view).empty().remove();\n        this.sortable = null;\n    }\n\n    toJSON(addEmpty) {\n        const obj = {};\n\n        function add(obj, name, value) {\n            if (!addEmpty && !value) return false;\n            if (name.length == 1) {\n                obj[name[0]] = value;\n            } else {\n                if (obj[name[0]] == null) {\n                    if (name[1] === \"\") {\n                        obj[name[0]] = [];\n                    } else {\n                        obj[name[0]] = {};\n                    }\n                }\n\n                if (obj[name[0]].length !== undefined) {\n                    obj[name[0]].push(value);\n                } else {\n                    add(obj[name[0]], name.slice(1), value);\n                }\n            }\n        }\n\n        $(this.elements.containers.formView)\n            .find(\"input, textarea, select\")\n            .each(function () {\n                if (\n                    !$(this).data(\"skip\") &&\n                    !$(this).prop(\"disabled\") &&\n                    $(this).attr(\"name\") &&\n                    !(\n                        !addEmpty &&\n                        $(this).attr(\"type\") == \"checkbox\" &&\n                        $(this).attr(\"checked\") == undefined\n                    ) &&\n                    !($(this).attr(\"type\") == \"radio\" && $(this).attr(\"checked\") == undefined)\n                ) {\n                    let value;\n                    if ($(this).attr(\"type\") == \"checkbox\") {\n                        value = $(this).prop(\"checked\");\n                    } else {\n                        value = $(this).val();\n                    }\n                    add(obj, $(this).attr(\"name\").replace(/]/g, \"\").split(\"[\"), value);\n                }\n            });\n\n        return obj;\n    }\n\n    getRegionsList(): { id: string; title: string }[] {\n        return this.mapsvg.regions.map(function (r) {\n            return { id: r.id, title: r.title };\n        });\n    }\n    getRegionsAsArray(): Region[] {\n        return this.mapsvg.regions;\n    }\n\n    private setRegions(location: Location) {\n        const regionsFormElement = <FormElementInterface>this.formElements.get(\"regions\");\n\n        if (this.mapsvg.options.source.indexOf(\"/geo-calibrated/usa.svg\") !== -1) {\n            // If this is the map of USA, choose the corresponding state by region ID in the \"regions\" field\n            regionsFormElement.setValue([\"US-\" + location.address.state_short]);\n        } else if (this.mapsvg.options.source.indexOf(\"/geo-calibrated/world.svg\") !== -1) {\n            // If this is the world.svg map, choose the corresponding country by country ID in the \"regions\" field\n            if (location.address.country_short) {\n                regionsFormElement.setValue([location.address.country_short]);\n            }\n        } else {\n            if (location.address.administrative_area_level_1) {\n                this.mapsvg.regions.forEach((_region: Region) => {\n                    if (\n                        _region.title === location.address.administrative_area_level_1 ||\n                        _region.title === location.address.administrative_area_level_2 ||\n                        _region.id ===\n                            location.address.country_short +\n                                \"-\" +\n                                location.address.administrative_area_level_1_short\n                    ) {\n                        regionsFormElement.setValue([_region.id]);\n                    }\n                });\n            }\n        }\n    }\n\n    setIsLoading(value: boolean): void {\n        this.isLoading = value;\n        if (this.searchButton) {\n            if (this.isLoading) {\n                $(this.elements.buttons.searchButton).find(\"button\").attr(\"disabled\", \"disabled\");\n            } else {\n                $(this.elements.buttons.searchButton).find(\"button\").removeAttr(\"disabled\");\n            }\n        }\n    }\n}\n","/**\n * FiltersController class adds filters for the database.\n * @param options\n * @constructor\n */\nimport { DetailsController } from \"../Details/Details.js\";\nimport { FormBuilder } from \"../FormBuilder/FormBuilder.js\";\nimport { Schema } from \"../Infrastructure/Server/Schema.js\";\nimport { Query } from \"../Infrastructure/Server/Query.js\";\n// import {RepositoryInterface} from \"../Core/Repository.js\";\nconst $ = jQuery;\n\nexport class FiltersController extends DetailsController {\n    schema: Schema;\n    hideFilters: boolean;\n    query: Query;\n    source: string;\n    location: string;\n    width: string;\n    filteredRegionsStatus: number;\n    modalLocation: string;\n    hideOnMobile: boolean;\n    hide: boolean;\n    padding: string;\n    showButtonText: boolean;\n    clearButton: boolean;\n    clearButtonText: string;\n    searchButton: boolean;\n    searchButtonText: string;\n\n    // repository: RepositoryInterface;\n    formBuilder: FormBuilder;\n\n    constructor(options: { [key: string]: any }) {\n        super(options);\n\n        this.showButtonText = options.showButtonText;\n        this.clearButton = options.clearButton;\n        this.clearButtonText = options.clearButtonText;\n        this.searchButton = options.searchButton;\n        this.searchButtonText = options.searchButtonText;\n        this.padding = options.padding;\n        this.schema = options.schema;\n        this.hideFilters = options.hide;\n        this.query = options.query;\n    }\n\n    viewDidLoad(): void {\n        super.viewDidLoad();\n        const _this = this;\n\n        this.formBuilder = new FormBuilder({\n            container: this.containers.contentView,\n            filtersMode: true,\n            schema: this.schema,\n            modal: this.modal,\n            filtersHide: this.hideFilters,\n            showButtonText: this.showButtonText,\n            clearButton: this.clearButton,\n            clearButtonText: this.clearButtonText,\n            searchButton: this.searchButton,\n            searchButtonText: this.searchButtonText,\n            editMode: false,\n            mapsvg: this.mapsvg,\n            data: {}, //this.query,\n            admin: false,\n            events: {\n                \"changed.field\": (formElement, field, value) => {\n                    const filters: any = {};\n                    let _value = value;\n                    if (field === \"regions\") {\n                        _value = {};\n                        _value.region_ids = value instanceof Array ? value : [value];\n                        _value.table_name = this.mapsvg.options.database.regionsTableName;\n                        if (_value.region_ids.length === 0 || _value.region_ids[0] === \"\") {\n                            _value = null;\n                        }\n                    }\n                    filters[field] = _value;\n                    this.query.setFilters(filters);\n                    _this.events.trigger(\"changed.field\", _this, [field, value]);\n                    _this.events.trigger(\"changed.fields\", _this, [field, value]);\n                },\n                \"changed.search\": (formElement, value) => {\n                    this.query.setSearch(value);\n                    _this.events.trigger(\"changed.search\", _this, [value]);\n                },\n                cleared: (formBuilder) => {\n                    this.query.clearFilters();\n                    this.events.trigger(\"cleared\", _this, []);\n                },\n                loaded: (formBuilder) => {\n                    $(formBuilder.container).find(\".mapsvg-form-builder\").css({\n                        padding: _this.padding,\n                    });\n                    this.updateScroll();\n                    this.events.trigger(\"loaded\");\n                },\n            },\n        });\n    }\n\n    reset(): void {\n        this.formBuilder && this.formBuilder.reset();\n    }\n\n    update(query: Query): void {\n        const _query = Object.assign({}, query.filters);\n        _query.search = query.search;\n        this.formBuilder && this.formBuilder.update(_query);\n    }\n\n    /**\n     * Sets filters counter on the \"Show filters\" button when compact mode is enabled and filters are hidden\n     */\n    setFiltersCounter(): void {\n        if (this.hideFilters) {\n            // Don't include \"search\" filter into counter since it's always outside of the modal\n            const filtersCounter = Object.keys(this.query.filters).length;\n\n            const filtersCounterString = filtersCounter === 0 ? \"\" : filtersCounter.toString();\n            this.formBuilder &&\n                this.formBuilder.showFiltersButton &&\n                $(this.formBuilder.showFiltersButton.domElements.main)\n                    .find(\"button\")\n                    .html(this.showButtonText + \" <b>\" + filtersCounterString + \"</b>\");\n        }\n    }\n\n    setEventHandlers(): void {\n        super.setEventHandlers();\n\n        const _this = this;\n\n        $(this.containers.view).on(\"click\", \".mapsvg-btn-show-filters\", function () {\n            _this.events.trigger(\"click.btn.showFilters\");\n        });\n        $(this.containers.view).on(\"click\", \"#mapsvg-search-container button\", function () {\n            _this.events.trigger(\"click.btn.searchButton\");\n        });\n\n        // var filterDatabase = _this.repository;\n\n        // Handle search separately with throttle 400ms\n        // $(this.containers.view).on('paste keyup','input[data-parameter-name=\"search\"]',function(){\n        //     _this.throttle(_this.textSearch, 600, _this, $(this));\n        // });\n\n        // TODO may need the code below\n        /*\n        $(this.containers.view).on('change paste keyup','select,input[type=\"radio\"],input',function(){\n\n            if($(this).data('ignoreSelect2Change')){\n                $(this).data('ignoreSelect2Change', false);\n                return;\n            }\n\n            var filter = {};\n            var field = $(this).data('parameter-name');\n\n            if($(this).attr('data-parameter-name')==\"search\"){\n                return;\n            }\n\n            if($(this).attr('name') === 'distance' || field == \"search\"){\n                return;\n            }\n            if($(this).attr('name') === 'distanceLatLng' || $(this).attr('name') === 'distanceLength'){\n                // var distanceData = {\n                //     units: formBuilder.view.find('[name=\"distanceUnits\"]').val(),\n                //     latlng: formBuilder.view.find('[name=\"distanceLatLng\"]').val(),\n                //     length: formBuilder.view.find('[name=\"distanceLength\"]').val(),\n                //     address: formBuilder.view.find('[name=\"distance\"]').val()\n                // };\n                // var field = formBuilder.mapsvg.filtersSchema.schema.find(function(field){\n                //     return field.type === 'distance';\n                // });\n                // if(field.country){\n                //     distanceData.country = field.country;\n                // }\n                // if(distanceData.units && distanceData.length && distanceData.latlng){\n                //     filter.distance = distanceData;\n                //     var latlng = distanceData.latlng.split(',');\n                //     latlng = {lat: parseFloat(latlng[0]), lng: parseFloat(latlng[1])};\n                //     MapSVG.distanceSearch = {\n                //         latlng: latlng,\n                //         units: field.distanceUnits,\n                //         unitsLabel: field.distanceUnitsLabel\n                //     };\n                // } else {\n                //     filter.distance = null;\n                //     MapSVG.distanceSearch = null;\n                // }\n            } else if ($(this).closest('.mapsvg-checkbox-group').length > 0){\n\n                filter[field] = []\n                $(this).closest('.mapsvg-checkbox-group').find('input[type=\"checkbox\"]:checked').each(function(i,el){\n                    filter[field].push($(el).val());\n                });\n\n\n            } else {\n                filter[field] = $(this).val();\n            }\n\n            filterDatabase.query.setFilters(filter);\n\n            // _this.formBuilder.view.find('select,input[type=\"radio\"]').each(function(index){\n            //     var field = $(this).data('parameter-name');\n            //     var val = $(this).val();\n            //     filters[field] = val;\n            // });\n\n            // var data = {\n            //     filters: filter\n            // };\n            // if(_this.options.menu.searchFallback){\n            //     data.searchFallback = true;\n            // }\n\n            // filterDatabase.getAll(data);\n        });\n        */\n    }\n}\n","import { MapSVG } from \"../Core/globals.js\";\nimport { Controller } from \"../Core/Controller\";\nimport { ScreenPoint, SVGPoint } from \"../Location/Location\";\nimport { Marker } from \"../Marker/Marker\";\nimport { Region } from \"../Region/Region\";\nconst $ = jQuery;\n\n/**\n * Creates a scrollable popover in a map container.\n * @extends Controller\n * @param options\n * @constructor\n */\nexport class PopoverController extends Controller {\n    point: SVGPoint;\n    screenPoint: ScreenPoint;\n    mapObject: Marker | Region;\n    yShift: number;\n    id: string;\n    mobileCloseBtn: HTMLElement;\n\n    constructor(options) {\n        super(options);\n        this.autoresize = true;\n        this.point = options.point;\n        this.yShift = options.yShift;\n        this.mapObject = options.mapObject;\n        this.id = this.mapObject.id + \"_\" + Math.random();\n        $(this.containers.main).data(\"popover-id\", this.id);\n        //this._init();\n    }\n\n    /**\n     * Sets a point where the popover should be shown\n     * @param {ScreenPoint} point - [x,y]\n     */\n    setPoint(point: SVGPoint): void {\n        this.point = point;\n    }\n\n    /**\n     * Returns HTML template for the popover toolbar\n     * @returns {string}\n     */\n    getToolbarTemplate(): string {\n        if (this.withToolbar) return '<div class=\"mapsvg-popover-close\"></div>';\n        else return \"\";\n    }\n\n    /**\n     * Final rendering steps of the popover\n     * @private\n     */\n    viewDidLoad(): void {\n        super.viewDidLoad.call(this);\n        if (\n            MapSVG.isPhone &&\n            this.mapsvg.options.popovers.mobileFullscreen &&\n            !this.mobileCloseBtn\n        ) {\n            this.mobileCloseBtn = $(\n                '<button class=\"mapsvg-mobile-modal-close\">' +\n                    this.mapsvg.getData().options.mobileView.labelClose +\n                    \"</button>\"\n            )[0];\n            $(this.containers.view).append(this.mobileCloseBtn);\n        }\n        this.adjustScreenPosition();\n        $(this.containers.main).toggleClass(\"mapsvg-popover-animate\", true);\n        $(this.containers.main).toggleClass(\"mapsvg-popover-visible\", true);\n        this.adjustHeight();\n        this.updateScroll();\n        this.autoresize && this.resizeSensor.setScroll();\n        this.events.trigger(\"shown\", this, [this]);\n    }\n\n    /**\n     * Adjusts height of the popover\n     */\n    adjustHeight(): void {\n        $(this.containers.main).height(\n            $(this.containers.main).find(\".mapsvg-auto-height\").outerHeight() +\n                (this.containers.toolbar ? $(this.containers.toolbar).outerHeight() : 0)\n        );\n    }\n\n    /**\n     * Adjsuts position of the popver.\n     *\n     */\n    adjustScreenPosition(): void {\n        if (this.point) {\n            const pos = this.mapsvg.converter.convertSVGToPixel(this.point);\n\n            pos.y -= this.yShift;\n            pos.x = Math.round(pos.x);\n            pos.y = Math.round(pos.y);\n\n            this.setScreenPosition(pos.x, pos.y);\n        }\n    }\n\n    /**\n     * Moves popover by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    moveSrceenPositionBy(deltaX: number, deltaY: number): void {\n        const oldPos = this.screenPoint,\n            x = oldPos.x - deltaX,\n            y = oldPos.y - deltaY;\n\n        this.setScreenPosition(x, y);\n    }\n\n    /**\n     * Set popover position by given numbers\n     *\n     * @param {number} x\n     * @param {number} y\n     */\n    setScreenPosition(x: number, y: number): void {\n        this.screenPoint = new ScreenPoint(x, y);\n        $(this.containers.main).css({\n            transform: \"translateX(-50%) translate(\" + x + \"px,\" + y + \"px)\",\n        });\n    }\n\n    /**\n     * Sets event handlers for the popover\n     */\n    setEventHandlers(): void {\n        $(\"body\").off(\".popover.mapsvg\");\n\n        $(this.containers.view).on(\n            \"click touchend\",\n            \".mapsvg-popover-close, .mapsvg-mobile-modal-close\",\n            (e) => {\n                e.stopImmediatePropagation();\n                this.close();\n            }\n        );\n\n        $(\"body\").on(\"mouseup.popover.mapsvg touchend.popover.mapsvg\", (e) => {\n            if (\n                this.mapsvg.isScrolling ||\n                $(e.target).closest(\".mapsvg-directory\").length ||\n                $(e.target).closest(\".mapsvg-popover\").length ||\n                $(e.target).hasClass(\"mapsvg-btn-map\")\n            )\n                return;\n            this.close();\n        });\n    }\n\n    /**\n     * Closes the popover\n     */\n    close(): void {\n        if (\n            $(this.containers.main).data(\"popover-id\") != this.id ||\n            !$(this.containers.main).is(\":visible\")\n        )\n            return;\n        this.destroy();\n        if (this.mapObject instanceof Region) {\n            this.mapsvg.deselectRegion(this.mapObject);\n        }\n        if (this.mapObject instanceof Marker) {\n            this.mapsvg.deselectAllMarkers();\n        }\n\n        this.events.trigger(\"closed\", this, [this]);\n    }\n\n    /**\n     * Destroys the popover\n     */\n    destroy(): void {\n        $(this.containers.main).toggleClass(\"mapsvg-popover-animate\", false);\n        $(this.containers.main).toggleClass(\"mapsvg-popover-visible\", false);\n        super.destroy.call(this);\n    }\n\n    /**\n     * Shows the popover\n     */\n    show(): void {\n        $(this.containers.main).toggleClass(\"mapsvg-popover-animate\", true);\n        $(this.containers.main).toggleClass(\"mapsvg-popover-visible\", true);\n    }\n}\n","import { MapSVG } from \"../Core/globals.js\";\nimport { Controller } from \"../Core/Controller\";\nimport { ScreenPoint, SVGPoint } from \"../Location/Location\";\nconst $ = jQuery;\n\n/**\n * Creates a scrollable popover in a map container.\n * @extends Controller\n * @param options\n * @constructor\n */\nexport class Tooltip extends Controller {\n    screenPoint: ScreenPoint;\n\n    minWidth: number;\n    maxWidth: number;\n\n    posOriginal: { [key: string]: string };\n    posShifted: { [key: string]: string };\n    posShiftedPrev: { [key: string]: string };\n    mirror: { [key: string]: number };\n\n    constructor(options) {\n        super(options);\n\n        this.scrollable = false;\n        this.withToolbar = false;\n        this.autoresize = false;\n        this.screenPoint = new ScreenPoint(0, 0);\n\n        this.posOriginal = {};\n        this.posShifted = {};\n        this.posShiftedPrev = {};\n        this.mirror = {};\n        this.noPadding = true;\n\n        this.setPosition(options.position);\n        this.setSize(options.minWidth, options.maxWidth);\n    }\n\n    setSize(minWidth: number, maxWidth: number): void {\n        this.minWidth = minWidth;\n        this.maxWidth = maxWidth;\n        this.containers.main.style[\"min-width\"] = this.minWidth + \"px\";\n        this.containers.main.style[\"max-width\"] = this.maxWidth + \"px\";\n    }\n\n    setPosition(position: string): void {\n        const ex = position.split(\"-\");\n        if (ex[0].indexOf(\"top\") != -1 || ex[0].indexOf(\"bottom\") != -1) {\n            this.posOriginal.topbottom = ex[0];\n        }\n        if (ex[0].indexOf(\"left\") != -1 || ex[0].indexOf(\"right\") != -1) {\n            this.posOriginal.leftright = ex[0];\n        }\n        if (ex[1]) {\n            this.posOriginal.leftright = ex[1];\n        }\n\n        this.containers.main.className = this.containers.main.className.replace(\n            /(^|\\s)mapsvg-tt-\\S+/g,\n            \"\"\n        );\n\n        this.containers.main.classList.add(\"mapsvg-tt-\" + position);\n    }\n\n    /**\n     * Sets a point where the popover should be shown\n     */\n    setScreenPoint(x: number, y: number): void {\n        this.screenPoint.x = x;\n        this.screenPoint.y = y;\n    }\n\n    /**\n     * Final rendering steps of the popover\n     * @private\n     */\n    viewDidLoad(): void {\n        super.viewDidLoad.call(this);\n    }\n\n    /**\n     * Called when tooltip is shown\n     * @private\n     */\n    viewDidAppear(): void {\n        super.viewDidAppear();\n        this.events.trigger(\"shown\", this, [this]);\n    }\n\n    /**\n     * Set tooltip position by given coordinates\n     */\n    setScreenPosition(x: number, y: number): void {\n        this.setScreenPoint(x, y);\n        this.containers.main.style.transform =\n            \"translateX(-50%) translate(\" + x + \"px,\" + y + \"px)\";\n    }\n\n    /**\n     * Sets event handlers for the popover\n     */\n    setEventHandlers(): void {\n        const event = \"mousemove.tooltip.mapsvg-\" + this.mapsvg.id;\n\n        $(\"body\")\n            .off(event)\n            .on(event, (e) => {\n                MapSVG.mouse = MapSVG.mouseCoords(e);\n\n                this.containers.main.style.left =\n                    e.clientX +\n                    $(window).scrollLeft() -\n                    $(this.mapsvg.containers.map).offset().left +\n                    \"px\";\n                this.containers.main.style.top =\n                    e.clientY +\n                    $(window).scrollTop() -\n                    $(this.mapsvg.containers.map).offset().top +\n                    \"px\";\n\n                const m = new ScreenPoint(\n                    e.clientX + $(window).scrollLeft(),\n                    e.clientY + $(window).scrollTop()\n                );\n                const _tbbox = this.containers.main.getBoundingClientRect();\n                const _mbbox = this.mapsvg.containers.map.getBoundingClientRect();\n                const tbbox = {\n                    top: _tbbox.top + $(window).scrollTop(),\n                    bottom: _tbbox.bottom + $(window).scrollTop(),\n                    left: _tbbox.left + $(window).scrollLeft(),\n                    right: _tbbox.right + $(window).scrollLeft(),\n                    width: _tbbox.width,\n                    height: _tbbox.height,\n                };\n                const mbbox = {\n                    top: _mbbox.top + $(window).scrollTop(),\n                    bottom: _mbbox.bottom + $(window).scrollTop(),\n                    left: _mbbox.left + $(window).scrollLeft(),\n                    right: _mbbox.right + $(window).scrollLeft(),\n                    width: _mbbox.width,\n                    height: _mbbox.height,\n                };\n\n                if (\n                    m.x > mbbox.right ||\n                    m.y > mbbox.bottom ||\n                    m.x < mbbox.left ||\n                    m.y < mbbox.top\n                ) {\n                    return;\n                }\n\n                if (this.mirror.top || this.mirror.bottom) {\n                    // may be cancel mirroring\n                    if (this.mirror.top && m.y > this.mirror.top) {\n                        this.mirror.top = 0;\n                        delete this.posShifted.topbottom;\n                    } else if (this.mirror.bottom && m.y < this.mirror.bottom) {\n                        this.mirror.bottom = 0;\n                        delete this.posShifted.topbottom;\n                    }\n                } else {\n                    // may be need mirroring\n\n                    if (tbbox.bottom < mbbox.top + tbbox.height) {\n                        this.posShifted.topbottom = \"bottom\";\n                        this.mirror.top = m.y;\n                    } else if (tbbox.top > mbbox.bottom - tbbox.height) {\n                        this.posShifted.topbottom = \"top\";\n                        this.mirror.bottom = m.y;\n                    }\n                }\n\n                if (this.mirror.right || this.mirror.left) {\n                    // may be cancel mirroring\n\n                    if (this.mirror.left && m.x > this.mirror.left) {\n                        this.mirror.left = 0;\n                        delete this.posShifted.leftright;\n                    } else if (this.mirror.right && m.x < this.mirror.right) {\n                        this.mirror.right = 0;\n                        delete this.posShifted.leftright;\n                    }\n                } else {\n                    // may be need mirroring\n                    if (tbbox.right < mbbox.left + tbbox.width) {\n                        this.posShifted.leftright = \"right\";\n                        this.mirror.left = m.x;\n                    } else if (tbbox.left > mbbox.right - tbbox.width) {\n                        this.posShifted.leftright = \"left\";\n                        this.mirror.right = m.x;\n                    }\n                }\n\n                let pos = $.extend({}, this.posOriginal, this.posShifted);\n                const _pos = [];\n                pos.topbottom && _pos.push(pos.topbottom);\n                pos.leftright && _pos.push(pos.leftright);\n                // @ts-ignore\n                pos = _pos.join(\"-\");\n\n                if (\n                    this.posShifted.topbottom != this.posOriginal.topbottom ||\n                    this.posShifted.leftright != this.posOriginal.leftright\n                ) {\n                    this.containers.main.className = this.containers.main.className.replace(\n                        /(^|\\s)mapsvg-tt-\\S+/g,\n                        \"\"\n                    );\n                    this.containers.main.classList.add(\"mapsvg-tt-\" + pos);\n                    this.posShiftedPrev = pos;\n                }\n            });\n    }\n\n    /**\n     *\n     * @param content\n     */\n    setContent(template: any, data: any): Tooltip {\n        this.containers.main.innerHTML = template(data);\n        return this;\n    }\n\n    /**\n     * Shows the tooltip\n     */\n    show(): Tooltip {\n        this.containers.main.classList.add(\"mapsvg-tooltip-visible\");\n        return this;\n    }\n    /**\n     * Hides the tooltip\n     */\n    hide(): Tooltip {\n        this.containers.main.classList.remove(\"mapsvg-tooltip-visible\");\n        return this;\n    }\n}\n","/// <reference types=\"@types/googlemaps\" />\nimport { MapSVG } from \"../Core/globals.js\";\nimport { DefaultOptions } from \"./default-options.js\";\nimport { tinycolor } from \"../Vendor/tinycolor.js\";\nimport { MapsRepository } from \"./MapsRepository\";\nimport { MapsV2Repository } from \"./MapsV2Repository\";\nimport { Converter } from \"./Converter\";\n\n// import {Handlebars} from \"../../handlebars.js\"\n// @ts-ignore\nimport Handlebars from \"Handlebars\";\nimport {} from \"googlemaps\";\nimport { ResizeSensor } from \"../Core/ResizeSensor\";\nimport {\n    GroupOptionsInterface,\n    GalleryOptionsInterface,\n    LayersControlOptionsInterface,\n    MapOptionsInterface,\n    ViewBox,\n    GeoViewBox,\n} from \"./MapOptionsInterface\";\n\nimport {\n    Location,\n    GeoPoint,\n    ScreenPoint,\n    LocationOptionsInterface,\n    SVGPoint,\n} from \"../Location/Location\";\nimport { Marker } from \"../Marker/Marker\";\nimport { MarkerCluster } from \"../MarkerCluster/MarkerCluster\";\nimport { Region } from \"../Region/Region\";\nimport { Query } from \"../Infrastructure/Server/Query\";\nimport { CustomObject } from \"../Object/CustomObject\";\nimport { Schema } from \"../Infrastructure/Server/Schema\";\nimport { SchemaField } from \"../Infrastructure/Server/SchemaField\";\nimport { SchemaRepository } from \"../Infrastructure/Server/SchemaRepository\";\nimport { DirectoryController } from \"../Directory/Directory\";\nimport { Events } from \"../Core/Events\";\nimport { Repository } from \"../Core/Repository\";\nimport { CustomObjectsRepository } from \"../Object/CustomObjectsRepository\";\nimport { FiltersController } from \"../Filters/Filters\";\nimport { MapObject } from \"../MapObject/MapObject\";\nimport { DetailsController } from \"../Details/Details\";\nimport { PopoverController } from \"../Popover/Popover\";\nimport { FormBuilder } from \"../FormBuilder/FormBuilder\";\nimport { ArrayIndexed } from \"../Core/ArrayIndexed\";\nimport { Server } from \"../Infrastructure/Server/Server\";\nimport htmlString = JQuery.htmlString;\nimport { RegionsRepository } from \"../Region/RegionsRepository\";\nimport { Tooltip } from \"../Tooltips/Tooltip\";\n\nconst $ = jQuery;\n\n/**\n * MapSVG.Map class. Creates a new map inside of the given HTML container, which is typically a DIV element.\n * @constructor\n *\n * @param {string} id - ID of the map container\n * @param {MapOptionsInterface} options - map settings\n *\n * @example\n * // Create the map in <div id=\"my-container-id\"></div>:\n * var mapsvg = new MapSVGMap(\"my-container-id\", {\n *   source: \"/path/to/map.svg\",\n *   zoom: {on: true},\n *   scroll: {on: true}\n * });\n *\n * // Get map instance by container ID\n * var mapsvg = MapSVG.getById(\"my-container-id\");\n *\n * // Get map instance by index number\n * var mapsvg_1 = MapSVG.get(0); // first map on the page\n * var mapsvg_2 = MapSVG.get(1); // second map.\n *\n */\nclass MapSVGMap {\n    //static MapSVG = MapSVG;\n\n    id: number;\n    containerId: string;\n    markerOptions: Record<string, unknown> = { src: MapSVG.urls.root + \"markers/pin1_red.png\" };\n\n    converter: Converter;\n\n    dirtyFields: string[];\n\n    regions: ArrayIndexed<Region>;\n    objects: ArrayIndexed<CustomObject>;\n\n    regionsRepository: Repository;\n    objectsRepository: Repository;\n    filtersRepository: Repository;\n    schemaRepository: SchemaRepository;\n\n    events: Events;\n\n    resizeSensor: ResizeSensor;\n\n    liveCss: HTMLStyleElement;\n\n    defaults: MapOptionsInterface;\n    options: MapOptionsInterface;\n    optionsDelta: { [key: string]: any };\n\n    mapIsGeo: boolean;\n    geoCoordinates: boolean;\n    editMode: boolean;\n    highlightedRegions: Array<Region>;\n    editRegions: { on: boolean };\n    editMarkers: { on: boolean };\n    clickAddsMarker: boolean;\n    editData: { on: boolean };\n    disableLinks: boolean;\n    markerEditHandler: (location: Location) => void;\n    regionEditHandler: () => void;\n    objectClickedBeforeScroll: Region | Marker | MarkerCluster;\n    highlighted_marker: Marker;\n\n    googleMaps?: {\n        loaded: boolean;\n        map: google.maps.Map;\n        zoomLimit?: boolean;\n        overlay?: any;\n        initialized: boolean;\n        maxZoomService?: google.maps.MaxZoomService;\n        currentMaxZoom?: number;\n    };\n\n    groups: ArrayIndexed<GroupOptionsInterface>;\n    galleries: ArrayIndexed<GalleryOptionsInterface>;\n\n    svgDefault: {\n        viewBox?: ViewBox;\n        geoViewBox?: GeoViewBox;\n        width?: number;\n        height?: number;\n    };\n\n    viewBox: ViewBox;\n    _viewBox: ViewBox;\n    viewBoxFull: ViewBox;\n    viewBoxFake: ViewBox;\n    whRatioFull: number;\n    geoViewBox?: GeoViewBox;\n\n    mapLonDelta: number;\n    mapLatBottomDegree: number;\n\n    zoomLevel: number;\n    zoomLevels: ArrayIndexed<{\n        zoomLevel: number;\n        viewBox: ViewBox;\n        _scale: number;\n    }>;\n    isZooming: boolean;\n    touchZoomStart: boolean;\n    scaleDistStart: number;\n    scrollStarted: boolean;\n\n    isScrolling: boolean;\n    zoomDelta: number;\n    whRatio: number;\n    vbStart: boolean;\n\n    scale: number;\n    _scale: number;\n    superScale: number;\n    scroll: {\n        tx?: number;\n        ty?: number;\n        vxi?: number;\n        vyi?: number; // initial viewbox when scrollning started\n        x?: number;\n        y?: number; // mouse coordinates when scrolling started\n        dx?: number;\n        dy?: number; // mouse delta\n        vx?: number;\n        vy?: number; // new viewbox x/y\n        gx?: number;\n        gy?: number; // for google maps scroll\n        touchScrollStart: number;\n    };\n\n    iosDownscaleFactor: number;\n\n    containers: {\n        svg?: SVGSVGElement;\n        map?: HTMLElement;\n        googleMaps?: HTMLElement;\n        mapContainer?: HTMLElement;\n        scrollpane?: HTMLElement;\n        scrollpaneWrap?: HTMLElement;\n        wrap?: HTMLElement;\n        wrapAll?: HTMLElement;\n        loading?: HTMLElement;\n        directory?: HTMLElement;\n        filters?: HTMLElement;\n        detailsView?: HTMLElement;\n        popover?: HTMLElement;\n        tooltip?: HTMLElement;\n        layers?: HTMLElement;\n        layersControl?: HTMLElement;\n        layersControlLabel?: HTMLElement;\n        layersControlList?: HTMLElement;\n        layersControlListNano?: HTMLElement;\n        pagerMap?: HTMLElement;\n        pagerDir?: HTMLElement;\n        leftSidebar?: HTMLElement;\n        rightSidebar?: HTMLElement;\n        header?: HTMLElement;\n        footer?: HTMLElement;\n        filterTags?: HTMLElement;\n        filtersModal?: HTMLElement;\n        clustersCss?: HTMLStyleElement;\n        clustersHoverCss?: HTMLStyleElement;\n        markersCss?: HTMLStyleElement;\n        controls?: HTMLElement;\n        zoomButtons?: HTMLElement;\n        legend?: {\n            title: HTMLElement;\n            text: HTMLElement;\n            coloring: HTMLElement;\n            description: HTMLElement;\n            container: HTMLElement;\n        };\n        choroplethSourceSelect?: {\n            container: HTMLElement;\n            //label: HTMLElement,\n            select: HTMLElement;\n            options: Array<HTMLElement>;\n        };\n    };\n    containersCreated: boolean;\n\n    controllers: {\n        detailsView?: DetailsController;\n        popover?: PopoverController;\n        directory?: DirectoryController;\n        // TODO add tooltip controller\n        tooltip?: Tooltip;\n        filters?: FiltersController;\n    };\n\n    templates: {\n        [key: string]: any; // returned by Handlebars.compile()\n    };\n\n    markers: ArrayIndexed<Marker>;\n    clusters: Record<string, unknown>;\n    markersClusters: ArrayIndexed<MarkerCluster>;\n    firstDataLoad: boolean;\n    clustersByZoom: Array<any>;\n    selected_id: Array<string>;\n    selected_marker: Marker;\n    clusterizerWorker: Worker;\n    editingMarker: Marker;\n\n    filtersSchema: Schema;\n\n    layers: {\n        [key: string]: HTMLElement;\n    };\n    controls: {\n        zoom: HTMLElement;\n        userLocation: HTMLElement;\n        zoomReset: HTMLElement;\n        previousMap: HTMLElement;\n    };\n    formBuilder: any;\n    tooltip: {\n        posOriginal: { [key: string]: string };\n        posShifted: { [key: string]: string };\n        posShiftedPrev: { [key: string]: string };\n        mirror: { [key: string]: number };\n    };\n    firefoxScroll: {\n        insideIframe: boolean;\n        scrollX: number;\n        scrollY: number;\n    };\n    canZoom: boolean;\n    eventsPreventList: { [key: string]: boolean };\n    googleMapsScript: HTMLScriptElement;\n\n    fitOnDataLoadDone: boolean;\n    fitDelta: number;\n    lastTimeFitWas: number;\n    userLocation: Location;\n    userLocationMarker: Marker;\n    setMarkersByField: boolean;\n    locationField: SchemaField;\n    popoverShowingFor: MapObject;\n\n    svgFileLastChanged: number;\n\n    changedFields: any;\n    changedSearch: any;\n\n    /* This property comes from v5 without any changes */\n    $gauge: any;\n\n    /**\n     * AfterLoad event can be blocked by:\n     * 1. Loading Google API JS files\n     * 2. Loading filters controller\n     * When a blocker is introduced, it increases the number of afterLoadBlockers\n     * when mapsvg.finalizeMapLoading is called, it checks if afterLoadBlockers = 0\n     */\n    afterLoadBlockers: number;\n    loaded: boolean;\n\n    /**\n     *\n     * @param containerId\n     * @param mapParams\n     * @param externalParams\n     */\n\n    constructor(\n        containerId: string,\n        mapParams: {\n            id: number;\n            options: MapOptionsInterface;\n            svgFileLastChanged: number;\n            version: string;\n        },\n        externalParams?: { [key: string]: any }\n    ) {\n        const options = mapParams.options;\n\n        this.updateOutdatedOptions(options);\n\n        this.dirtyFields = [];\n\n        this.containerId = containerId;\n        this.options = <MapOptionsInterface>$.extend(true, {}, DefaultOptions, options);\n\n        this.options.source = this.urlToRelativePath(this.options.source);\n\n        this.editMode = this.options.editMode;\n        delete this.options.editMode;\n\n        this.id = mapParams.id;\n        this.svgFileLastChanged = mapParams.svgFileLastChanged;\n\n        this.regions = new ArrayIndexed(\"id\");\n        this.objects = new ArrayIndexed(\"id\");\n\n        this.events = new Events(this);\n\n        this.highlightedRegions = [];\n        this.editRegions = { on: false };\n        this.editMarkers = { on: false };\n        this.editData = { on: false };\n\n        this.controllers = {};\n\n        // Set containers\n        this.containers = {\n            map: document.getElementById(this.containerId),\n            scrollpane: $('<div class=\"mapsvg-scrollpane\"></div>')[0],\n            scrollpaneWrap: $('<div class=\"mapsvg-scrollpane-wrap\"></div>')[0],\n            layers: $('<div class=\"mapsvg-layers-wrap\"></div>')[0],\n        };\n\n        this.containers.map.appendChild(this.containers.layers);\n        this.containers.map.appendChild(this.containers.scrollpaneWrap);\n        this.containers.scrollpaneWrap.appendChild(this.containers.scrollpane);\n\n        this.whRatio = 0;\n        this.isScrolling = false;\n        this.markerOptions = {};\n        this.svgDefault = {};\n        this.scale = 1; // absolute scale\n        this._scale = 1; // relative scale starting from current zoom level\n        this.selected_id = [];\n\n        this.regions = new ArrayIndexed(\"id\");\n\n        if (!this.options.database.regionsTableName) {\n            this.options.database.regionsTableName = \"regions_\" + this.id;\n        }\n        if (!this.options.database.objectsTableName) {\n            this.options.database.objectsTableName = \"objects_\" + this.id;\n        }\n\n        this.regionsRepository = new Repository(\n            \"region\",\n            \"regions/\" + this.options.database.regionsTableName\n        );\n        // Turn off pagination for Regions:\n        this.regionsRepository.query.update({ perpage: 0 });\n\n        this.objectsRepository = new Repository(\n            \"object\",\n            \"objects/\" + this.options.database.objectsTableName\n        );\n        if (this.options.database.noFiltersNoLoad) {\n            this.objectsRepository.setNoFiltersNoLoad(true);\n        }\n\n        this.objectsRepository.query.update({\n            perpage: this.options.database.pagination.on\n                ? this.options.database.pagination.perpage\n                : 0,\n        });\n\n        this.schemaRepository = new SchemaRepository();\n\n        this.markers = new ArrayIndexed(\"id\");\n        this.markersClusters = new ArrayIndexed(\"id\");\n        this._viewBox = new ViewBox(0, 0, 0, 0); // initial viewBox\n        this.viewBox = new ViewBox(0, 0, 0, 0); // current viewBox\n        this.zoomLevel = 0;\n        this.scroll = {\n            tx: 0,\n            ty: 0,\n            vxi: 0,\n            vyi: 0, // initial viewbox when scrollning started\n            x: 0,\n            y: 0, // mouse coordinates when scrolling started\n            dx: 0,\n            dy: 0, // mouse delta\n            vx: 0,\n            vy: 0, // new viewbox x/y\n            gx: 0,\n            gy: 0, // for google maps scroll\n            touchScrollStart: 0,\n        };\n        this.layers = {};\n        this.geoCoordinates = false;\n        this.geoViewBox = new GeoViewBox(new GeoPoint(0, 0), new GeoPoint(0, 0));\n        this.eventsPreventList = {};\n        this.googleMaps = {\n            loaded: false,\n            initialized: false,\n            map: null,\n            zoomLimit: true,\n            maxZoomService: null,\n        };\n\n        // Set 3 blockers initially:\n        // 1. The map loading process itself\n        this.afterLoadBlockers = 1;\n        this.loaded = false;\n\n        // 2. Regions loading\n        // 3. Objects loading\n        if (this.id) {\n            this.afterLoadBlockers += 2;\n        }\n\n        // 4. Google maps API blocker?\n        if (this.options.googleMaps.on) {\n            this.afterLoadBlockers++;\n        }\n        // 5. Filters may block too because the load remote HTML filters which is async process\n        if (this.filtersShouldBeShown()) {\n            this.afterLoadBlockers++;\n        }\n\n        // if (MapSVG && externalParams) {\n        //     for (const i in externalParams) {\n        //         MapSVG[i] = externalParams[i];\n        //         window.MapSVG[i] = externalParams[i];\n        //     }\n        // }\n\n        this.init();\n    }\n\n    /**\n     * Return relative path part of the URL\n     * @param {string} url\n     * @returns string\n     * @private\n     */\n    urlToRelativePath(url: string): string {\n        if (url.indexOf(\"//\") === 0) url = url.replace(/^\\/\\/[^/]+/, \"\").replace(\"//\", \"/\");\n        else url = url.replace(/^.*:\\/\\/[^/]+/, \"\").replace(\"//\", \"/\");\n        return url;\n    }\n\n    /**\n     * Sets visiblity switches for groups of SVG objects\n     * @private\n     */\n    setGroups(groups?: GroupOptionsInterface[]): void {\n        const _this = this;\n\n        if (!this.groups) {\n            _this.groups = new ArrayIndexed(\"id\", _this.options.groups, {\n                autoId: true,\n                unique: true,\n            });\n        } else {\n            this.options.groups = this.groups;\n        }\n\n        _this.groups.forEach(function (g: GroupOptionsInterface) {\n            g.objects &&\n                g.objects.length &&\n                g.objects.forEach(function (obj) {\n                    _this.containers.svg\n                        .querySelector(\"#\" + obj.value)\n                        .classList.toggle(\"mapsvg-hidden\", !g.visible);\n                });\n        });\n    }\n\n    /**\n     * Returns the list of options for visibility settings in admin.js\n     */\n    getGroupSelectOptions(): any[] {\n        const _this = this;\n        let id;\n        const optionGroups = [];\n        const options = [];\n        const options2 = [];\n\n        $(_this.containers.svg)\n            .find(\"g\")\n            .each(function (index) {\n                const id = $(this)[0].getAttribute(\"id\");\n                if (id) {\n                    const title = $(this)[0].getAttribute(\"title\");\n                    options.push({ label: title || id, value: id });\n                }\n            });\n        optionGroups.push({ title: \"SVG Layers / Groups\", options: options });\n\n        $(_this.containers.svg)\n            .find(\"path,ellipse,circle,polyline,polygon,rectangle,img,text\")\n            .each(function (index) {\n                const id = $(this)[0].getAttribute(\"id\");\n                if (id) {\n                    const title = $(this)[0].getAttribute(\"title\");\n                    options2.push({ label: title || id, value: id });\n                }\n            });\n        optionGroups.push({ title: \"Other SVG objects\", options: options2 });\n\n        return optionGroups;\n    }\n\n    /**\n     * Sets visibility switches\n     * @param {object} options - Options\n     * @private\n     */\n    setLayersControl(options?: LayersControlOptionsInterface): void {\n        const _this = this;\n\n        if (options) $.extend(true, this.options.layersControl, options);\n\n        if (this.options.layersControl.on) {\n            if (!this.containers.layersControl) {\n                this.containers.layersControl = document.createElement(\"div\");\n                this.containers.layersControl.classList.add(\"mapsvg-layers-control\");\n\n                this.containers.layersControlLabel = document.createElement(\"div\");\n                this.containers.layersControlLabel.classList.add(\"mapsvg-layers-label\");\n                this.containers.layersControl.appendChild(this.containers.layersControlLabel);\n\n                const layersControlWrap = document.createElement(\"div\");\n                layersControlWrap.classList.add(\"mapsvg-layers-list-wrap\");\n                this.containers.layersControl.appendChild(layersControlWrap);\n\n                this.containers.layersControlListNano = document.createElement(\"div\");\n                this.containers.layersControlListNano.classList.add(\"nano\");\n                layersControlWrap.appendChild(this.containers.layersControlListNano);\n\n                this.containers.layersControlList = document.createElement(\"div\");\n                this.containers.layersControlList.classList.add(\"mapsvg-layers-list\");\n                this.containers.layersControlList.classList.add(\"nano-content\");\n                this.containers.layersControlListNano.appendChild(\n                    this.containers.layersControlList\n                );\n\n                this.containers.mapContainer.appendChild(this.containers.layersControl);\n            }\n            this.containers.layersControl.style.display = \"block\";\n            this.containers.layersControlLabel.innerHTML = this.options.layersControl.label;\n\n            this.containers.layersControlLabel.style.display = \"block\";\n            this.containers.layersControlList.innerHTML = \"\";\n            while (this.containers.layersControlList.firstChild) {\n                this.containers.layersControlList.removeChild(\n                    this.containers.layersControlList.firstChild\n                );\n            }\n            this.containers.layersControl.classList.remove(\n                \"mapsvg-top-left\",\n                \"mapsvg-top-right\",\n                \"mapsvg-bottom-left\",\n                \"mapsvg-bottom-right\"\n            );\n            this.containers.layersControl.classList.add(\n                \"mapsvg-\" + this.options.layersControl.position\n            );\n            if (\n                this.options.menu.on &&\n                !this.options.menu.customContainer &&\n                this.options.layersControl.position.indexOf(\"left\") !== -1\n            ) {\n                this.containers.layersControl.style.left = this.options.menu.width;\n            }\n\n            this.containers.layersControl.style.maxHeight = this.options.layersControl.maxHeight;\n\n            this.options.groups.forEach((g) => {\n                const item = document.createElement(\"div\");\n                item.classList.add(\"mapsvg-layers-item\");\n                item.setAttribute(\"data-group-id\", g.id);\n                item.innerHTML =\n                    '<input type=\"checkbox\" class=\"ios8-switch ios8-switch-sm\" ' +\n                    (g.visible ? \"checked\" : \"\") +\n                    \" /><label>\" +\n                    g.title +\n                    \"</label>\";\n                this.containers.layersControlList.appendChild(item);\n            });\n\n            // @ts-ignore\n            $(this.containers.layersControlListNano).nanoScroller({\n                preventPageScrolling: true,\n                iOSNativeScrolling: true,\n            });\n\n            $(this.containers.layersControl).off();\n            $(this.containers.layersControl).on(\"click\", \".mapsvg-layers-item\", function () {\n                const id = $(this).data(\"group-id\");\n                const input = $(this).find(\"input\");\n                input.prop(\"checked\", !input.prop(\"checked\"));\n                _this.groups.forEach(function (g) {\n                    if (g.id === id) g.visible = !g.visible;\n                });\n                _this.setGroups();\n            });\n            $(this.containers.layersControlLabel).off();\n            $(this.containers.layersControlLabel).on(\"click\", () => {\n                $(_this.containers.layersControl).toggleClass(\"closed\");\n            });\n\n            $(this.containers.layersControl).toggleClass(\n                \"closed\",\n                !this.options.layersControl.expanded\n            );\n        } else {\n            if (this.containers.layersControl) {\n                this.containers.layersControl.style.display = \"none\";\n            }\n        }\n    }\n\n    loadDataObjects(params?: any): JQueryDeferred<any> {\n        return this.objectsRepository.find(params);\n    }\n\n    loadDirectory(): void {\n        // If \"Load DB on start\" is off then\n        // don't load directory to prevent 'no records found' message from appearing\n        if (\n            !this.editMode &&\n            this.options.menu.source === \"database\" &&\n            !this.objectsRepository.loaded\n        ) {\n            return;\n        }\n        if (this.options.menu.on) {\n            this.controllers.directory.loadItemsToDirectory();\n        }\n        this.setPagination();\n    }\n\n    /**\n     * Adds pagination controls to the map and/or directory\n     */\n    setPagination() {\n        const _this = this;\n\n        this.containers.pagerMap && $(this.containers.pagerMap).empty().remove();\n        this.containers.pagerDir && $(this.containers.pagerDir).empty().remove();\n\n        if (\n            _this.options.database.pagination.on &&\n            _this.options.database.pagination.perpage !== 0\n        ) {\n            this.containers.directory.classList.toggle(\n                \"mapsvg-with-pagination\",\n                [\"directory\", \"both\"].indexOf(_this.options.database.pagination.showIn) !== -1\n            );\n            this.containers.map.classList.toggle(\n                \"mapsvg-with-pagination\",\n                [\"map\", \"both\"].indexOf(_this.options.database.pagination.showIn) !== -1\n            );\n\n            if (_this.options.menu.on) {\n                this.containers.pagerDir = _this.getPagination();\n                _this.controllers.directory.addPagination(this.containers.pagerDir);\n            }\n            this.containers.pagerMap = _this.getPagination();\n            this.containers.map.appendChild(this.containers.pagerMap);\n        }\n    }\n    /**\n     * Generates HTML with pagination buttons and attaches callback event on button click\n     * @param {function} callback - Callback function that should be called on click on a next/prev page button\n     */\n    getPagination(callback?: () => void): HTMLElement {\n        const _this = this;\n\n        // pager && (pager.empty().remove());\n        const pager = $(\n            '<nav class=\"mapsvg-pagination\"><ul class=\"pager\"><!--<li class=\"mapsvg-first\"><a href=\"#\">First</a></li>--><li class=\"mapsvg-prev\"><a href=\"#\">&larr; ' +\n                _this.options.database.pagination.prev +\n                \" \" +\n                _this.options.database.pagination.perpage +\n                '</a></li><li class=\"mapsvg-next\"><a href=\"#\">' +\n                _this.options.database.pagination.next +\n                \" \" +\n                _this.options.database.pagination.perpage +\n                ' &rarr;</a></li><!--<li class=\"mapsvg-last\"><a href=\"#\">Last</a></li>--></ul></nav>'\n        );\n\n        if (this.objectsRepository.onFirstPage() && this.objectsRepository.onLastPage()) {\n            pager.hide();\n        } else {\n            pager.find(\".mapsvg-prev\").removeClass(\"disabled\");\n            pager.find(\".mapsvg-first\").removeClass(\"disabled\");\n            pager.find(\".mapsvg-last\").removeClass(\"disabled\");\n            pager.find(\".mapsvg-next\").removeClass(\"disabled\");\n\n            this.objectsRepository.onLastPage() &&\n                pager.find(\".mapsvg-next\").addClass(\"disabled\") &&\n                pager.find(\".mapsvg-last\").addClass(\"disabled\");\n\n            this.objectsRepository.onFirstPage() &&\n                pager.find(\".mapsvg-prev\").addClass(\"disabled\") &&\n                pager.find(\".mapsvg-first\").addClass(\"disabled\");\n        }\n\n        pager\n            .on(\"click\", \".mapsvg-next:not(.disabled)\", (e) => {\n                e.preventDefault();\n                if (this.objectsRepository.onLastPage()) return;\n                const query = new Query({ page: this.objectsRepository.query.page + 1 });\n                this.objectsRepository.find(query).done(function () {\n                    callback && callback();\n                });\n            })\n            .on(\"click\", \".mapsvg-prev:not(.disabled)\", function (e) {\n                e.preventDefault();\n                if (_this.objectsRepository.onFirstPage()) return;\n                const query = new Query({ page: _this.objectsRepository.query.page - 1 });\n                _this.objectsRepository.find(query).done(function () {\n                    callback && callback();\n                });\n            })\n            .on(\"click\", \".mapsvg-first:not(.disabled)\", function (e) {\n                e.preventDefault();\n                if (_this.objectsRepository.onFirstPage()) return;\n                const query = new Query({ page: 1 });\n                _this.objectsRepository.find(query).done(function () {\n                    callback && callback();\n                });\n            })\n            .on(\"click\", \".mapsvg-last:not(.disabled)\", function (e) {\n                e.preventDefault();\n                if (_this.objectsRepository.onLastPage()) return;\n                const query = new Query({ lastpage: true });\n                _this.objectsRepository.find(query).done(function () {\n                    callback && callback();\n                });\n            });\n\n        return pager[0];\n    }\n\n    /**\n     * Deletes all markers from the map\n     */\n    deleteMarkers() {\n        while (this.markers.length) {\n            this.markerDelete(this.markers[0]);\n        }\n    }\n\n    /**\n     * Deletes all markers from the map\n     */\n    deleteClusters(): void {\n        if (this.markersClusters) {\n            this.markersClusters.forEach(function (markerCluster) {\n                markerCluster.destroy();\n            });\n            this.markersClusters.clear();\n        }\n    }\n\n    /**\n     * Adds locations from the database to the map - as markers or as clusters if clustering is enabled.\n     * @private\n     */\n    addLocations(): void {\n        const _this = this;\n        this.firstDataLoad = this.firstDataLoad === undefined;\n\n        let locationField = this.objectsRepository.getSchema().getFieldByType(\"location\");\n        if (!locationField) {\n            return;\n        }\n        locationField = locationField.name;\n\n        if (locationField) {\n            if (this.firstDataLoad) {\n                this.setMarkerImagesDependency();\n            }\n\n            _this.deleteMarkers();\n            _this.deleteClusters();\n\n            _this.clusters = {};\n            _this.clustersByZoom = [];\n\n            if (this.objectsRepository.getLoaded().length > 0) {\n                this.objectsRepository.getLoaded().forEach(function (object) {\n                    if (object[locationField]) {\n                        if (\n                            object[locationField].img &&\n                            (object[locationField].geoPoint || object[locationField].svgPoint)\n                        ) {\n                            new Marker({\n                                location: object[locationField],\n                                object: object,\n                                mapsvg: _this,\n                            });\n                        }\n                    }\n                });\n                if (_this.options.clustering.on) {\n                    _this.startClusterizer();\n                } else {\n                    this.objectsRepository.getLoaded().forEach(function (object) {\n                        if (object.location && object.location.marker) {\n                            _this.markerAdd(object.location.marker);\n                        }\n                    });\n                    _this.mayBeFitMarkers();\n                }\n            }\n        }\n    }\n    /**\n     * Stores a set of markers/clusters for a certain zoom level for later use.\n     * This method gets called by a worker thread that calculates markers/clusters for all zoom levels.\n     * @param zoomLevel\n     * @param clusters\n     * @private\n     */\n    addClustersFromWorker(zoomLevel: number, clusters): void {\n        const _this = this;\n\n        _this.clustersByZoom[zoomLevel] = [];\n        for (const cell in clusters) {\n            const markers = clusters[cell].markers.map(function (marker) {\n                return _this.objectsRepository.objects.findById(marker.id).location.marker;\n            });\n            _this.clustersByZoom[zoomLevel].push(\n                new MarkerCluster(\n                    {\n                        markers: markers,\n                        svgPoint: new SVGPoint(clusters[cell].x, clusters[cell].y),\n                        cellX: clusters[cell].cellX,\n                        cellY: clusters[cell].cellY,\n                    },\n                    _this\n                )\n            );\n        }\n        if (_this.zoomLevel === zoomLevel) {\n            _this.clusterizeMarkers();\n        }\n    }\n    /**\n     * Starts clusterizer worker in a separate thread\n     * @private\n     */\n    startClusterizer(): void | boolean {\n        if (!this.objectsRepository || this.objectsRepository.getLoaded().length === 0) {\n            return;\n        }\n        const locationField = this.objectsRepository.getSchema().getFieldByType(\"location\");\n        if (!locationField) {\n            return false;\n        }\n\n        if (!this.clusterizerWorker) {\n            this.clusterizerWorker = new Worker(MapSVG.urls.root + \"js/mapsvg/Core/clustering.js\");\n\n            // Receive messages from postMessage() calls in the Worker\n            this.clusterizerWorker.onmessage = (evt) => {\n                if (evt.data.clusters) {\n                    this.addClustersFromWorker(evt.data.zoomLevel, evt.data.clusters);\n                }\n            };\n        }\n\n        // Pass data to the WebWorker\n        const objectsData = [];\n        this.objectsRepository\n            .getLoaded()\n            .filter((o) => {\n                return o.location && o.location.marker;\n            })\n            .forEach((o) => {\n                objectsData.push({\n                    id: o.id,\n                    x: o.location.marker.svgPoint.x,\n                    y: o.location.marker.svgPoint.y,\n                });\n            });\n        this.clusterizerWorker.postMessage({\n            objects: objectsData,\n            cellSize: 50,\n            mapWidth: this.containers.map.clientWidth,\n            zoomLevels: this.zoomLevels,\n            zoomLevel: this.zoomLevel,\n            zoomDelta: this.zoomDelta,\n            svgViewBox: this.svgDefault.viewBox,\n        });\n\n        this.events.on(\"zoom\", () => {\n            this.clusterizerWorker.postMessage({\n                message: \"zoom\",\n                zoomLevel: this.zoomLevel,\n            });\n        });\n    }\n    /**\n     * Starts clustering markers on the map\n     * @property {boolean} skipFitMarkers - Don't do \"fit markers\" action. Used to prevent fitting markers\n     * on changinh zoom level.\n     * @private\n     */\n    clusterizeMarkers(skipFitMarkers?: boolean): void {\n        $(this.layers.markers)\n            .children()\n            .each((i, obj) => {\n                $(obj).detach();\n            });\n        this.markers.clear();\n        this.markersClusters.clear();\n\n        // $(this.containers.map).addClass('no-transitions-markers');\n\n        this.clustersByZoom &&\n            this.clustersByZoom[this.zoomLevel] &&\n            this.clustersByZoom[this.zoomLevel].forEach((cluster) => {\n                // Don't clusterize on google maps with zoom level >= 17\n                if (\n                    this.options.googleMaps.on &&\n                    this.googleMaps.map &&\n                    this.googleMaps.map.getZoom() >= 17\n                ) {\n                    this.markerAdd(cluster.markers[0]);\n                } else {\n                    if (cluster.markers.length > 1) {\n                        this.markersClusterAdd(cluster);\n                    } else {\n                        this.markerAdd(cluster.markers[0]);\n                    }\n                }\n            });\n\n        if (this.editingMarker) {\n            this.markerAdd(this.editingMarker);\n        }\n\n        if (!skipFitMarkers) {\n            this.mayBeFitMarkers();\n        }\n\n        if (this.options.labelsMarkers.on) {\n            this.setLabelsMarkers();\n        }\n\n        // $(_this.containers.map).removeClass('no-transitions-markers');\n    }\n    /**\n     * Returns URL of the mapsvg.css file\n     * @returns {string} URL\n     * @private\n     */\n    getCssUrl(): string {\n        return MapSVG.urls.root + \"css/mapsvg.css\";\n    }\n    /**\n     * Checks if the map is geo-calibrated\n     * @returns {boolean}\n     */\n    isGeo(): boolean {\n        return this.mapIsGeo;\n    }\n    /**\n     * Converts a string to function\n     * @param string\n     * @returns {function|object} Function or object {error: \"error text\"}\n     * @private\n     *\n     */\n    functionFromString(string: string): SyntaxError | TypeError {\n        let func;\n        let error;\n        const fn = string.trim();\n        if (fn.indexOf(\"{\") == -1 || fn.indexOf(\"function\") !== 0 || fn.indexOf(\"(\") == -1) {\n            return new SyntaxError(\"MapSVG user function error: no function body.\");\n        }\n        const fnBody = fn.substring(fn.indexOf(\"{\") + 1, fn.lastIndexOf(\"}\"));\n        const params = fn.substring(fn.indexOf(\"(\") + 1, fn.indexOf(\")\"));\n        try {\n            func = new Function(params, fnBody);\n        } catch (err) {\n            error = err;\n        }\n\n        if (!error) return func;\n        else return error;\n    }\n    /**\n     * Returns map options.\n     * @param {bool} forTemplate - If options should be formatted for use in a template\n     * @param {bool} forWeb - If options should be formatted for use in the web\n     * @param {object} optionsDelta - used by backend WP admin only, part of options from the previous view mode\n     * @returns {object}\n     */\n    getOptions(forTemplate: boolean, forWeb: boolean) {\n        const options = <MapOptionsInterface>$.extend(true, {}, this.options);\n\n        function clearEmpties(o) {\n            for (const k in o) {\n                if (!o[k] || typeof o[k] !== \"object\") {\n                    continue;\n                }\n\n                clearEmpties(o[k]);\n                if (Object.keys(o[k]).length === 0) {\n                    delete o[k];\n                }\n            }\n        }\n\n        clearEmpties(options.regions);\n\n        $.extend(true, options, this.optionsDelta);\n\n        options.viewBox = this._viewBox.toArray();\n        options.filtersSchema = this.filtersSchema.getFieldsAsArray();\n        if (options.filtersSchema.length > 0) {\n            options.filtersSchema.forEach((field) => {\n                if (field.type === \"distance\") {\n                    field.value = \"\";\n                }\n            });\n        }\n\n        // @ts-ignore - old options field from MapSVG versions <5.x\n        delete options.markers;\n\n        if (forTemplate) {\n            // @ts-ignore - may this needs to be removed?\n            options.svgFilename = options.source.split(\"/\").pop();\n            // @ts-ignore - may this needs to be removed?\n            options.svgFiles = MapSVG.svgFiles;\n        }\n\n        if (forWeb)\n            $.each(options, (key, val) => {\n                if (JSON.stringify(val) == JSON.stringify(this.defaults[key])) delete options[key];\n            });\n        delete options.backend;\n\n        return options;\n    }\n\n    /**\n     * Restore delta options, used by MapSVG-Admin\n     * @private\n     */\n    restoreDeltaOptions(): void {\n        this.update(this.optionsDelta);\n        this.optionsDelta = {};\n    }\n\n    /**\n     * Sets event handlers\n     * @param {object} functions - Callbacks {eventName, eventName, ...}\n     */\n    setEvents(functions: { [key: string]: string }) {\n        // TODO add namespaces for events as done in jQuery\n\n        let compiledFunction;\n\n        for (const eventName in functions) {\n            if (typeof functions[eventName] === \"string\") {\n                compiledFunction =\n                    functions[eventName] != \"\"\n                        ? this.functionFromString(<string>functions[eventName])\n                        : null;\n                if (\n                    !compiledFunction ||\n                    compiledFunction.error ||\n                    compiledFunction instanceof TypeError ||\n                    compiledFunction instanceof SyntaxError\n                ) {\n                    continue;\n                }\n            } else if (typeof functions[eventName] === \"function\") {\n                compiledFunction = functions[eventName];\n            }\n\n            // Reset events\n            this.events.off(eventName);\n            // Set new event\n            this.events.on(eventName, compiledFunction);\n\n            if (eventName.indexOf(\"directory\") !== -1) {\n                const event = eventName.split(\".\")[0];\n\n                if (this.controllers && this.controllers.directory) {\n                    this.controllers.directory.events.off(event);\n                    this.controllers.directory.events.on(event, compiledFunction);\n                }\n            }\n        }\n\n        $.extend(true, this.options.events, functions);\n    }\n    /**\n     * Sets map actions that should be performed on Region click. Marker click, etc.\n     * @param options\n     *\n     * @example\n     * mapsvg.setActions({\n     *   \"click.region\": {\n     *     showPopover: true,\n     *     showDetails: false\n     *   }\n     * })\n     */\n    setActions(options): void {\n        $.extend(true, this.options.actions, options);\n    }\n    /**\n     * Sets Details View options\n     * @param {object} options - Options\n     */\n    setDetailsView(options?: { [key: string]: any }) {\n        options = options || this.options.detailsView || {};\n        $.extend(true, this.options.detailsView, options);\n\n        // Since 5.0.0: no top/near locations.\n        if (this.options.detailsView.location === \"top\" && this.options.menu.position === \"left\") {\n            this.options.detailsView.location = \"leftSidebar\";\n        } else if (\n            this.options.detailsView.location === \"top\" &&\n            this.options.menu.position === \"right\"\n        ) {\n            this.options.detailsView.location = \"rightSidebar\";\n        }\n        if (\n            this.options.detailsView.location === \"near\" ||\n            this.options.detailsView.location === \"mapContainer\"\n        ) {\n            this.options.detailsView.location = \"map\";\n        }\n\n        if (!this.containers.detailsView) {\n            this.containers.detailsView = $('<div class=\"mapsvg-details-container\"></div>')[0];\n        }\n\n        $(this.containers.detailsView).toggleClass(\n            \"mapsvg-details-container-relative\",\n            !(MapSVG.isPhone && this.options.detailsView.mobileFullscreen) &&\n                !this.shouldBeScrollable(this.options.detailsView.location)\n        );\n\n        if (this.options.detailsView.location === \"custom\") {\n            $(\"#\" + this.options.detailsView.containerId).append($(this.containers.detailsView));\n        } else {\n            if (MapSVG.isPhone && this.options.detailsView.mobileFullscreen) {\n                $(\"body\").append($(this.containers.detailsView));\n                $(this.containers.detailsView).addClass(\"mapsvg-container-fullscreen\");\n            } else {\n                this.containers[this.options.detailsView.location].append(\n                    this.containers.detailsView\n                );\n            }\n            if (this.options.detailsView.margin) {\n                $(this.containers.detailsView).css(\"margin\", this.options.detailsView.margin);\n            }\n            $(this.containers.detailsView).css(\"width\", this.options.detailsView.width);\n        }\n    }\n    /**\n     * Sets mobile view options\n     * @param options\n     */\n    setMobileView(options): void {\n        $.extend(true, this.options.mobileView, options);\n    }\n    /**\n     * Attaches DB Objects to Regions\n     * @param object\n     */\n    attachDataToRegions(object?: any) {\n        this.regions.forEach(function (region) {\n            region.objects = [];\n        });\n\n        this.objectsRepository.getLoaded().forEach((obj, index) => {\n            const regions = obj.getRegionsForTable(this.options.database.regionsTableName);\n            if (regions && regions.length) {\n                regions.forEach((region) => {\n                    const r = this.getRegion(region.id);\n                    if (r) r.objects.push(obj);\n                });\n            }\n        });\n    }\n    /**\n     * Sets templates body\n     * @param {object} templates - Key:value pairs of template names and HTML content\n     */\n    setTemplates(templates): void {\n        this.templates = this.templates || {};\n        for (let name in templates) {\n            if (name != undefined) {\n                this.options.templates[name] = templates[name];\n                let t = this.options.templates[name];\n                if (name == \"directoryItem\" || name == \"directoryCategoryItem\") {\n                    const dirItemTemplate = this.options.templates.directoryItem;\n                    t =\n                        '{{#each items}}<div id=\"mapsvg-directory-item-{{#if id_no_spaces}}{{id_no_spaces}}{{else}}{{id}}{{/if}}\" class=\"mapsvg-directory-item\" data-object-id=\"{{id}}\">' +\n                        dirItemTemplate +\n                        \"</div>{{/each}}\";\n                    if (\n                        this.options.menu.categories &&\n                        this.options.menu.categories.on &&\n                        this.options.menu.categories.groupBy\n                    ) {\n                        const t2 = this.options.templates[\"directoryCategoryItem\"];\n                        t =\n                            '{{#each items}}{{#with category}}<div id=\"mapsvg-category-item-{{value}}\" class=\"mapsvg-category-item\" data-category-value=\"{{value}}\">' +\n                            t2 +\n                            '</div><div class=\"mapsvg-category-block\" data-category-id=\"{{value}}\">{{/with}}' +\n                            t +\n                            \"</div>{{/each}}\";\n                    }\n                    name = \"directory\";\n                }\n\n                try {\n                    this.options.templates[name] = t;\n                    this.templates[name] = Handlebars.compile(t, { strict: false });\n                } catch (err) {\n                    console.error(err);\n                    this.templates[name] = Handlebars.compile(\"\", { strict: false });\n                }\n\n                if (\n                    this.editMode &&\n                    (name == \"directory\" || name == \"directoryCategoryItem\") &&\n                    this.controllers &&\n                    this.controllers.directory\n                ) {\n                    this.controllers.directory.templates.main = this.templates[name];\n                    this.loadDirectory();\n                }\n            }\n        }\n    }\n    /**\n     * Updates map settings.\n     * @param {object} options - Map options\n     *\n     * @example\n     * mapsvg.update({\n     *   popovers: {on: true},\n     *   colors: {\n     *     background: \"red\"\n     *   }\n     * });\n     */\n    update(options): void {\n        for (const key in options) {\n            if (key == \"regions\") {\n                // TODO options.regions for different regions tables (add regionTableName into options)\n                for (const id in options.regions) {\n                    const region = this.getRegion(id);\n                    region && region.update(options.regions[id]);\n                    if (options.regions[id].disabled != undefined) {\n                        this.deselectRegion(region);\n                        // @ts-ignore\n                        this.options.regions[id] = this.options.regions[id] || {};\n                        this.options.regions[id].disabled = region.disabled;\n                    }\n                }\n            } else {\n                const setter = \"set\" + MapSVG.ucfirst(key);\n                if (typeof this[setter] == \"function\") this[setter](options[key]);\n                else {\n                    this.options[key] = options[key];\n                }\n            }\n        }\n    }\n\n    getDirtyFields(): { [key: string]: any } {\n        return this.getData();\n    }\n    clearDirtyFields(): void {\n        this.dirtyFields = [];\n    }\n\n    /**\n     * Sets map title\n     * @param {string} title - Map title\n     * @private\n     */\n    setTitle(title: string): void {\n        title && (this.options.title = title);\n    }\n    /**\n     * Adds MapSVG add-ons\n     * @param extension\n     * @private\n     */\n    setExtension(extension): void {\n        if (extension) {\n            this.options.extension = extension;\n        } else {\n            delete this.options.extension;\n        }\n    }\n    /**\n     * Disables/enables redirection by link on click on a region or marker\n     * when \"Go to link...\" feature is enabled\n     * Used to prevent redirection in the map editor.\n     * @param {boolean} on - true (enable redirection) of false (disable)\n     */\n    setDisableLinks(on: boolean): void {\n        on = MapSVG.parseBoolean(on);\n        if (on) {\n            $(this.containers.map).on(\"click.a.mapsvg\", \"a\", function (e) {\n                e.preventDefault();\n            });\n        } else {\n            $(this.containers.map).off(\"click.a.mapsvg\");\n        }\n        this.disableLinks = on;\n    }\n    /**\n     * Sets loading text message\n     * @param {string} val - \"Loading map...\" text\n     */\n    setLoadingText(val): void {\n        this.options.loadingText = val;\n    }\n    /**\n     * Enable or disable lock aspect ratio. Used in Map Editor.\n     * @param {boolean} onoff\n     * @private\n     */\n    setLockAspectRatio(onoff: boolean): void {\n        this.options.lockAspectRatio = MapSVG.parseBoolean(onoff);\n    }\n    /**\n     * Sets callback for marker click. Used in Map Editor to show an object editing window.\n     * @private\n     */\n    setMarkerEditHandler(handler: (location: Location) => void): void {\n        this.markerEditHandler = handler;\n    }\n    /**\n     * Sets the field that is used for choropleth map\n     * @param {string} field - field name\n     */\n    setChoroplethSourceField(field): void {\n        this.options.choropleth.sourceField = field;\n        this.redrawChoropleth();\n    }\n    /**\n     * Sets callback function that is called on click on a Region.\n     * Used in the Map Editor on click on a Region in the \"Edit regions\" map mode.\n     * @param {Function} handler\n     */\n    setRegionEditHandler(handler: () => void): void {\n        this.regionEditHandler = handler;\n    }\n    /**\n     * Disables all Regions if \"true\" is passed.\n     * @param {boolean} on\n     */\n    setDisableAll(on: boolean) {\n        on = MapSVG.parseBoolean(on);\n        $.extend(true, this.options, { disableAll: on });\n        $(this.containers.map).toggleClass(\"mapsvg-disabled-regions\", on);\n    }\n    /**\n     * @private\n     */\n    setRegionStatuses<T>(_statuses: ArrayIndexed<T>): void {\n        // @ts-ignore\n        this.options.regionStatuses = {};\n        const colors = {};\n        _statuses.forEach((statusOptions) => {\n            this.options.regionStatuses[statusOptions.value] = statusOptions;\n            colors[statusOptions.value] = statusOptions.color.length\n                ? statusOptions.color\n                : undefined;\n        });\n        this.setColors({ status: colors });\n    }\n    /**\n     * @deprecated\n     * @private\n     */\n    setColorsIgnore(val): void {\n        this.options.colorsIgnore = MapSVG.parseBoolean(val);\n        this.regionsRedrawColors();\n    }\n    /**\n     * Sets color settings (background, regions, containers, etc.)\n     * @param {object} colors\n     *\n     * @example\n     * mapsvg.setColors({\n     *   background: \"#EEEEEE\",\n     *   hover: \"10\",\n     *   selected: \"20\",\n     *   leftSidebar: \"#FF2233\",\n     *   detailsView: \"#FFFFFF\"\n     * });\n     */\n    setColors(colors?: { [key: string]: string | number | Record<string, unknown> }): void {\n        for (const i in colors) {\n            if (i === \"status\") {\n                // @ts-ignore\n                for (const s in colors[i]) {\n                    MapSVG.fixColorHash(colors[i][s]);\n                }\n            } else {\n                if (typeof colors[i] == \"string\") {\n                    MapSVG.fixColorHash(colors[i]);\n                }\n            }\n        }\n\n        $.extend(true, this.options, { colors: colors });\n\n        if (colors && colors.status) this.options.colors.status = colors.status;\n\n        if (this.options.colors.markers) {\n            for (const z in this.options.colors.markers) {\n                for (const x in this.options.colors.markers[z]) {\n                    this.options.colors.markers[z][x] = parseInt(this.options.colors.markers[z][x]);\n                }\n            }\n        }\n\n        if (this.options.colors.background)\n            $(this.containers.map).css({ background: this.options.colors.background });\n        if (this.options.colors.hover) {\n            // Typescript compiler thinks isNaN can't accept strings\n            // @ts-ignore\n            this.options.colors.hover = !isNaN(this.options.colors.hover)\n                ? parseInt(this.options.colors.hover + \"\")\n                : this.options.colors.hover;\n        }\n        if (this.options.colors.selected) {\n            // Typescript compiler thinks isNaN can't accept strings\n            // @ts-ignore\n            this.options.colors.selected = !isNaN(this.options.colors.selected)\n                ? parseInt(this.options.colors.selected + \"\")\n                : this.options.colors.selected;\n        }\n\n        $(this.containers.leftSidebar).css({\n            \"background-color\": this.options.colors.leftSidebar,\n        });\n        $(this.containers.rightSidebar).css({\n            \"background-color\": this.options.colors.rightSidebar,\n        });\n        $(this.containers.header).css({ \"background-color\": this.options.colors.header });\n        $(this.containers.footer).css({ \"background-color\": this.options.colors.footer });\n\n        if ($(this.containers.detailsView) && this.options.colors.detailsView !== undefined) {\n            $(this.containers.detailsView).css({\n                \"background-color\": this.options.colors.detailsView,\n            });\n        }\n        if ($(this.containers.directory) && this.options.colors.directory !== undefined) {\n            $(this.containers.directory).css({\n                \"background-color\": this.options.colors.directory,\n            });\n        }\n        if ($(this.containers.filtersModal) && this.options.colors.modalFilters !== undefined) {\n            $(this.containers.filtersModal).css({\n                \"background-color\": this.options.colors.modalFilters,\n            });\n        }\n\n        if ($(this.containers.filters) && this.options.colors.directorySearch) {\n            $(this.containers.filters).css({\n                \"background-color\": this.options.colors.directorySearch,\n            });\n        } else if ($(this.containers.filters)) {\n            $(this.containers.filters).css({\n                \"background-color\": \"\",\n            });\n        }\n\n        if (!this.containers.clustersCss) {\n            this.containers.clustersCss = <HTMLStyleElement>(\n                $(\"<style></style>\").appendTo(\"body\")[0]\n            );\n        }\n        let css = \"\";\n        if (this.options.colors.clusters) {\n            css += \"background-color: \" + this.options.colors.clusters + \";\";\n        }\n        if (this.options.colors.clustersBorders) {\n            css += \"border-color: \" + this.options.colors.clustersBorders + \";\";\n        }\n        if (this.options.colors.clustersText) {\n            css += \"color: \" + this.options.colors.clustersText + \";\";\n        }\n        $(this.containers.clustersCss).html(\".mapsvg-marker-cluster {\" + css + \"}\");\n\n        if (!this.containers.clustersHoverCss) {\n            this.containers.clustersHoverCss = <HTMLStyleElement>(\n                $(\"<style></style>\").appendTo(\"body\")[0]\n            );\n        }\n        let cssHover = \"\";\n        if (this.options.colors.clustersHover) {\n            cssHover += \"background-color: \" + this.options.colors.clustersHover + \";\";\n        }\n        if (this.options.colors.clustersHoverBorders) {\n            cssHover += \"border-color: \" + this.options.colors.clustersHoverBorders + \";\";\n        }\n        if (this.options.colors.clustersHoverText) {\n            cssHover += \"color: \" + this.options.colors.clustersHoverText + \";\";\n        }\n        $(this.containers.clustersHoverCss).html(\".mapsvg-marker-cluster:hover {\" + cssHover + \"}\");\n\n        if (!this.containers.markersCss) {\n            this.containers.markersCss = <HTMLStyleElement>$(\"<style></style>\").appendTo(\"head\")[0];\n        }\n        const markerCssText =\n            \".mapsvg-with-marker-active .mapsvg-marker {\\n\" +\n            \"  opacity: \" +\n            this.options.colors.markers.inactive.opacity / 100 +\n            \";\\n\" +\n            \"  -webkit-filter: grayscale(\" +\n            (100 - this.options.colors.markers.inactive.saturation) +\n            \"%);\\n\" +\n            \"  filter: grayscale(\" +\n            (100 - this.options.colors.markers.inactive.saturation) +\n            \"%);\\n\" +\n            \"}\\n\" +\n            \".mapsvg-with-marker-active .mapsvg-marker-active {\\n\" +\n            \"  opacity: \" +\n            this.options.colors.markers.active.opacity / 100 +\n            \";\\n\" +\n            \"  -webkit-filter: grayscale(\" +\n            (100 - this.options.colors.markers.active.saturation) +\n            \"%);\\n\" +\n            \"  filter: grayscale(\" +\n            (100 - this.options.colors.markers.active.saturation) +\n            \"%);\\n\" +\n            \"}\\n\" +\n            \".mapsvg-with-marker-hover .mapsvg-marker {\\n\" +\n            \"  opacity: \" +\n            this.options.colors.markers.unhovered.opacity / 100 +\n            \";\\n\" +\n            \"  -webkit-filter: grayscale(\" +\n            (100 - this.options.colors.markers.unhovered.saturation) +\n            \"%);\\n\" +\n            \"  filter: grayscale(\" +\n            (100 - this.options.colors.markers.unhovered.saturation) +\n            \"%);\\n\" +\n            \"}\\n\" +\n            \".mapsvg-with-marker-hover .mapsvg-marker-hover {\\n\" +\n            \"  opacity: \" +\n            this.options.colors.markers.hovered.opacity / 100 +\n            \";\\n\" +\n            \"  -webkit-filter: grayscale(\" +\n            (100 - this.options.colors.markers.hovered.saturation) +\n            \"%);\\n\" +\n            \"  filter: grayscale(\" +\n            (100 - this.options.colors.markers.hovered.saturation) +\n            \"%);\\n\" +\n            \"}\\n\";\n        $(this.containers.markersCss).html(markerCssText);\n\n        $.each(this.options.colors, (key, color) => {\n            if (color === null || color == \"\") delete this.options.colors[key];\n        });\n\n        this.regionsRedrawColors();\n    }\n    /**\n     * Sets tooltips options.\n     * @param {object} options\n     * @example\n     * mapsvg.setTooltips({\n     *   on: true,\n     *   position: \"bottom-left\",\n     *   maxWidth: \"300\"\n     * })\n     */\n    setTooltips(options: { on: boolean }): void {\n        if (options.on !== undefined) options.on = MapSVG.parseBoolean(options.on);\n\n        $.extend(true, this.options, { tooltips: options });\n\n        if (!this.containers.tooltip) {\n            this.containers.tooltip = $(\"<div />\").addClass(\"mapsvg-tooltip\")[0];\n            $(this.containers.map).append(this.containers.tooltip);\n            this.controllers.tooltip = new Tooltip({\n                mapsvg: this,\n                container: this.containers.tooltip,\n                position: this.options.tooltips.position,\n                maxWidth: this.options.tooltips.maxWidth,\n                minWidth: this.options.tooltips.minWidth,\n            });\n            this.controllers.tooltip._init();\n        }\n\n        if (typeof this.options.tooltips.position !== \"undefined\") {\n            this.controllers.tooltip.setPosition(this.options.tooltips.position);\n        }\n\n        if (\n            typeof this.options.tooltips.maxWidth !== \"undefined\" ||\n            typeof this.options.tooltips.minWidth !== \"undefined\"\n        ) {\n            this.controllers.tooltip.setSize(\n                this.options.tooltips.minWidth,\n                this.options.tooltips.maxWidth\n            );\n        }\n    }\n    /**\n     * Sets popover options.\n     * @param {object} options\n     * @example\n     * mapsvg.setPopovers({\n     *   on: true,\n     *   width: 300, // pixels\n     *   maxWidth: 70, // percents of map container\n     *   maxHeight: 70, // percents of map container\n     *   mobileFullscreen: true\n     * });\n     */\n    setPopovers(options) {\n        if (options.on !== undefined) options.on = MapSVG.parseBoolean(options.on);\n\n        $.extend(this.options.popovers, options);\n\n        if (!this.containers.popover) {\n            this.containers.popover = $(\"<div />\").addClass(\"mapsvg-popover\")[0];\n            this.layers.popovers.append(this.containers.popover);\n        }\n        $(this.containers.popover).css({\n            width:\n                this.options.popovers.width + (this.options.popovers.width == \"auto\" ? \"\" : \"px\"),\n            \"max-width\": this.options.popovers.maxWidth + \"%\",\n            \"max-height\":\n                (this.options.popovers.maxHeight * $(this.containers.wrap).outerHeight()) / 100 +\n                \"px\",\n        });\n\n        if (this.options.popovers.mobileFullscreen && MapSVG.isPhone) {\n            $(\"body\").toggleClass(\"mapsvg-fullscreen-popovers\", true);\n            $(this.containers.popover).appendTo(\"body\");\n        }\n    }\n    /**\n     * Sets region prefix\n     * @param {string} prefix\n     * @private\n     */\n    setRegionPrefix(prefix) {\n        this.options.regionPrefix = prefix;\n    }\n    /**\n     * Sets initial viewbox\n     * @param {array} v - [x,y,width,height]\n     * @private\n     */\n    setInitialViewBox(v) {\n        if (typeof v == \"string\")\n            v = v\n                .trim()\n                .split(\" \")\n                .map(function (v) {\n                    return parseFloat(v);\n                });\n        this._viewBox.update(new ViewBox(v));\n        if (this.options.googleMaps.on) {\n            this.options.googleMaps.center = this.googleMaps.map.getCenter().toJSON();\n            this.options.googleMaps.zoom = this.googleMaps.map.getZoom();\n        }\n        this.zoomLevel = 0;\n        this.setZoomLevels();\n    }\n    /**\n     * Sets viewbox on map start and calculates initial width/height ratio\n     * @private\n     */\n    setViewBoxOnStart() {\n        this.viewBoxFull = this.svgDefault.viewBox;\n        this.viewBoxFake = this.viewBox;\n        this.whRatioFull = this.viewBoxFull.width / this.viewBox.width;\n        this.containers.svg.setAttribute(\"viewBox\", this.viewBoxFull.toString());\n\n        if ((MapSVG.device.ios || MapSVG.device.android) && this.svgDefault.viewBox.width > 1500) {\n            this.iosDownscaleFactor = this.svgDefault.viewBox.width > 9999 ? 100 : 10;\n            this.containers.svg.style.width =\n                (this.svgDefault.viewBox.width / this.iosDownscaleFactor).toString() + \"px\";\n        } else {\n            this.containers.svg.style.width = this.svgDefault.viewBox.width + \"px\";\n        }\n\n        this.vbStart = true;\n    }\n    /**\n     * Sets map viewbox\n     * @param {ViewBox} viewBox\n     * @param {boolean} adjustGoogleMap\n     */\n    setViewBox(viewBox?: ViewBox, adjustGoogleMap = true): boolean {\n        let initial = false;\n\n        if (typeof viewBox === \"undefined\" || (viewBox.width === 0 && viewBox.height === 0)) {\n            viewBox = this.svgDefault.viewBox;\n            initial = true;\n        }\n        const isZooming =\n            viewBox.width != this.viewBox.width || viewBox.height != this.viewBox.height;\n\n        this.viewBox.update(viewBox);\n\n        this.whRatio = this.viewBox.width / this.viewBox.height;\n\n        !this.vbStart && this.setViewBoxOnStart();\n\n        if (initial) {\n            if (this._viewBox.width === 0 && this._viewBox.height === 0) {\n                this._viewBox.update(this.viewBox);\n            }\n            this._scale = 1;\n        }\n\n        this.scale = this.getScale();\n        this.superScale = (this.whRatioFull * this.svgDefault.viewBox.width) / this.viewBox.width;\n\n        const w = this.svgDefault.viewBox.width / this.containers.map.clientWidth;\n        this.superScale = this.superScale / w;\n\n        if ((MapSVG.device.ios || MapSVG.device.android) && this.svgDefault.viewBox.width > 1500) {\n            this.superScale *= this.iosDownscaleFactor;\n        }\n\n        this.scroll.tx = Math.round((this.svgDefault.viewBox.x - this.viewBox.x) * this.scale);\n        this.scroll.ty = Math.round((this.svgDefault.viewBox.y - this.viewBox.y) * this.scale);\n\n        // Changing Google Map boundaries will call this method again with adjustGoogleMap=false\n        if (this.googleMaps.map && adjustGoogleMap !== false) {\n            // We don't know if there are more zoom levels for Google Map\n            // So we just zoom-in and then check if zoom has changed.\n            // If it's changed then we set the center point\n            const googlePrevZoom = this.googleMaps.map.getZoom();\n            this.googleMaps.map.setCenter(this.getCenterGeoPoint());\n            this.googleMaps.map.setZoom(this.getZoomForGoogle());\n            // if (googlePrevZoom !== this.googleMaps.map.getZoom()) {\n            // }\n        } else {\n            this.containers.scrollpane.style.transform =\n                \"translate(\" + this.scroll.tx + \"px,\" + this.scroll.ty + \"px)\";\n            this.containers.svg.style.transform = \"scale(\" + this.superScale + \")\";\n            this.syncZoomLevelWithGoogle();\n        }\n\n        this.movingItemsAdjustScreenPosition();\n\n        if (isZooming) {\n            this.adjustStrokes();\n            this.toggleSvgLayerOnZoom();\n            if (this.options.clustering.on) {\n                // Google Maps is calling setViewBox 20-30 times per zoom cycle (400ms)\n                // until the animation finishes. So we have to use .throttle to avoid calling\n                // the expensive operation multiple times.\n                this.throttle(this.clusterizeOnZoom, 400, this);\n            } else {\n                this.events.trigger(\"zoom\");\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Google Maps max zoom level is inconsistent for satellite view map type:\n     * depending on the location it can be from 17 to 22.\n     * It's hard to tell if user can zoom in Google Map more before actual zoom occurs.\n     * So we are letting them to zoom and then, if Google Map isn't zoomed then MapSVG and\n     * Google Maps levels would be out of sync.\n     * In this method we check if MapSVG zoom and Google Zoom levels are out of sync\n     * and then synchronize them.\n     */\n    private syncZoomLevelWithGoogle(): void {\n        if (\n            this.googleMaps.map &&\n            this.googleMaps.map.getZoom() !== this.getZoomForGoogle() &&\n            typeof this.zoomDelta !== \"undefined\"\n        ) {\n            this.zoomLevel = this.googleMaps.map.getZoom() - this.zoomDelta;\n        }\n    }\n\n    /**\n     * Returns lat,lng coordinates of center of the current view\n     */\n    getCenterGeoPoint(): GeoPoint {\n        return this.converter.convertSVGToGeo(this.getCenterSvgPoint());\n    }\n\n    /**\n     * Returns  SVG coordinates of the center of current map position\n     */\n    getCenterSvgPoint(): SVGPoint {\n        return new SVGPoint(\n            this.viewBox.x + this.viewBox.width / 2,\n            this.viewBox.y + this.viewBox.height / 2\n        );\n    }\n\n    /**\n     * Returns zoom level adjusted for Google Maps\n     */\n    getZoomForGoogle(): number {\n        if (typeof this.zoomLevel === \"string\") {\n            this.zoomLevel = parseInt(this.zoomLevel);\n        }\n        return this.zoomLevel + this.zoomDelta;\n    }\n    getZoomRange(): { min: number; max: number } {\n        const range = { min: 0, max: 0 };\n\n        if (this.options.googleMaps.on) {\n            range.min = Math.max(0, this.options.zoom.limit[0] + this.zoomDelta) - this.zoomDelta;\n            range.max = Math.min(22, this.options.zoom.limit[1] + this.zoomDelta) - this.zoomDelta;\n        } else {\n            range.min = this.options.zoom.limit[0];\n            range.max = this.options.zoom.limit[1];\n        }\n        return range;\n    }\n    /**\n     * Turns on marker animations\n     * @private\n     */\n    enableMovingElementsAnimation(): void {\n        $(this.containers.map).removeClass(\n            \"no-transitions-markers no-transitions-labels no-transitions-bubbles\"\n        );\n    }\n    /**\n     * Turns off marker animations\n     * @private\n     */\n    disableMovingElementsAnimation(): void {\n        $(this.containers.map).addClass(\n            \"no-transitions-markers no-transitions-labels no-transitions-bubbles\"\n        );\n    }\n    /**\n     * Event handler that clusterizes markers on zoom\n     * @private\n     */\n\n    clusterizeOnZoom(): void {\n        if (this.options.googleMaps.on && this.googleMaps.map && this.zoomDelta) {\n            this.zoomLevel = this.googleMaps.map.getZoom() - this.zoomDelta;\n        }\n        this.events.trigger(\"zoom\");\n        this.clusterizeMarkers(true);\n    }\n    /**\n     * Delays method execution.\n     * For example, it can be used in search input fields to prevent sending\n     * an ajax request on each key press.\n     * @param {function} method\n     * @param {number} delay\n     * @param {object} scope\n     * @param {array} params\n     * @private\n     */\n    throttle(method: (params: any) => void, delay: number, scope: any, params?: any): void {\n        // @ts-ignore\n        clearTimeout(method._tId);\n        // @ts-ignore\n        method._tId = setTimeout(function () {\n            method.apply(scope, params);\n        }, delay);\n    }\n    /**\n     * Sets SVG viewBox by Google Maps bounds.\n     * Used to overlay SVG map on Google Map.\n     */\n    setViewBoxByGoogleMapBounds(): void {\n        const googleMapBounds = this.googleMaps.map.getBounds();\n        if (!googleMapBounds) return;\n        const googleMapBoundsJSON = googleMapBounds.toJSON();\n\n        if (googleMapBoundsJSON.west == -180 && googleMapBoundsJSON.east == 180) {\n            const center = this.googleMaps.map.getCenter().toJSON();\n        }\n        const ne = new GeoPoint(\n            googleMapBounds.getNorthEast().lat(),\n            googleMapBounds.getNorthEast().lng()\n        );\n        const sw = new GeoPoint(\n            googleMapBounds.getSouthWest().lat(),\n            googleMapBounds.getSouthWest().lng()\n        );\n\n        const xyNE = this.converter.convertGeoToSVG(ne);\n        const xySW = this.converter.convertGeoToSVG(sw);\n\n        // Check if map is on border between 180/-180 longitude\n        if (xyNE.x < xySW.y) {\n            const mapPointsWidth =\n                (this.svgDefault.viewBox.width / this.converter.mapLonDelta) * 360;\n            xySW.x = -(mapPointsWidth - xySW.y);\n        }\n\n        const width = xyNE.x - xySW.x;\n        const height = xySW.y - xyNE.y;\n        const viewBox = new ViewBox(xySW.x, xyNE.y, width, height);\n        this.setViewBox(viewBox);\n    }\n    /**\n     * Redraws the map.\n     * Must be called when the map is shown after being hidden.\n     */\n    redraw(): void {\n        this.disableAnimation();\n        if (MapSVG.browser.ie) {\n            $(this.containers.svg).css({ height: this.svgDefault.viewBox.height });\n        }\n\n        if (this.options.googleMaps.on && this.googleMaps.map) {\n            // var center = this.googleMaps.map.getCenter();\n            google.maps.event.trigger(this.googleMaps.map, \"resize\");\n            // this.googleMaps.map.setCenter(center);\n            // this.setViewBoxByGoogleMapBounds();\n        } else {\n            this.setViewBox(this.viewBox);\n        }\n        $(this.containers.popover) &&\n            $(this.containers.popover).css({\n                \"max-height\":\n                    (this.options.popovers.maxHeight * $(this.containers.wrap).outerHeight()) /\n                        100 +\n                    \"px\",\n            });\n        if (this.controllers && this.controllers.directory) {\n            this.controllers.directory.updateTopShift();\n            this.controllers.directory.updateScroll();\n        }\n        this.movingItemsAdjustScreenPosition();\n        this.adjustStrokes();\n        this.enableAnimation();\n    }\n\n    /**\n     * Sets map size.\n     * Can accept both or just 1 parameter - width or height. The missing parameter will be calcualted.\n     * @param {number} width\n     * @param {number} height\n     * @param {boolean} responsive\n     * @returns {number[]} - [width, height]\n     */\n    setSize(width: number, height: number, responsive?: boolean): void {\n        // Convert strings to numbers\n        this.options.width = width;\n        this.options.height = height;\n        this.options.responsive =\n            responsive != null && responsive != undefined\n                ? MapSVG.parseBoolean(responsive)\n                : this.options.responsive;\n\n        // Calculate width and height\n        if (!this.options.width && !this.options.height) {\n            this.options.width = this.svgDefault.width;\n            this.options.height = this.svgDefault.height;\n        } else if (!this.options.width && this.options.height) {\n            this.options.width =\n                (this.options.height * this.svgDefault.width) / this.svgDefault.height;\n        } else if (this.options.width && !this.options.height) {\n            this.options.height =\n                (this.options.width * this.svgDefault.height) / this.svgDefault.width;\n        }\n\n        this.whRatio = this.options.width / this.options.height;\n        this.scale = this.getScale();\n\n        this.setResponsive(responsive);\n\n        if (this.options.choropleth.on && this.options.choropleth.bubbleMode) {\n            this.redrawBubbles();\n        }\n\n        this.movingItemsAdjustScreenPosition();\n    }\n    /**\n     * Sets map responsiveness on/off. When map is responsive, it takes the full width of the parent container.\n     * @param {bool} on\n     */\n    setResponsive(on: boolean): void {\n        on = on != undefined ? MapSVG.parseBoolean(on) : this.options.responsive;\n\n        $(this.containers.map).css({\n            width: \"100%\",\n            height: \"0\",\n            \"padding-bottom\": (this.viewBox.height * 100) / this.viewBox.width + \"%\",\n        });\n        if (on) {\n            $(this.containers.wrap).css({\n                width: \"100%\",\n                height: \"auto\",\n            });\n        } else {\n            $(this.containers.wrap).css({\n                width: this.options.width + \"px\",\n                height: this.options.height + \"px\",\n            });\n        }\n        $.extend(true, this.options, { responsive: on });\n\n        if (!this.resizeSensor) {\n            this.resizeSensor = new ResizeSensor(this.containers.map, () => {\n                this.redraw();\n            });\n        }\n\n        this.redraw();\n    }\n    /**\n     * Sets map scroll options.\n     * @param {object} options - scroll options\n     * @param {bool} skipEvents - used by Map Editor to prevent re-setting event handlers.\n     * @example\n     * mapsvg.setScroll({\n     *   on: true,\n     *   limit: false // limit scroll to map bounds\n     * });\n     */\n    setScroll(options, skipEvents): void {\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        options.limit != undefined && (options.limit = MapSVG.parseBoolean(options.limit));\n        $.extend(true, this.options, { scroll: options });\n        !skipEvents && this.setEventHandlers();\n    }\n    /**\n     * Sets map zoom options.\n     * @param {object} options - zoom options\n     * @example\n     * mapsvg.setZoom({\n     *   on: true,\n     *   mousewheel: true,\n     *   limit: [-5,10], // allow -5 zoom steps back and +20 zoom steps up from initial position.\n     * });\n     */\n    setZoom(options): void {\n        options = options || {};\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        options.fingers != undefined && (options.fingers = MapSVG.parseBoolean(options.fingers));\n        options.mousewheel != undefined &&\n            (options.mousewheel = MapSVG.parseBoolean(options.mousewheel));\n\n        // delta = 1.2 changed to delta = 2 since introducing Google Maps + smooth zoom\n        options.delta = 2;\n\n        // options.delta && (options.delta = parseFloat(options.delta));\n\n        if (options.limit) {\n            if (typeof options.limit == \"string\") options.limit = options.limit.split(\";\");\n            options.limit = [parseInt(options.limit[0]), parseInt(options.limit[1])];\n        }\n        if (!this.zoomLevels) {\n            this.setZoomLevels();\n        }\n\n        $.extend(true, this.options, { zoom: options });\n        //(options.buttons && options.buttons.on) && (options.buttons.on = MapSVG.parseBoolean(options.buttons.on));\n        $(this.containers.scrollpaneWrap).off(\"wheel.mapsvg\");\n\n        if (this.options.zoom.mousewheel) {\n            // var lastZoomTime = 0;\n            // var zoomTimeDelta = 0;\n\n            if (MapSVG.browser.firefox) {\n                this.firefoxScroll = { insideIframe: false, scrollX: 0, scrollY: 0 };\n\n                $(this.containers.scrollpaneWrap)\n                    .on(\"mouseenter\", () => {\n                        this.firefoxScroll.insideIframe = true;\n                        this.firefoxScroll.scrollX = window.scrollX;\n                        this.firefoxScroll.scrollY = window.scrollY;\n                    })\n                    .on(\"mouseleave\", () => {\n                        this.firefoxScroll.insideIframe = false;\n                    });\n\n                $(document).scroll(() => {\n                    if (this.firefoxScroll.insideIframe)\n                        window.scrollTo(this.firefoxScroll.scrollX, this.firefoxScroll.scrollY);\n                });\n            }\n\n            $(this.containers.scrollpaneWrap).on(\"wheel.mapsvg\", (event: JQuery.MouseEventBase) => {\n                event.preventDefault();\n                this.mouseWheelZoom(event);\n                // this.throttle(this.mouseWheelZoom, 500, this, [event]);\n                return false;\n            });\n            $(this.layers.markers).on(\"wheel.mapsvg\", (event: JQuery.MouseEventBase) => {\n                event.preventDefault();\n                this.mouseWheelZoom(event);\n                return false;\n            });\n        }\n        this.canZoom = true;\n    }\n\n    mouseWheelZoom(event: JQuery.MouseEventBase<any, any, any, any>): void {\n        event.preventDefault();\n        // @ts-ignore - doesn't recognize .deltaY\n        const d = Math.sign(-event.originalEvent.deltaY);\n        const center = this.getSvgPointAtClick(event.originalEvent);\n        d > 0 ? this.zoomIn(center) : this.zoomOut(center);\n    }\n\n    /**\n     * Sets map control buttons.\n     * @param {object} options - control button options\n     * @example\n     * mapsvg.setControls({\n     *   location: 'right',\n     *   zoom: true,\n     *   zoomReset: true,\n     *   userLocation: true,\n     *   previousMap: true\n     * });\n     */\n    setControls(options): void {\n        options = options || {};\n        $.extend(true, this.options, { controls: options });\n        this.options.controls.zoom = MapSVG.parseBoolean(this.options.controls.zoom);\n        this.options.controls.zoomReset = MapSVG.parseBoolean(this.options.controls.zoomReset);\n        this.options.controls.userLocation = MapSVG.parseBoolean(\n            this.options.controls.userLocation\n        );\n        this.options.controls.previousMap = MapSVG.parseBoolean(this.options.controls.previousMap);\n\n        const loc = this.options.controls.location || \"right\";\n\n        if (!this.containers.controls) {\n            const buttons = $(\"<div />\").addClass(\"mapsvg-buttons\");\n\n            const zoomGroup = $(\"<div />\").addClass(\"mapsvg-btn-group\").appendTo(buttons);\n            const zoomIn = $(\"<div />\").addClass(\"mapsvg-btn-map mapsvg-in\");\n\n            zoomIn.on(\"touchend click\", (e) => {\n                if (e.cancelable) {\n                    e.preventDefault();\n                }\n                e.stopPropagation();\n                this.zoomIn();\n            });\n\n            const zoomOut = $(\"<div />\").addClass(\"mapsvg-btn-map mapsvg-out\");\n            zoomOut.on(\"touchend click\", (e) => {\n                if (e.cancelable) {\n                    e.preventDefault();\n                }\n                e.stopPropagation();\n                this.zoomOut();\n            });\n            zoomGroup.append(zoomIn).append(zoomOut);\n\n            const location = $(\"<div />\").addClass(\"mapsvg-btn-map mapsvg-btn-location\");\n            location.on(\"touchend click\", (e) => {\n                if (e.cancelable) {\n                    e.preventDefault();\n                }\n                e.stopPropagation();\n                this.showUserLocation((location) => {\n                    if (this.options.scroll.on) {\n                        this.centerOn(location.marker);\n                    }\n                });\n            });\n\n            const userLocationIcon =\n                '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 447.342 447.342\" style=\"enable-background:new 0 0 447.342 447.342;\" xml:space=\"preserve\"><path d=\"M443.537,3.805c-3.84-3.84-9.686-4.893-14.625-2.613L7.553,195.239c-4.827,2.215-7.807,7.153-7.535,12.459 c0.254,5.305,3.727,9.908,8.762,11.63l129.476,44.289c21.349,7.314,38.125,24.089,45.438,45.438l44.321,129.509 c1.72,5.018,6.325,8.491,11.63,8.762c5.306,0.271,10.244-2.725,12.458-7.535L446.15,18.429 C448.428,13.491,447.377,7.644,443.537,3.805z\"/></svg>';\n            location.html(userLocationIcon);\n\n            const locationGroup = $(\"<div />\").addClass(\"mapsvg-btn-group\").appendTo(buttons);\n            locationGroup.append(location);\n\n            const zoomResetIcon =\n                '<svg height=\"14px\" version=\"1.1\" viewBox=\"0 0 14 14\" width=\"14px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><g fill=\"none\" fill-rule=\"evenodd\" id=\"Page-1\" stroke=\"none\" stroke-width=\"1\"><g fill=\"#000000\" transform=\"translate(-215.000000, -257.000000)\"><g id=\"fullscreen\" transform=\"translate(215.000000, 257.000000)\"><path d=\"M2,9 L0,9 L0,14 L5,14 L5,12 L2,12 L2,9 L2,9 Z M0,5 L2,5 L2,2 L5,2 L5,0 L0,0 L0,5 L0,5 Z M12,12 L9,12 L9,14 L14,14 L14,9 L12,9 L12,12 L12,12 Z M9,0 L9,2 L12,2 L12,5 L14,5 L14,0 L9,0 L9,0 Z\" /></g></g></g></svg>';\n            const zoomResetButton = $(\"<div />\")\n                .html(zoomResetIcon)\n                .addClass(\"mapsvg-btn-map mapsvg-btn-zoom-reset\");\n            zoomResetButton.on(\"touchend click\", (e) => {\n                if (e.cancelable) {\n                    e.preventDefault();\n                }\n                e.stopPropagation();\n                this.viewBoxReset(true);\n            });\n            const zoomResetGroup = $(\"<div />\").addClass(\"mapsvg-btn-group\").appendTo(buttons);\n            zoomResetGroup.append(zoomResetButton);\n\n            const previousMapIcon =\n                '<svg xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" version=\"1.1\" id=\"mapsvg-previous-map-icon\" x=\"0px\" y=\"0px\" viewBox=\"0 0 512 512\" style=\"enable-background:new 0 0 512 512;\" xml:space=\"preserve\" sodipodi:docname=\"undo.svg\" inkscape:version=\"0.92.4 (5da689c313, 2019-01-14)\"><metadata id=\"metadata19\"><rdf:RDF><cc:Work rdf:about=\"\">' +\n                '<dc:format>image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs id=\"defs17\" /><sodipodi:namedview pagecolor=\"#ffffff\" bordercolor=\"#666666\" borderopacity=\"1\" objecttolerance=\"10\" gridtolerance=\"10\" guidetolerance=\"10\" inkscape:pageopacity=\"0\" inkscape:pageshadow=\"2\" inkscape:window-width=\"1920\" inkscape:window-height=\"1017\" id=\"namedview15\" showgrid=\"false\" inkscape:zoom=\"1.0103686\" inkscape:cx=\"181.33521\" inkscape:cy=\"211.70893\" inkscape:window-x=\"-8\" inkscape:window-y=\"-8\" inkscape:window-maximized=\"1\" inkscape:current-layer=\"Capa_1\" /> <g id=\"g6\" transform=\"matrix(0.53219423,0,0,0.52547259,122.72749,106.63302)\">' +\n                '<g id=\"g4\"><path d=\"m 142.716,293.147 -94,-107.602 94,-107.602 c 7.596,-8.705 6.71,-21.924 -1.995,-29.527 -8.705,-7.596 -21.917,-6.703 -29.527,1.995 L 5.169,171.782 c -6.892,7.882 -6.892,19.65 0,27.532 l 106.026,121.372 c 4.143,4.729 9.94,7.157 15.771,7.157 4.883,0 9.786,-1.702 13.755,-5.169 8.706,-7.603 9.598,-20.822 1.995,-29.527 z\" id=\"path2\" inkscape:connector-curvature=\"0\" /></g></g><g id=\"g12\" transform=\"matrix(0.53219423,0,0,0.52547259,122.72749,106.63302)\"><g id=\"g10\"> <path d=\"M 359.93,164.619 H 20.926 C 9.368,164.619 0,173.986 0,185.545 c 0,11.558 9.368,20.926 20.926,20.926 H 359.93 c 60.776,0 110.218,49.441 110.218,110.211 0,60.77 -49.442,110.211 -110.218,110.211 H 48.828 c -11.558,0 -20.926,9.368 -20.926,20.926 0,11.558 9.368,20.926 20.926,20.926 H 359.93 C 443.774,468.745 512,400.526 512,316.682 512,232.838 443.781,164.619 359.93,164.619 Z\" ' +\n                'id=\"path8\" inkscape:connector-curvature=\"0\" /></g></g></svg>';\n            const previousMapButton = $(\"<div />\")\n                .html(previousMapIcon)\n                .addClass(\"mapsvg-btn-map mapsvg-btn-previous-map\");\n            previousMapButton.on(\"touchend click\", (e) => {\n                if (e.cancelable) {\n                    e.preventDefault();\n                }\n                e.stopPropagation();\n                this.loadPreviousMap();\n            });\n            const previousMapGroup = $(\"<div />\").addClass(\"mapsvg-btn-group\").appendTo(buttons);\n            previousMapGroup.append(previousMapButton);\n\n            this.containers.controls = buttons[0];\n            this.controls = {\n                zoom: zoomGroup[0],\n                userLocation: locationGroup[0],\n                zoomReset: zoomResetGroup[0],\n                previousMap: previousMapGroup[0],\n            };\n            $(this.containers.map).append($(this.containers.controls));\n        }\n\n        $(this.controls.zoom).toggle(this.options.controls.zoom);\n        $(this.controls.userLocation).toggle(this.options.controls.userLocation);\n        $(this.controls.zoomReset).toggle(this.options.controls.zoomReset);\n        $(this.controls.previousMap).toggle(\n            this.options.controls.previousMap && this.options.previousMapsIds.length > 0\n        );\n\n        $(this.containers.controls).removeClass(\"left\");\n        $(this.containers.controls).removeClass(\"right\");\n        (loc == \"right\" && $(this.containers.controls).addClass(\"right\")) ||\n            (loc == \"left\" && $(this.containers.controls).addClass(\"left\"));\n    }\n    /**\n     * Calcualtes map viewBox parameter for each zoom level\n     * @private\n     */\n    setZoomLevels(): void {\n        if (!this.zoomLevels) {\n            this.zoomLevels = new ArrayIndexed(\"zoomLevel\");\n        } else {\n            this.zoomLevels.clear();\n        }\n\n        for (let i = -20; i < 0; i++) {\n            const _scale = 1 / Math.pow(this.options.zoom.delta, Math.abs(i));\n            this.zoomLevels.push({\n                zoomLevel: i,\n                _scale: _scale,\n                viewBox: new ViewBox(\n                    0,\n                    0,\n                    this._viewBox.width / _scale,\n                    this._viewBox.height / _scale\n                ),\n            });\n        }\n\n        for (let z = 0; z <= 20; z++) {\n            const _scale = Math.pow(this.options.zoom.delta, Math.abs(z));\n            this.zoomLevels.push({\n                zoomLevel: z,\n                _scale: _scale,\n                viewBox: new ViewBox(\n                    0,\n                    0,\n                    this._viewBox.width / _scale,\n                    this._viewBox.height / _scale\n                ),\n            });\n        }\n    }\n    /**\n     * Sets mouse pointer cursor style on hover on regions / markers.\n     * @param {string} type - \"pointer\" or \"default\"\n     */\n    setCursor(type): void {\n        type = type == \"pointer\" ? \"pointer\" : \"default\";\n        this.options.cursor = type;\n        if (type == \"pointer\") $(this.containers.map).addClass(\"mapsvg-cursor-pointer\");\n        else $(this.containers.map).removeClass(\"mapsvg-cursor-pointer\");\n    }\n    /**\n     * Enables/disables \"multiselect\" option that allows to select multiple regions.\n     * @param {boolean} on\n     * @param {boolean} deselect - If true, deselects currently selected Regions\n     */\n    setMultiSelect(on: boolean, deselect?: boolean) {\n        this.options.multiSelect = MapSVG.parseBoolean(on);\n        if (deselect !== false) this.deselectAllRegions();\n    }\n    /**\n     * Sets choropleth map options\n     * @param {object} options\n     *\n     * @example\n     * mapsvg.setChoropleth({\n     *   on: true,\n     *   colors: {\n     *     high: \"#FF0000\",\n     *     low: \"#00FF00\"\n     *   }\n     *   labels: {\n     *     high: \"high\",\n     *     low: \"low\"\n     *   }\n     * });\n     */\n    _new_setChoropleth(options?: any) {\n        options = options || this.options.choropleth;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n\n        if (\n            typeof options.coloring === \"undefined\" ||\n            typeof options.coloring.palette === \"undefined\" ||\n            typeof options.coloring.palette.colors === \"undefined\"\n        ) {\n            if (\n                typeof options.sourceFieldSelect === \"undefined\" ||\n                typeof options.sourceFieldSelect.variants === \"undefined\"\n            ) {\n                $.extend(true, this.options.choropleth, options);\n            } else {\n                this.options.choropleth.sourceFieldSelect.variants =\n                    options.sourceFieldSelect.variants;\n            }\n        } else {\n            const paletteColorsIndexes = Object.keys(options.coloring.palette.colors);\n            if (\n                paletteColorsIndexes.length > 1 ||\n                (paletteColorsIndexes[0] == \"0\" &&\n                    Object.keys(options.coloring.palette.colors[0]).length > 1)\n            ) {\n                this.options.choropleth.coloring.palette.colors = options.coloring.palette.colors;\n            } else {\n                const paletteColorIndex = Object.keys(options.coloring.palette.colors)[0];\n                $.extend(\n                    true,\n                    this.options.choropleth.coloring.palette.colors[paletteColorIndex],\n                    options.coloring.palette.colors[paletteColorIndex]\n                );\n            }\n        }\n\n        this.updateChoroplethMinMax();\n\n        if (\n            this.options.choropleth.on &&\n            this.options.choropleth.sourceFieldSelect.on &&\n            this.options.choropleth.sourceFieldSelect.variants\n        ) {\n            if (!this.containers.choroplethSourceSelect) {\n                const sourceSelectOptions = [];\n                this.options.choropleth.sourceFieldSelect.variants.forEach((variant) => {\n                    sourceSelectOptions.push(\n                        $(\n                            '<option value=\"' +\n                                variant +\n                                '\" ' +\n                                (variant === this.options.choropleth.sourceField\n                                    ? \"selected\"\n                                    : \"\") +\n                                \">\" +\n                                variant +\n                                \"</option>\"\n                        )\n                    );\n                });\n\n                this.containers.choroplethSourceSelect = {\n                    container: $('<div class=\"mapsvg-choropleth-source-field\"></div>')[0],\n                    select: $(\n                        '<select id=\"mapsvg-choropleth-source-field-select\" class=\"mapsvg-select2\"></select>'\n                    )[0],\n                    options: sourceSelectOptions,\n                };\n\n                $(this.containers.choroplethSourceSelect.select).append(\n                    this.containers.choroplethSourceSelect.options\n                );\n                //$(this.containers.choroplethSourceSelect.container).append($(this.containers.choroplethSourceSelect.label));\n                $(this.containers.choroplethSourceSelect.container).append(\n                    $(this.containers.choroplethSourceSelect.select)\n                );\n\n                $(this.containers.map).append($(this.containers.choroplethSourceSelect.container));\n\n                $(this.containers.choroplethSourceSelect.select).mselect2();\n\n                //select2 lib bug workaround. Should be on('change'...)\n                $(this.containers.choroplethSourceSelect.select)\n                    .mselect2()\n                    .on(\"select2:select select2:unselecting\", (e) => {\n                        if (e.cancelable) {\n                            e.preventDefault();\n                        }\n                        e.stopPropagation();\n                        this.setChoropleth({ sourceField: $(e.target).mselect2().val() });\n                    });\n            } else {\n                $(this.containers.choroplethSourceSelect.select).mselect2(\"destroy\");\n                $(this.containers.choroplethSourceSelect.select).find(\"option\").remove();\n                this.containers.choroplethSourceSelect.options = [];\n                this.options.choropleth.sourceFieldSelect.variants.forEach((variant) => {\n                    this.containers.choroplethSourceSelect.options.push(\n                        $(\n                            '<option value=\"' +\n                                variant +\n                                '\" ' +\n                                (variant === this.options.choropleth.sourceField\n                                    ? \"selected\"\n                                    : \"\") +\n                                \">\" +\n                                variant +\n                                \"</option>\"\n                        )[0]\n                    );\n                });\n                $(this.containers.choroplethSourceSelect.select).append(\n                    this.containers.choroplethSourceSelect.options\n                );\n                $(this.containers.choroplethSourceSelect.select).mselect2({ width: \"100%\" });\n            }\n        }\n\n        if (\n            (!this.options.choropleth.on || !this.options.choropleth.sourceFieldSelect.on) &&\n            this.containers.choroplethSourceSelect &&\n            $(this.containers.choroplethSourceSelect.container).is(\":visible\")\n        ) {\n            $(this.containers.choroplethSourceSelect.container).hide();\n        } else if (\n            this.options.choropleth.on &&\n            this.options.choropleth.sourceFieldSelect.on &&\n            this.containers.choroplethSourceSelect &&\n            !$(this.containers.choroplethSourceSelect.container).is(\":visible\")\n        ) {\n            $(this.containers.choroplethSourceSelect.container).show();\n        }\n\n        $(this.containers.map).find(\".mapsvg-choropleth-legend\").remove();\n\n        if (this.options.choropleth.on && this.options.choropleth.coloring.legend.on) {\n            const legend = this.options.choropleth.coloring.legend;\n            let coloring = \"\";\n\n            if (this.options.choropleth.coloring.mode === \"gradient\") {\n                //Gradient mode\n                coloring +=\n                    '<div class=\"mapsvg-choropleth-legend-gradient-no-data\">' +\n                    this.options.choropleth.coloring.noData.description +\n                    \"</div>\";\n\n                let legendGradient = \"\";\n\n                for (let chunkIdx = 1; chunkIdx < 5; chunkIdx++) {\n                    legendGradient +=\n                        '<div class=\"mapsvg-choropleth-legend-gradient-chunk\">' +\n                        ((this.options.choropleth.coloring.gradient.values.maxAdjusted * chunkIdx) /\n                            5 +\n                            this.options.choropleth.coloring.gradient.values.min) +\n                        \"</div>\";\n                }\n\n                coloring +=\n                    '<div class=\"mapsvg-choropleth-legend-gradient-colors\">' +\n                    legendGradient +\n                    \"</div>\";\n            } else {\n                //Palette mode\n\n                coloring +=\n                    '<div class=\"mapsvg-choropleth-legend-palette-color-wrap\" data-idx=\"no-data\">' +\n                    '<div class=\"mapsvg-choropleth-legend-palette-color\"></div>' +\n                    '<div class=\"mapsvg-choropleth-legend-palette-color-description\">' +\n                    this.options.choropleth.coloring.noData.description +\n                    \"</div>\" +\n                    \"</div>\";\n\n                coloring +=\n                    '<div class=\"mapsvg-choropleth-legend-palette-color-wrap\" data-idx=\"out-of-range\">' +\n                    '<div class=\"mapsvg-choropleth-legend-palette-color\"></div>' +\n                    '<div class=\"mapsvg-choropleth-legend-palette-color-description\">' +\n                    this.options.choropleth.coloring.palette.outOfRange.description +\n                    \"</div>\" +\n                    \"</div>\";\n\n                const paletteColors = this.options.choropleth.coloring.palette.colors;\n\n                paletteColors.forEach((paletteColor, idx) => {\n                    let paletteColorElementText = \"\";\n                    if (paletteColor.description) {\n                        paletteColorElementText = paletteColor.description;\n                    } else {\n                        if (idx === 0 && !paletteColor.valueFrom && paletteColor.valueFrom !== 0) {\n                            if (legend.layout === \"vertical\") {\n                                paletteColorElementText = \"Less then \" + paletteColor.valueTo;\n                            } else {\n                                paletteColorElementText = \"< \" + paletteColor.valueTo;\n                            }\n                        } else if (idx === paletteColors.length - 1 && !paletteColor.valueTo) {\n                            if (legend.layout === \"vertical\") {\n                                paletteColorElementText = paletteColor.valueFrom + \" or more\";\n                            } else {\n                                paletteColorElementText = paletteColor.valueFrom + \" <\";\n                            }\n                        } else {\n                            paletteColorElementText =\n                                paletteColor.valueFrom + \" &#8804; \" + paletteColor.valueTo;\n                        }\n                    }\n\n                    coloring +=\n                        '<div class=\"mapsvg-choropleth-legend-palette-color-wrap\" data-idx=\"' +\n                        idx +\n                        '\">' +\n                        '<div class=\"mapsvg-choropleth-legend-palette-color\"></div>' +\n                        '<div class=\"mapsvg-choropleth-legend-palette-color-description\">' +\n                        paletteColorElementText +\n                        \"</div>\" +\n                        \"</div>\";\n                });\n            }\n\n            this.containers.legend = {\n                title: $(\n                    '<div class=\"mapsvg-choropleth-legend-title\">' + legend.title + \"</div>\"\n                )[0],\n                text: $('<div class=\"mapsvg-choropleth-legend-text\">' + legend.text + \"</div>\")[0],\n                coloring: $(\n                    '<div class=\"mapsvg-choropleth-legend-' +\n                        this.options.choropleth.coloring.mode +\n                        '\">' +\n                        coloring +\n                        \"</div>\"\n                )[0],\n                description: $(\n                    '<div class=\"mapsvg-choropleth-legend-description\">' +\n                        legend.description +\n                        \"</div>\"\n                )[0],\n                container: $(\"<div />\").addClass(\n                    \"mapsvg-choropleth-legend mapsvg-choropleth-legend-\" +\n                        legend.layout +\n                        \" mapsvg-choropleth-legend-container-\" +\n                        legend.container\n                )[0],\n            };\n\n            $(this.containers.legend.container)\n                .append(this.containers.legend.title)\n                .append(this.containers.legend.text)\n                .append(this.containers.legend.coloring)\n                .append(this.containers.legend.description);\n            $(this.containers.map).append(this.containers.legend.container);\n\n            this.setChoroplethLegendCSS();\n\n            this.regionsRepository.events.on(\"updated\", () => {\n                this.redrawChoropleth();\n            });\n\n            this.objectsRepository.events.on(\"updated\", () => {\n                this.redrawChoropleth();\n            });\n        }\n\n        if (this.options.choropleth.on && this.options.choropleth.coloring.mode === \"gradient\") {\n            const colors = this.options.choropleth.coloring.gradient.colors;\n            if (colors) {\n                colors.lowRGB = tinycolor(colors.low).toRgb();\n                colors.highRGB = tinycolor(colors.high).toRgb();\n                colors.diffRGB = {\n                    r: colors.highRGB.r - colors.lowRGB.r,\n                    g: colors.highRGB.g - colors.lowRGB.g,\n                    b: colors.highRGB.b - colors.lowRGB.b,\n                    a: colors.highRGB.a - colors.lowRGB.a,\n                };\n                this.containers.legend && this.setChoroplethLegendCSS();\n            }\n        }\n\n        this.redrawChoropleth();\n    }\n    /**\n     * Redraws choropleth map colors\n     * @private\n     */\n    redrawChoropleth() {\n        this.updateChoroplethMinMax();\n        this.redrawBubbles();\n        this.regionsRedrawColors();\n    }\n    /**\n     * Updates min/max values of choropleth fields\n     * @private\n     */\n    updateChoroplethMinMax() {\n        if (this.options.choropleth.on) {\n            const gradient = this.options.choropleth.coloring.gradient,\n                values = [];\n\n            gradient.values.min = 0;\n            gradient.values.max = null;\n\n            if (this.options.choropleth.source === \"regions\") {\n                this.regions.forEach((region) => {\n                    const choropleth =\n                        region.data && region.data[this.options.choropleth.sourceField];\n                    choropleth != undefined && choropleth !== \"\" && values.push(choropleth);\n                });\n            } else {\n                this.objectsRepository.objects.forEach((object) => {\n                    const choropleth = object[this.options.choropleth.sourceField];\n                    choropleth != undefined && choropleth !== \"\" && values.push(choropleth);\n                });\n            }\n\n            if (values.length > 0) {\n                gradient.values.min = Math.min.apply(null, values);\n                gradient.values.max = Math.max.apply(null, values);\n                gradient.values.maxAdjusted = gradient.values.max - gradient.values.min;\n            }\n        }\n    }\n    /**\n     * Sets gradient for choropleth map\n     * @private\n     */\n    setChoroplethLegendCSS(): void {\n        const gradient = this.options.choropleth.coloring.gradient,\n            legend = this.options.choropleth.coloring.legend,\n            noData = this.options.choropleth.coloring.noData,\n            outOfRange = this.options.choropleth.coloring.palette.outOfRange;\n\n        $(\".mapsvg-choropleth-legend\").css({\n            width: legend.width,\n            height: legend.height,\n        });\n\n        if (this.options.choropleth.coloring.mode === \"gradient\") {\n            if (legend.layout === \"horizontal\") {\n                // horizontal legend\n                $(\n                    \".mapsvg-choropleth-legend-horizontal .mapsvg-choropleth-legend-gradient-colors\"\n                ).css({\n                    background:\n                        \"linear-gradient(to right,\" +\n                        gradient.colors.low +\n                        \" 1%,\" +\n                        gradient.colors.high +\n                        \" 100%)\",\n                });\n            } else {\n                // vertical legend\n                $(\n                    \".mapsvg-choropleth-legend-vertical .mapsvg-choropleth-legend-gradient-colors\"\n                ).css({\n                    background:\n                        \"linear-gradient(to bottom,\" +\n                        gradient.colors.low +\n                        \" 1%,\" +\n                        gradient.colors.high +\n                        \" 100%)\",\n                });\n            }\n\n            $(\".mapsvg-choropleth-legend-gradient-no-data\").css({\n                \"background-color\": noData.color,\n            });\n        } else {\n            const paletteColors = this.options.choropleth.coloring.palette.colors;\n\n            paletteColors.forEach(function (paletteColor, idx) {\n                $(\n                    '.mapsvg-choropleth-legend-palette-color-wrap[data-idx=\"' +\n                        idx +\n                        '\"] .mapsvg-choropleth-legend-palette-color'\n                ).css({\n                    \"background-color\": paletteColor.color,\n                });\n            });\n\n            $(\n                '.mapsvg-choropleth-legend-palette-color-wrap[data-idx=\"no-data\"] .mapsvg-choropleth-legend-palette-color'\n            ).css({\n                \"background-color\": noData.color,\n            });\n\n            $(\n                '.mapsvg-choropleth-legend-palette-color-wrap[data-idx=\"out-of-range\"] .mapsvg-choropleth-legend-palette-color'\n            ).css({\n                \"background-color\": outOfRange.color,\n            });\n        }\n    }\n    /**\n     * Sets custom map CSS.\n     * CSS is added as <style>...</style> tag in the page <header>\n     * @param {string} css\n     * @private\n     */\n    setCss(css?: string): void {\n        this.options.css =\n            css || (this.options.css ? this.options.css.replace(/%id%/g, \"\" + this.id) : \"\");\n        this.liveCss = this.liveCss || <HTMLStyleElement>$(\"<style></style>\").appendTo(\"head\")[0];\n        $(this.liveCss).html(this.options.css);\n    }\n    /**\n     * Sets filter options\n     * @param {object} options\n     * @example\n     * mapsvg.setFilters{{\n     *   on: true,\n     *   location: \"leftSidebar\"\n     * }};\n     */\n    setFilters(options?: { [key: string]: any }): void {\n        options = options || this.options.filters;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        options.hide != undefined && (options.hide = MapSVG.parseBoolean(options.hide));\n        $.extend(true, this.options, { filters: options });\n\n        const scrollable = false;\n\n        if (\n            !MapSVG.googleMapsApiLoaded &&\n            this.options.filters.on &&\n            this.filtersSchema.getField(\"distance\")\n        ) {\n            this.loadGoogleMapsAPI(\n                () => {\n                    return 1;\n                },\n                () => {\n                    return 1;\n                }\n            );\n        }\n\n        if (\n            [\"leftSidebar\", \"rightSidebar\", \"header\", \"footer\", \"custom\", \"map\"].indexOf(\n                this.options.filters.location\n            ) === -1\n        ) {\n            this.options.filters.location = \"leftSidebar\";\n        }\n\n        if (this.options.filters.on) {\n            if (this.formBuilder) {\n                this.formBuilder.destroy();\n            }\n\n            if (!this.containers.filters) {\n                this.containers.filters = $('<div class=\"mapsvg-filters-wrap\"></div>')[0];\n            } else {\n                $(this.containers.filters).empty();\n                $(this.containers.filters).show();\n            }\n\n            $(this.containers.filters).css({\n                \"background-color\": this.options.colors.directorySearch,\n            });\n\n            if ($(this.containers.filtersModal)) {\n                $(this.containers.filtersModal).css({ width: this.options.filters.width });\n            }\n\n            if (this.options.filters.location === \"custom\") {\n                $(this.containers.filters)\n                    .removeClass(\"mapsvg-filter-container-custom\")\n                    .addClass(\"mapsvg-filter-container-custom\");\n                if ($(\"#\" + this.options.filters.containerId).length) {\n                    $(\"#\" + this.options.filters.containerId).append(this.containers.filters);\n                } else {\n                    $(this.containers.filters).hide();\n                    console.error(\n                        \"MapSVG: filter container #\" +\n                            this.options.filters.containerId +\n                            \" does not exists\"\n                    );\n                }\n            } else {\n                if (MapSVG.isPhone) {\n                    $(this.containers.header).append($(this.containers.filters));\n                    this.setContainers({ header: { on: true } });\n                } else {\n                    const location = MapSVG.isPhone ? \"header\" : this.options.filters.location;\n                    if (\n                        this.options.menu.on &&\n                        this.controllers.directory &&\n                        this.options.menu.location === this.options.filters.location\n                    ) {\n                        $(this.controllers.directory.containers.view)\n                            .find(\".mapsvg-directory-filter-wrap\")\n                            .append($(this.containers.filters));\n                        this.controllers.directory.updateTopShift();\n                    } else {\n                        $(this.containers[location]).append($(this.containers.filters));\n                        this.controllers.directory && this.controllers.directory.updateTopShift();\n                    }\n                }\n            }\n\n            this.loadFiltersController(this.containers.filters, false);\n\n            this.updateFiltersState();\n        } else {\n            if ($(this.containers.filters)) {\n                $(this.containers.filters).empty();\n                $(this.containers.filters).hide();\n            }\n        }\n\n        if (\n            this.options.menu.on &&\n            this.controllers.directory &&\n            this.options.menu.location === this.options.filters.location\n        ) {\n            this.controllers.directory.updateTopShift();\n        }\n    }\n    /**\n     * Updates filters in drop-downs. For example, when region is clicked and data is filtered -\n     * it selects corresponding region in the drop-down filter\n     * @private\n     */\n    updateFiltersState() {\n        if (this.options.filters && this.options.filters.on && this.controllers.filters) {\n            //this.controllers.filters.reset();\n            this.controllers.filters.update(this.objectsRepository.query);\n            this.updateFilterTags();\n        }\n    }\n\n    private setGlobalDistanceFilter(): void {\n        if (\n            this.objectsRepository &&\n            this.objectsRepository.query.filters &&\n            this.objectsRepository.query.filters.distance\n        ) {\n            const dist = this.objectsRepository.query.filters.distance;\n            MapSVG.distanceSearch = this.objectsRepository.query.filters.distance;\n        } else {\n            MapSVG.distanceSearch = null;\n        }\n    }\n\n    private updateFilterTags() {\n        $(this.containers.filterTags) && $(this.containers.filterTags).empty();\n\n        // TODO get field difference\n\n        for (const field_name in this.objectsRepository.query.filters) {\n            let field_value = this.objectsRepository.query.filters[field_name];\n            let _field_name = field_name;\n            const filterField = this.filtersSchema.getField(_field_name);\n\n            if (field_name == \"regions\") {\n                // check if there is such filter. If there is then change its value\n                // if there isn't then add a tag with close button\n                _field_name = \"\";\n                field_value = field_value.region_ids.map((id) => this.getRegion(id).title);\n            } else {\n                _field_name = filterField && filterField.label;\n            }\n\n            if (field_name !== \"distance\") {\n                if (!this.containers.filterTags) {\n                    this.containers.filterTags = $('<div class=\"mapsvg-filter-tags\"></div>')[0];\n                    // TODO If filtersmodeal on then dont append\n                    if ($(this.containers.filters)) {\n                        // $(this.containers.filters).append($(this.containers.filterTags));\n                    } else {\n                        if (this.options.menu.on && this.controllers.directory) {\n                            $(this.controllers.directory.containers.toolbar).append(\n                                this.containers.filterTags\n                            );\n                            this.controllers.directory.updateTopShift();\n                        } else {\n                            $(this.containers.map).append(this.containers.filterTags);\n                            if (this.options.zoom.buttons.on) {\n                                if (this.options.layersControl.on) {\n                                    if (this.options.layersControl.position == \"top-left\") {\n                                        $(this.containers.filterTags).css({\n                                            right: 0,\n                                            bottom: 0,\n                                        });\n                                    } else {\n                                        $(this.containers.filterTags).css({\n                                            bottom: 0,\n                                        });\n                                    }\n                                } else {\n                                    if (this.options.zoom.buttons.location == \"left\") {\n                                        $(this.containers.filterTags).css({\n                                            right: 0,\n                                        });\n                                    }\n                                }\n                            }\n                        }\n                    }\n\n                    $(this.containers.filterTags).on(\n                        \"click\",\n                        \".mapsvg-filter-delete\",\n                        (e: JQuery.MouseEventBase) => {\n                            const filterField = $(e.target).data(\"filter\");\n                            $(e.target).parent().remove();\n                            this.objectsRepository.query.removeFilter(filterField);\n                            this.deselectAllRegions();\n                            this.loadDataObjects();\n                        }\n                    );\n                }\n                $(this.containers.filterTags).append(\n                    '<div class=\"mapsvg-filter-tag\">' +\n                        (_field_name ? _field_name + \": \" : \"\") +\n                        field_value +\n                        ' <span class=\"mapsvg-filter-delete\" data-filter=\"' +\n                        field_name +\n                        '\">×</span></div>'\n                );\n            }\n        }\n    }\n\n    /**\n     * Sets container options: leftSidebar, rightSidebar, header, footer.\n     * @param {object} options\n     *\n     * @example\n     * mapsvg.setContainers({\n     *   leftSidebar: {\n     *     on: true,\n     *     width: \"300px\"\n     *   }\n     * });\n     */\n    setContainers(options) {\n        const _this = this;\n\n        if (!this.containersCreated) {\n            this.containers.wrapAll = document.createElement(\"div\");\n            this.containers.wrapAll.classList.add(\"mapsvg-wrap-all\");\n            this.containers.wrapAll.id = \"mapsvg-map-\" + this.id;\n            this.containers.wrapAll.setAttribute(\"data-map-id\", this.id ? this.id.toString() : \"\");\n\n            this.containers.wrap = document.createElement(\"div\");\n            this.containers.wrap.classList.add(\"mapsvg-wrap\");\n\n            this.containers.mapContainer = document.createElement(\"div\");\n            this.containers.mapContainer.classList.add(\"mapsvg-map-container\");\n\n            this.containers.leftSidebar = document.createElement(\"div\");\n            this.containers.leftSidebar.className =\n                \"mapsvg-sidebar mapsvg-top-container mapsvg-sidebar-left\";\n            this.containers.rightSidebar = document.createElement(\"div\");\n            this.containers.rightSidebar.className =\n                \"mapsvg-sidebar mapsvg-top-container mapsvg-sidebar-right\";\n\n            this.containers.header = document.createElement(\"div\");\n            this.containers.header.className = \"mapsvg-header mapsvg-top-container\";\n            this.containers.footer = document.createElement(\"div\");\n            this.containers.footer.className = \"mapsvg-footer mapsvg-top-container\";\n\n            _this.containers.wrapAll = $('<div class=\"mapsvg-wrap-all\"></div>')\n                .attr(\"id\", \"mapsvg-map-\" + this.id)\n                .attr(\"data-map-id\", this.id)[0];\n            _this.containers.wrap = $('<div class=\"mapsvg-wrap\"></div>')[0];\n            _this.containers.mapContainer = $('<div class=\"mapsvg-map-container\"></div>')[0];\n            _this.containers.leftSidebar = $(\n                '<div class=\"mapsvg-sidebar mapsvg-top-container mapsvg-sidebar-left\"></div>'\n            )[0];\n            _this.containers.rightSidebar = $(\n                '<div class=\"mapsvg-sidebar mapsvg-top-container mapsvg-sidebar-right\"></div>'\n            )[0];\n            _this.containers.header = $(\n                '<div class=\"mapsvg-header mapsvg-top-container\"></div>'\n            )[0];\n            _this.containers.footer = $(\n                '<div class=\"mapsvg-footer mapsvg-top-container\"></div>'\n            )[0];\n\n            $(_this.containers.wrapAll).insertBefore(_this.containers.map);\n            $(_this.containers.wrapAll).append(_this.containers.header);\n            $(_this.containers.wrapAll).append(_this.containers.wrap);\n            $(_this.containers.wrapAll).append(_this.containers.footer);\n\n            $(_this.containers.mapContainer).append(_this.containers.map);\n\n            $(_this.containers.wrap).append(_this.containers.leftSidebar);\n            $(_this.containers.wrap).append(_this.containers.mapContainer);\n            $(_this.containers.wrap).append(_this.containers.rightSidebar);\n            _this.containersCreated = true;\n        }\n\n        options = options || _this.options.containers || {};\n\n        for (const contName in options) {\n            if (options[contName].on !== undefined) {\n                options[contName].on = MapSVG.parseBoolean(options[contName].on);\n            }\n\n            if (options[contName].width) {\n                if (\n                    typeof options[contName].width != \"string\" ||\n                    (options[contName].width.indexOf(\"px\") === -1 &&\n                        options[contName].width.indexOf(\"%\") === -1 &&\n                        options[contName].width !== \"auto\")\n                ) {\n                    options[contName].width = options[contName].width + \"px\";\n                }\n                $(_this.containers[contName]).css({ \"flex-basis\": options[contName].width });\n            }\n            if (options[contName].height) {\n                if (\n                    typeof options[contName].height != \"string\" ||\n                    (options[contName].height.indexOf(\"px\") === -1 &&\n                        options[contName].height.indexOf(\"%\") === -1 &&\n                        options[contName].height !== \"auto\")\n                ) {\n                    options[contName].height = options[contName].height + \"px\";\n                }\n                $(_this.containers[contName]).css({\n                    \"flex-basis\": options[contName].height,\n                    height: options[contName].height,\n                });\n            }\n\n            $.extend(true, _this.options, { containers: options });\n\n            let on = _this.options.containers[contName].on;\n\n            if (\n                MapSVG.isPhone &&\n                _this.options.menu.hideOnMobile &&\n                _this.options.menu.location === contName &&\n                [\"leftSidebar\", \"rightSidebar\"].indexOf(contName) !== -1\n            ) {\n                on = false;\n            } else if (\n                MapSVG.isPhone &&\n                _this.options.menu.location === \"custom\" &&\n                [\"leftSidebar\", \"rightSidebar\"].indexOf(contName) !== -1\n            ) {\n                // hide sidebars on mobiles if there's no directory in there because filters are always moved to header (or custom) on mobiles\n                on = false;\n                $(_this.containers.wrapAll).addClass(\"mapsvg-hide-map-list-buttons\");\n            } else if (\n                MapSVG.isPhone &&\n                !_this.options.menu.hideOnMobile &&\n                _this.options.menu.location === contName &&\n                [\"leftSidebar\", \"rightSidebar\"].indexOf(contName) !== -1\n            ) {\n                $(_this.containers.wrapAll).addClass(\"mapsvg-hide-map-list-buttons\");\n                $(_this.containers.wrapAll).addClass(\"mapsvg-directory-visible\");\n            }\n            $(_this.containers[contName]).toggle(on);\n        }\n\n        _this.setDetailsView();\n    }\n    /**\n     * Checks if container should be scrollable\n     * @param {string} container - mapContainer / leftSidebar / rightSidebar / custom / header / footer\n     * @returns {boolean}\n     * @private\n     */\n    shouldBeScrollable(container) {\n        const _this = this;\n\n        switch (container) {\n            case \"map\":\n            case \"leftSidebar\":\n            case \"rightSidebar\":\n                return true;\n                break;\n            case \"custom\":\n                return false;\n                break;\n            case \"header\":\n            case \"footer\":\n                if (\n                    _this.options.containers[container].height &&\n                    _this.options.containers[container].height !== \"auto\" &&\n                    _this.options.containers[container].height !== \"100%\"\n                ) {\n                    return true;\n                } else {\n                    return false;\n                }\n                break;\n            default:\n                return false;\n                break;\n        }\n    }\n    /**\n     * Sets directory options.\n     * @alias setMenu\n     * @param {object} options\n     * @returns {*|void}\n     *\n     * @example\n     * mapsvg.setDirectory({\n     *   on: true,\n     *   container: \"leftSidebar\"\n     * });\n     */\n    setDirectory(options) {\n        return this.setMenu(options);\n    }\n    /**\n     * Sets menu (directory) options\n     * @param options\n     * @private\n     */\n    setMenu(options?: { [key: string]: any }) {\n        const _this = this;\n\n        options = options || this.options.menu;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        options.search != undefined && (options.search = MapSVG.parseBoolean(options.search));\n        options.showMapOnClick != undefined &&\n            (options.showMapOnClick = MapSVG.parseBoolean(options.showMapOnClick));\n        options.searchFallback != undefined &&\n            (options.searchFallback = MapSVG.parseBoolean(options.searchFallback));\n        options.customContainer != undefined &&\n            (options.customContainer = MapSVG.parseBoolean(options.customContainer));\n\n        $.extend(true, this.options, { menu: options });\n\n        this.controllers = this.controllers || {};\n\n        if (!this.containers.directory) {\n            this.containers.directory = $('<div class=\"mapsvg-directory\"></div>')[0];\n        }\n\n        // If directory will be scrollable make it absolutely positioned, fill the parent container.\n        $(this.containers.directory).toggleClass(\n            \"flex\",\n            this.shouldBeScrollable(this.options.menu.location)\n        );\n\n        if (this.options.menu.on) {\n            if (!this.controllers.directory) {\n                this.controllers.directory = new DirectoryController({\n                    container: this.containers.directory,\n                    template: this.options.templates.directory,\n                    mapsvg: this,\n                    repository:\n                        this.options.menu.source === \"regions\"\n                            ? this.regionsRepository\n                            : this.objectsRepository,\n                    scrollable: this.shouldBeScrollable(this.options.menu.location), //this.options.menu.location === 'leftSidebar' || this.options.menu.location === 'rightSidebar',\n                    // position: this.options.menu.position,\n                    // search: this.options.menu.search,\n                    events: {\n                        click: (e, regionOrObject, mapsvg) => {\n                            this.events.trigger(\"click.directoryItem\", this, [\n                                e,\n                                regionOrObject,\n                                mapsvg,\n                            ]);\n                        },\n                        mouseover: (e, regionOrObject, mapsvg) => {\n                            this.events.trigger(\"mouseover.directoryItem\", this, [\n                                e,\n                                regionOrObject,\n                                mapsvg,\n                            ]);\n                        },\n                        mouseout: (e, regionOrObject, mapsvg) => {\n                            this.events.trigger(\"mouseout.directoryItem\", this, [\n                                e,\n                                regionOrObject,\n                                mapsvg,\n                            ]);\n                        },\n                    },\n                });\n                this.controllers.directory._init();\n            }\n            if (options.source) {\n                this.controllers.directory.repository =\n                    this.options.menu.source === \"regions\"\n                        ? this.regionsRepository\n                        : this.objectsRepository;\n            }\n            if (options.sortBy || options.sortDirection) {\n                this.controllers.directory.repository.query.update({\n                    sort: [\n                        {\n                            field: this.options.menu.sortBy,\n                            order: this.options.menu.sortDirection,\n                        },\n                    ],\n                });\n            }\n\n            this.setFilterOut();\n\n            if (options.location) {\n                this.controllers.directory.scrollable = this.shouldBeScrollable(\n                    this.options.menu.location\n                );\n            }\n\n            let $container;\n            if (MapSVG.isPhone && this.options.menu.hideOnMobile) {\n                $container = $(this.containers.leftSidebar);\n            } else {\n                $container =\n                    this.options.menu.location !== \"custom\"\n                        ? $(this.containers[this.options.menu.location])\n                        : $(\"#\" + this.options.menu.containerId);\n            }\n            $container.append(this.containers.directory);\n\n            if (this.options.colors.directory) {\n                $(this.containers.directory).css({\n                    \"background-color\": this.options.colors.directory,\n                });\n            }\n            this.setFilters();\n            this.setTemplates({ directoryItem: this.options.templates.directoryItem });\n            if (\n                (this.options.menu.source === \"regions\" && this.regionsRepository.loaded) ||\n                (this.options.menu.source === \"database\" && this.objectsRepository.loaded)\n            ) {\n                if (\n                    this.editMode &&\n                    (options.sortBy || options.sortDirection || options.filterout)\n                ) {\n                    this.controllers.directory.repository.reload();\n                }\n                this.loadDirectory();\n            }\n        } else {\n            this.controllers.directory && this.controllers.directory.destroy();\n            this.controllers.directory = null;\n        }\n    }\n    /**\n     * Sets database options.\n     * @param {object} options\n     * @example\n     * mapsvg.setDatabase({\n     *   pagination: {on: true, perpage: 30}\n     * });\n     */\n    setDatabase(options) {\n        options = options || this.options.database;\n\n        if (options.pagination) {\n            if (options.pagination.on != undefined) {\n                options.pagination.on = MapSVG.parseBoolean(options.pagination.on);\n            }\n            if (options.pagination.perpage != undefined) {\n                options.pagination.perpage = parseInt(options.pagination.perpage);\n            }\n        }\n        $.extend(true, this.options, { database: options });\n        if (options.pagination) {\n            if (options.pagination.on !== undefined || options.pagination.perpage) {\n                const query = new Query({\n                    perpage: this.options.database.pagination.on\n                        ? this.options.database.pagination.perpage\n                        : 0,\n                });\n\n                this.objectsRepository.find(query);\n            } else {\n                this.setPagination();\n            }\n        }\n    }\n    updateGoogleMapsMaxZoom(geoPoint: GeoPoint): void {\n        this.googleMaps.maxZoomService.getMaxZoomAtLatLng(\n            geoPoint,\n            (result: google.maps.MaxZoomResult) => {\n                if (result.status === \"OK\") {\n                    this.googleMaps.currentMaxZoom = result.zoom;\n                }\n            }\n        );\n    }\n    /**\n     * Sets Google Map options.\n     * @param {object} options\n     * @example\n     * mapsvg.setGoogleMaps({\n     *   on: true,\n     *   type: \"terrain\"\n     * });\n     *\n     * // Get Google Maps instance:\n     * var gm = mapsvg.googleMaps.map;\n     */\n    setGoogleMaps(options?: any) {\n        options = options || this.options.googleMaps;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n\n        if (!this.googleMaps) {\n            this.googleMaps = { loaded: false, initialized: false, map: null, overlay: null };\n        }\n\n        $.extend(true, this.options, { googleMaps: options });\n\n        if (this.options.googleMaps.on) {\n            $(this.containers.map).toggleClass(\"mapsvg-with-google-map\", true);\n            if (!MapSVG.googleMapsApiLoaded) {\n                this.loadGoogleMapsAPI(\n                    () => {\n                        this.setGoogleMaps();\n                    },\n                    () => {\n                        this.setGoogleMaps({ on: false });\n                    }\n                );\n            } else {\n                if (!this.googleMaps.map) {\n                    this.containers.googleMaps = $(\n                        '<div class=\"mapsvg-layer mapsvg-layer-gm\" id=\"mapsvg-google-maps-' +\n                            this.id +\n                            '\"></div>'\n                    ).prependTo(this.containers.map)[0];\n                    $(this.containers.googleMaps).css({\n                        position: \"absolute\",\n                        top: 0,\n                        left: 0,\n                        bottom: 0,\n                        right: 0,\n                        \"z-index\": \"0\",\n                    });\n                    this.googleMaps.map = new google.maps.Map(this.containers.googleMaps, {\n                        mapTypeId: options.type,\n                        fullscreenControl: false,\n                        keyboardShortcuts: false,\n                        mapTypeControl: false,\n                        scaleControl: false,\n                        scrollwheel: false,\n                        streetViewControl: false,\n                        zoomControl: false,\n                        styles: options.styleJSON,\n                        tilt: 0,\n                    });\n                    let overlay;\n\n                    const southWest = new google.maps.LatLng(\n                        this.geoViewBox.sw.lat,\n                        this.geoViewBox.sw.lng\n                    );\n                    const northEast = new google.maps.LatLng(\n                        this.geoViewBox.ne.lat,\n                        this.geoViewBox.ne.lng\n                    );\n                    const bounds = new google.maps.LatLngBounds(southWest, northEast);\n\n                    this.googleMaps.overlay = this.createGoogleMapOverlay(\n                        bounds,\n                        this.googleMaps.map\n                    );\n\n                    let needToSetZoomLevels = false;\n\n                    if (!this.options.googleMaps.center || !this.options.googleMaps.zoom) {\n                        // var southWest = new google.maps.LatLng(this.geoViewBox.bottomLat, this.geoViewBox.leftLon);\n                        // var northEast = new google.maps.LatLng(this.geoViewBox.topLat, this.geoViewBox.rightLon);\n                        // var bounds = new google.maps.LatLngBounds(southWest,northEast);\n                        this.googleMaps.map.fitBounds(bounds, 0);\n                        needToSetZoomLevels = true;\n                    } else {\n                        this.googleMaps.map.setZoom(this.options.googleMaps.zoom);\n                        // this.options.googleMaps.center.lat = parseFloat(this.options.googleMaps.center.lat);\n                        // this.options.googleMaps.center.lng = parseFloat(this.options.googleMaps.center.lng);\n                        this.googleMaps.map.setCenter(this.options.googleMaps.center);\n                    }\n                    this.googleMaps.initialized = true;\n                    this.googleMaps.maxZoomService = new google.maps.MaxZoomService();\n\n                    this.googleMaps.map.addListener(\"idle\", () => {\n                        this.isZooming = false;\n                    });\n                    google.maps.event.addListenerOnce(this.googleMaps.map, \"idle\", () => {\n                        setTimeout(() => {\n                            $(this.containers.map).addClass(\"mapsvg-fade-in\");\n                            setTimeout(() => {\n                                $(this.containers.map).removeClass(\"mapsvg-google-map-loading\");\n                                $(this.containers.map).removeClass(\"mapsvg-fade-in\");\n                                // this.googleMaps.overlay.draw();\n                                if (\n                                    !this.options.googleMaps.center ||\n                                    !this.options.googleMaps.zoom\n                                ) {\n                                    this.options.googleMaps.center = this.googleMaps.map\n                                        .getCenter()\n                                        .toJSON();\n                                    this.options.googleMaps.zoom = this.googleMaps.map.getZoom();\n                                }\n                                this.zoomDelta = this.options.googleMaps.zoom - this.zoomLevel;\n                                this.updateGoogleMapsMaxZoom(this.options.googleMaps.center);\n                                // if (needToSetZoomLevels) {\n                                this.setInitialViewBox(this.viewBox);\n                                this.toggleSvgLayerOnZoom();\n                                // }\n                                this.events.trigger(\"googleMapsLoaded\");\n                                this.afterLoadBlockers--;\n                                this.finalizeMapLoading();\n                            }, 300);\n                        }, 1);\n                    });\n                    this.events.on(\"googleMapsBoundsChanged\", (bounds) => {\n                        this.setViewBoxByGoogleMapsOverlay();\n                    });\n                } else {\n                    $(this.containers.map).toggleClass(\"mapsvg-with-google-map\", true);\n                    $(this.containers.googleMaps) && $(this.containers.googleMaps).show();\n                    if (options.type) {\n                        this.googleMaps.map.setMapTypeId(options.type);\n                    }\n                    this.setViewBoxByGoogleMapsOverlay();\n                }\n            }\n        } else {\n            // TODO: destroy google maps\n            $(this.containers.map).toggleClass(\"mapsvg-with-google-map\", false);\n            $(this.containers.googleMaps) && $(this.containers.googleMaps).hide();\n            this.googleMaps.initialized = false;\n        }\n        if (this.converter) {\n            this.converter.setWorldShift(this.options.googleMaps.on);\n        }\n    }\n    createGoogleMapOverlay(bounds, map) {\n        class GoogleMapsOverlay extends google.maps.OverlayView {\n            bounds_: google.maps.LatLngBounds;\n            map_: google.maps.Map;\n            prevCoords: {\n                sw: { x: number; y: number };\n                sw2: { x: number; y: number };\n                ne: { x: number; y: number };\n                ne2: { x: number; y: number };\n            };\n            element: HTMLElement;\n            mapsvg: MapSVGMap;\n\n            constructor(bounds, googleMapInstance, mapsvg: MapSVGMap) {\n                super();\n                // Initialize all properties.\n                this.bounds_ = bounds;\n                this.map_ = googleMapInstance;\n                this.mapsvg = mapsvg;\n                this.setMap(googleMapInstance);\n                this.prevCoords = {\n                    sw: { x: 0, y: 0 },\n                    sw2: { x: 0, y: 0 },\n                    ne: { x: 0, y: 0 },\n                    ne2: { x: 0, y: 0 },\n                };\n            }\n\n            draw(): void {\n                this.mapsvg.events.trigger(\"googleMapsBoundsChanged\", this.map_, [\n                    this.getPixelBounds(),\n                    this.map_,\n                ]);\n            }\n\n            onAdd(): void {\n                this.element = document.createElement(\"div\");\n                this.element.style.borderStyle = \"none\";\n                this.element.style.borderWidth = \"0px\";\n                this.element.style.position = \"absolute\";\n\n                // Add the element to the \"overlayLayer\" pane.\n                const panes = this.getPanes();\n                panes.overlayLayer.appendChild(this.element);\n            }\n\n            getPixelBounds(): { sw: google.maps.Point; ne: google.maps.Point } {\n                const overlayProjection = this.getProjection();\n                if (!overlayProjection) return;\n\n                const geoSW = this.bounds_.getSouthWest();\n                const geoNE = this.bounds_.getNorthEast();\n\n                const coords = {\n                    sw: overlayProjection.fromLatLngToDivPixel(geoSW),\n                    ne: overlayProjection.fromLatLngToDivPixel(geoNE),\n                    sw2: overlayProjection.fromLatLngToContainerPixel(geoSW),\n                    ne2: overlayProjection.fromLatLngToContainerPixel(geoNE),\n                };\n\n                // check if map on border between 180/-180 longitude\n                // if(ne.x < sw.x){\n                //     sw.x = sw.x - overlayProjection.getWorldWidth();\n                // }\n                // console.log('NOW sw:'+sw.x+' and ne:'+ne.x+'and W-width:'+overlayProjection.getWorldWidth());\n\n                // if(ne2.x < sw2.x){\n                //     sw2.x = sw2.x - overlayProjection.getWorldWidth();\n                // }\n\n                const ww = overlayProjection.getWorldWidth();\n\n                if (this.prevCoords.sw) {\n                    if (coords.ne.x < coords.sw.x) {\n                        if (\n                            Math.abs(this.prevCoords.sw.x - coords.sw.x) >\n                            Math.abs(this.prevCoords.ne.x - coords.ne.x)\n                        ) {\n                            coords.sw.x = coords.sw.x - ww;\n                        } else {\n                            coords.ne.x = coords.ne.x + ww;\n                        }\n                        if (\n                            Math.abs(this.prevCoords.sw2.x - coords.sw2.x) >\n                            Math.abs(this.prevCoords.ne2.x - coords.ne2.x)\n                        ) {\n                            coords.sw2.x = coords.sw2.x - ww;\n                        } else {\n                            coords.ne2.x = coords.ne2.x + ww;\n                        }\n                    }\n                }\n\n                this.prevCoords = coords;\n\n                // div.style.background = 'rgba(255,0,0,.5)';\n                // div.style.left   = coords.sw.x + 'px';\n                // div.style.top    = coords.ne.y + 'px';\n                // div.style.width  = (coords.ne.x - coords.sw.x) + 'px';\n                // div.style.height = (coords.sw.y - coords.ne.y) + 'px';\n\n                return { sw: coords.sw2, ne: coords.ne2 };\n            }\n        }\n        return new GoogleMapsOverlay(bounds, map, this);\n    }\n    /**\n     * Loads Google Maps API (js file)\n     * @param {function} callback - called on file load\n     * @param fail\n     * @private\n     */\n    loadGoogleMapsAPI(callback: () => void, fail: () => void): void {\n        if (!this.options.googleMaps.apiKey) {\n            console.error(\"MapSVG: can't load Google API because no API key has been provided\");\n            return;\n        }\n        if (window.google !== undefined && google.maps) {\n            MapSVG.googleMapsApiLoaded = true;\n        }\n\n        if (MapSVG.googleMapsApiLoaded) {\n            if (typeof callback == \"function\") {\n                callback();\n            }\n            return;\n        }\n\n        MapSVG.googleMapsLoadCallbacks = MapSVG.googleMapsLoadCallbacks || [];\n        if (typeof callback == \"function\") {\n            MapSVG.googleMapsLoadCallbacks.push(callback);\n        }\n\n        if (MapSVG.googleMapsApiIsLoading) {\n            return;\n        }\n        MapSVG.googleMapsApiIsLoading = true;\n\n        // @ts-ignore\n        window.gm_authFailure = () => {\n            if (MapSVG.GoogleMapBadApiKey) {\n                MapSVG.GoogleMapBadApiKey();\n            } else {\n                if (this.editMode) {\n                    alert(\"Google maps API key is incorrect.\");\n                } else {\n                    console.error(\"MapSVG: Google maps API key is incorrect.\");\n                }\n            }\n        };\n        this.googleMapsScript = document.createElement(\"script\");\n        this.googleMapsScript.onload = () => {\n            MapSVG.googleMapsApiLoaded = true;\n            MapSVG.googleMapsLoadCallbacks.forEach((_callback) => {\n                if (typeof callback == \"function\") _callback();\n            });\n        };\n        const gmLibraries = [];\n        if (this.options.googleMaps.drawingTools) {\n            gmLibraries.push(\"drawing\");\n        }\n        if (this.options.googleMaps.geometry) {\n            gmLibraries.push(\"geometry\");\n        }\n        let libraries = \"\";\n        if (gmLibraries.length > 0) {\n            libraries = \"&libraries=\" + gmLibraries.join(\",\");\n        }\n        this.googleMapsScript.src =\n            \"https://maps.googleapis.com/maps/api/js?language=\" +\n            this.options.googleMaps.language +\n            \"&key=\" +\n            this.options.googleMaps.apiKey +\n            libraries;\n\n        document.head.appendChild(this.googleMapsScript);\n    }\n    /**\n     * Loads Details View for an object (Region or DB Object)\n     * @param {Region|object} obj\n     *\n     * @example\n     * var region = mapsvg.getRegion(\"US-TX\");\n     * mapsvg.loadDetailsView(region);\n     *\n     * var object = mapsvg.database.getLoadedObject(12);\n     * mapsvg.loadDetailsView(object);\n     */\n    loadDetailsView(obj: Region | CustomObject): void {\n        this.controllers.popover && this.controllers.popover.close();\n        if (this.controllers.detailsView) this.controllers.detailsView.destroy();\n\n        this.controllers.detailsView = new DetailsController({\n            // color: this.options.colors.detailsView,\n            autoresize:\n                MapSVG.isPhone &&\n                this.options.detailsView.mobileFullscreen &&\n                this.options.detailsView.location !== \"custom\"\n                    ? false\n                    : this.options.detailsView.autoresize,\n            container: this.containers.detailsView,\n            template:\n                obj instanceof Region\n                    ? this.options.templates.detailsViewRegion\n                    : this.options.templates.detailsView,\n            mapsvg: this,\n            data: obj.getData(),\n            modal:\n                MapSVG.isPhone &&\n                this.options.detailsView.mobileFullscreen &&\n                this.options.detailsView.location !== \"custom\",\n            scrollable:\n                (MapSVG.isPhone &&\n                    this.options.detailsView.mobileFullscreen &&\n                    this.options.detailsView.location !== \"custom\") ||\n                this.shouldBeScrollable(this.options.detailsView.location), //['custom','header','footer'].indexOf(this.options.detailsView.location) === -1,\n            withToolbar:\n                !(\n                    MapSVG.isPhone &&\n                    this.options.detailsView.mobileFullscreen &&\n                    this.options.detailsView.location !== \"custom\"\n                ) && this.shouldBeScrollable(this.options.detailsView.location), //['custom','header','footer'].indexOf(this.options.detailsView.location) === -1,\n            // width: this.options.detailsView.width,\n            events: {\n                shown: (detailsController: DetailsController) => {\n                    this.events.trigger(\"shown.detailsView\", this, [this, detailsController]);\n                    $(window).trigger(\"shown.detailsView\", [this, detailsController]);\n                },\n                closed: (detailsController: DetailsController) => {\n                    this.deselectAllRegions();\n                    this.deselectAllMarkers();\n                    this.controllers &&\n                        this.controllers.directory &&\n                        this.controllers.directory.deselectItems();\n                    this.events.trigger(\"closed.detailsView\", [this, detailsController]);\n                },\n            },\n        });\n        this.controllers.detailsView._init();\n    }\n    /**\n     * Loads modal window with filters\n     * @private\n     */\n    loadFiltersModal(): void {\n        if (this.options.filters.modalLocation != \"custom\") {\n            if (!this.containers.filtersModal) {\n                this.containers.filtersModal = $(\n                    '<div class=\"mapsvg-details-container mapsvg-filters-wrap\"></div>'\n                )[0];\n            }\n            this.setColors();\n            $(this.containers.filtersModal).css({ width: this.options.filters.width });\n            if (MapSVG.isPhone) {\n                $(\"body\").append($(this.containers.filtersModal));\n                $(this.containers.filtersModal).css({ width: \"\" });\n            } else {\n                $(this.containers[this.options.filters.modalLocation]).append(\n                    $(this.containers.filtersModal)\n                );\n            }\n        } else {\n            this.containers.filtersModal = $(\"#\" + this.options.filters.containerId)[0];\n            $(this.containers.filtersModal).css({ width: \"\" });\n        }\n\n        this.loadFiltersController(this.containers.filtersModal, true);\n    }\n    /**\n     * Loads filters controller into a provided container\n     * @param {HTMLElement} container - Container, jQuery object\n     * @param {boolean} modal - If filter should be in a modal window\n     */\n    loadFiltersController(container: HTMLElement, modal = false): void {\n        if (!this.filtersShouldBeShown()) {\n            return;\n        }\n\n        let filtersInDirectory: boolean, filtersHide: boolean;\n\n        if (MapSVG.isPhone) {\n            filtersInDirectory = true;\n            filtersHide = this.options.filters.hideOnMobile; //this.filtersSchema.schema.length > 2;\n        } else {\n            filtersInDirectory =\n                this.options.menu.on &&\n                this.controllers.directory &&\n                this.options.menu.location === this.options.filters.location;\n            filtersHide = this.options.filters.hide;\n        }\n        const scrollable =\n            modal ||\n            (!filtersInDirectory &&\n                [\"leftSidebar\", \"rightSidebar\"].indexOf(this.options.filters.location) !== -1);\n\n        this.filtersRepository =\n            this.options.filters.source === \"regions\"\n                ? this.regionsRepository\n                : this.objectsRepository;\n\n        if (this.options.filters.searchButton) {\n            this.changedFields = null;\n            this.changedSearch = null;\n        } else {\n            this.changedSearch = () => {\n                this.filtersRepository.query.searchFallback = this.filtersSchema.getFieldByType(\n                    \"search\"\n                ).searchFallback;\n                this.throttle(this.filtersRepository.reload, 400, this.filtersRepository);\n            };\n            this.changedFields = () => {\n                this.throttle(this.filtersRepository.reload, 400, this.filtersRepository);\n            };\n        }\n\n        this.controllers.filters = new FiltersController({\n            container: container,\n            query: this.filtersRepository.query,\n            mapsvg: this,\n            schema: this.filtersSchema,\n            template: '<div class=\"mapsvg-filters-container\"></div>',\n            scrollable: scrollable,\n            modal: modal,\n            withToolbar: MapSVG.isPhone ? false : modal,\n            width: $(container).hasClass(\"mapsvg-map-container\")\n                ? this.options.filters.width\n                : \"100%\",\n            hide: this.options.filters.hide,\n            hideOnMobile: this.options.filters.hideOnMobile,\n            showButtonText: this.options.filters.showButtonText,\n            clearButton: this.options.filters.clearButton,\n            clearButtonText: this.options.filters.clearButtonText,\n            searchButton: this.options.filters.searchButton,\n            searchButtonText: this.options.filters.searchButtonText,\n            padding: this.options.filters.padding,\n            events: {\n                cleared: () => {\n                    this.deselectAllRegions();\n                    this.filtersRepository.reload();\n                },\n                \"changed.fields\": this.changedFields,\n\n                \"changed.search\": this.changedSearch,\n\n                \"click.btn.searchButton\": () => {\n                    this.filtersRepository.reload();\n                },\n                loaded: () => {\n                    // TODO add resize sensor to directory instead of this:\n                    this.controllers.directory && this.controllers.directory.updateTopShift();\n                    this.afterLoadBlockers--;\n                    this.finalizeMapLoading();\n                },\n                \"click.btn.showFilters\": () => {\n                    this.loadFiltersModal();\n                },\n            },\n        });\n        this.controllers.filters._init();\n    }\n\n    private filtersShouldBeShown() {\n        return (\n            this.options.filters.on &&\n            this.options.filtersSchema &&\n            this.options.filtersSchema.length > 0\n        );\n    }\n\n    /**\n     * Event handler for text search input\n     * @param {string} text\n     * @param {boolean} fallback\n     * @private\n     */\n    textSearch(text: string, fallback = false): void {\n        const query = new Query({\n            filters: { search: text },\n            searchFallback: fallback,\n        });\n\n        this.filtersRepository.find(query);\n    }\n    /**\n     * Finds a Region by ID\n     * @param {string} id - Region ID\n     * @returns {Region}\n\n     * @example\n     * var region = mapsvg.getRegion(\"US-TX\");\n     */\n    getRegion(id: string): Region {\n        return this.regions.findById(id);\n    }\n    /**\n     * Returns all Regions\n     * @returns {Region[]}\n     */\n    getRegions(): ArrayIndexed<Region> {\n        return this.regions;\n    }\n    /**\n     * Finds a Marker by ID\n     * @param {string} id - Marker ID\n     * @returns {Marker}\n\n     * @example\n     * var marker = mapsvg.getMarker(\"marker_12\");\n     */\n    getMarker(id: string): Marker {\n        return this.markers.findById(id);\n    }\n    /**\n     * Checks if IDs is unique\n     * @param id\n     * @returns {bool|string} - true if ID is available, {error: \"error text\"} if not.\n     * @private\n     */\n    checkId(id: string): { canUse: boolean; error: string } {\n        if (this.getRegion(id))\n            return { canUse: false, error: \"This ID is already being used by a Region\" };\n        else if (this.getMarker(id))\n            return { canUse: false, error: \"This ID is already being used by another Marker\" };\n        else return { canUse: true, error: \"\" };\n    }\n    /**\n     * Redraws colors of regions.\n     * Used when Region statuses are loaded from the database or when choropleth map is enabled.\n     */\n    regionsRedrawColors(): void {\n        this.regions.forEach((region: Region) => {\n            region.setFill();\n        });\n    }\n    /**\n     * Redraws choropleth bubbles.\n     */\n    redrawBubbles(): void {\n        $(this.containers.map).removeClass(\"bubbles-regions-on bubbles-database-on\");\n\n        if (this.options.choropleth.on && this.options.choropleth.bubbleMode) {\n            $(this.containers.map).addClass(\"bubbles-\" + this.options.choropleth.source + \"-on\");\n        }\n\n        this.regions.forEach(function (region) {\n            region.drawBubble();\n        });\n\n        const markersBubbleMode =\n            this.options.choropleth.on &&\n            this.options.choropleth.source == \"database\" &&\n            this.options.choropleth.bubbleMode;\n        this.markers.forEach(function (marker) {\n            marker.setBubbleMode(markersBubbleMode);\n        });\n    }\n    /**\n     * Destroys the map and all related containers.\n     * @returns {Map}\n     */\n    destroy(): void {\n        if (this.controllers && this.controllers.directory) {\n            this.controllers.directory.mobileButtons.remove();\n        }\n        $(this.containers.map)\n            .empty()\n            .insertBefore($(this.containers.wrapAll))\n            .attr(\"style\", \"\")\n            .removeClass(\"mapsvg mapsvg-responsive\");\n\n        this.controllers.popover && this.controllers.popover.close();\n\n        if (this.controllers.detailsView) this.controllers.detailsView.destroy();\n\n        $(this.containers.detailsView).remove();\n        $(this.containers.popover).remove();\n        $(this.containers.tooltip).remove();\n\n        $(this.containers.wrapAll).remove();\n    }\n    /**\n     * Was used previously to return _data that contained all map properties.\n     * Now properties are stored in the map instance itself.\n     * @returns {Map}\n     */\n    getData(): { id: number; title: string; options: { [key: string]: any } } {\n        return {\n            id: this.id,\n            title: this.options.title,\n            options: this.getOptions(false, false),\n        };\n    }\n    /**\n     * Checks if fitmarkers() action can be performed and does it\n     * @private\n     */\n    mayBeFitMarkers(): void {\n        if (!this.lastTimeFitWas) {\n            this.lastTimeFitWas = Date.now() - 99999;\n        }\n\n        this.fitDelta = Date.now() - this.lastTimeFitWas;\n\n        if (\n            this.fitDelta > 1000 &&\n            !this.firstDataLoad &&\n            !this.fitOnDataLoadDone &&\n            this.options.fitMarkers\n        ) {\n            this.fitMarkers();\n            this.fitOnDataLoadDone = true;\n        }\n        if (\n            this.firstDataLoad &&\n            (this.options.fitMarkersOnStart ||\n                (this.options.fitMarkers && this.options.database.loadOnStart === false))\n        ) {\n            this.firstDataLoad = false;\n            if (this.options.googleMaps.on && !this.googleMaps.map) {\n                this.events.on(\"googleMapsLoaded\", () => {\n                    this.fitMarkers();\n                });\n            } else {\n                this.fitMarkers();\n            }\n        }\n\n        this.lastTimeFitWas = Date.now();\n    }\n    /**\n     * Changes maps viewBox to fit loaded markers.\n     */\n    fitMarkers(): void {\n        const dbObjects = this.objectsRepository.getLoaded();\n\n        if (!dbObjects || dbObjects.length === 0) {\n            return;\n        }\n\n        if (this.options.googleMaps.on && typeof google !== \"undefined\") {\n            const lats = [];\n            const lngs = [];\n\n            if (dbObjects.length > 1) {\n                dbObjects.forEach((object) => {\n                    if (object.location && object.location.geoPoint) {\n                        lats.push(object.location.geoPoint.lat);\n                        lngs.push(object.location.geoPoint.lng);\n                    }\n                });\n\n                // calc the min and max lng and lat\n                const minlat = Math.min.apply(null, lats),\n                    maxlat = Math.max.apply(null, lats);\n                const minlng = Math.min.apply(null, lngs),\n                    maxlng = Math.max.apply(null, lngs);\n\n                const bbox = new google.maps.LatLngBounds(\n                    { lat: minlat, lng: minlng },\n                    { lat: maxlat, lng: maxlng }\n                );\n                this.googleMaps.map.fitBounds(bbox, 0);\n            } else {\n                if (\n                    dbObjects[0].location &&\n                    dbObjects[0].location.geoPoint.lat &&\n                    dbObjects[0].location.geoPoint.lng\n                ) {\n                    const coords = {\n                        lat: dbObjects[0].location.geoPoint.lat,\n                        lng: dbObjects[0].location.geoPoint.lng,\n                    };\n                    if (this.googleMaps.map) {\n                        this.googleMaps.map.setCenter(coords);\n                        this.googleMaps.map.setZoom(this.options.fitSingleMarkerZoom);\n                    }\n                }\n            }\n        } else {\n            if (this.options.clustering.on) {\n                const arr = [];\n                this.markersClusters.forEach((c) => {\n                    arr.push(c);\n                });\n                this.markers.forEach((m) => {\n                    arr.push(m);\n                });\n                this.zoomTo(arr);\n                return;\n            } else {\n                this.zoomTo(this.markers);\n                return;\n            }\n        }\n    }\n\n    setFitSingleMarkerZoom(zoom) {\n        this.options.fitSingleMarkerZoom = parseInt(zoom);\n    }\n    /**\n     * Shows user current location\n     * Works only under HTTPS connection\n     * @returns {boolean|object} - \"false\" if geolocation is unavailable, or {lat: float, lng: float} if it's available\n     */\n    showUserLocation(callback: (location: Location) => void): void {\n        this.getUserLocation((geoPoint: GeoPoint) => {\n            this.userLocation = null;\n            this.userLocation = new Location({\n                geoPoint: geoPoint,\n                img: MapSVG.urls.root + \"/markers/user-location.svg\",\n            });\n            this.userLocationMarker && this.userLocationMarker.delete();\n            this.userLocationMarker = new Marker({\n                location: this.userLocation,\n                mapsvg: this,\n                width: 15,\n                height: 15,\n            });\n            $(this.userLocationMarker.element).addClass(\"mapsvg-user-location\");\n            this.userLocationMarker.centered = true;\n            this.getLayer(\"markers\").append(this.userLocationMarker.element);\n            this.userLocationMarker.adjustScreenPosition();\n            callback && callback(this.userLocation);\n        });\n    }\n    /**\n     * Gets user's current location by using browser's HTML5 geolocation feature.\n     * Works only under HTTPS connection!\n     * @returns {boolean|object} - \"false\" if geolocation is unavailable, or {lat: float, lng: float} if it's available\n     */\n    getUserLocation(callback: (coordinates: GeoPoint) => void): boolean {\n        if (navigator.geolocation) {\n            navigator.geolocation.getCurrentPosition(function (position) {\n                const pos = new GeoPoint(position.coords.latitude, position.coords.longitude);\n                callback && callback(pos);\n            });\n        } else {\n            return false;\n        }\n    }\n    /**\n     * Returns current SVG scale related to screen - map screen pixels to SVG points ratio.\n     * Example: if SVG current viewBox width is 600 and the map is shown in a 300px container,\n     * the map scale is 0.5 (300/600 = 0.5)\n     * @returns {number}\n     */\n    getScale(): number {\n        const scale2 = this.containers.map.clientWidth / this.viewBox.width;\n        return scale2 || 1;\n    }\n\n    /**\n     * Returns current viewBox\n     * @returns {array} - [x,y,width,height]\n     */\n    getViewBox(): ViewBox {\n        return this.viewBox;\n    }\n    /**\n     * Sets map container size and viewBox size.\n     * This method should be used when you need to change both map container size and viewBox size.\n     * @param {number} width\n     * @param {number} height\n     * @returns {Array} - viewBox, [x,y,width,height]\n     */\n    viewBoxSetBySize(width: number, height: number): ViewBox {\n        this.setSize(width, height);\n        this._viewBox.update(this.viewBoxGetBySize(width, height));\n        this.setViewBox(this._viewBox);\n        $(window).trigger(\"resize\");\n        this.setSize(width, height);\n        this.setZoomLevels();\n\n        return this.viewBox;\n    }\n    /**\n     * Returns viewBox for a provided width/height\n     * @param width\n     * @param height\n     * @returns {Array} - viewBox, [x,y,width,height]\n     * @private\n     */\n    viewBoxGetBySize(width: number, height: number): ViewBox {\n        const new_ratio = width / height;\n        const old_ratio = this.svgDefault.viewBox.width / this.svgDefault.viewBox.height;\n\n        const vb = this.svgDefault.viewBox.clone();\n\n        if (new_ratio != old_ratio) {\n            if (new_ratio > old_ratio) {\n                vb.width = this.svgDefault.viewBox.height * new_ratio;\n                vb.x = this.svgDefault.viewBox.x - (vb.width - this.svgDefault.viewBox.width) / 2;\n            } else {\n                vb.height = this.svgDefault.viewBox.width / new_ratio;\n                vb.y = this.svgDefault.viewBox.y - (vb.height - this.svgDefault.viewBox.height) / 2;\n            }\n        }\n\n        return vb;\n    }\n    /**\n     * Resets map zoom and scroll to initial position.\n     * @param {bool} toInitial - Set to \"true\" if you want to reset to initial viewBox that was set by user;\n     * set to \"false\" to reset to original SVG viewBox as defined in the SVG file\n     * @returns {Array} - viewBox, [x,y,width,height]\n     */\n    viewBoxReset(toInitial: boolean): ViewBox {\n        if (this.options.googleMaps.on && this.googleMaps.map) {\n            if (!toInitial) {\n                this.options.googleMaps.center = null;\n                this.options.googleMaps.zoom = null;\n            }\n            if (!this.options.googleMaps.center || !this.options.googleMaps.zoom) {\n                const southWest = new google.maps.LatLng(\n                    this.geoViewBox.sw.lat,\n                    this.geoViewBox.sw.lng\n                );\n                const northEast = new google.maps.LatLng(\n                    this.geoViewBox.ne.lat,\n                    this.geoViewBox.ne.lng\n                );\n                const bounds = new google.maps.LatLngBounds(southWest, northEast);\n                this.googleMaps.map.fitBounds(bounds, 0);\n                this.options.googleMaps.center = this.googleMaps.map.getCenter().toJSON();\n                this.options.googleMaps.zoom = this.googleMaps.map.getZoom();\n            } else {\n                this.googleMaps.map.setZoom(this.options.googleMaps.zoom);\n                this.googleMaps.map.setCenter(this.options.googleMaps.center);\n            }\n        } else {\n            if (toInitial) {\n                const v = this._viewBox || this.svgDefault.viewBox;\n                this.zoomLevel = 0;\n                this._scale = 1;\n                this.setViewBox(v);\n            } else {\n                this.setViewBox();\n            }\n        }\n        return this.viewBox;\n    }\n\n    /**\n     * Returns geo-bounds of the map.\n     * @returns {number[]} - [leftLon, topLat, rightLon, bottomLat]\n     */\n    getGeoViewBox(): number[] {\n        const v = this.viewBox;\n        const p1 = new SVGPoint(v.x, v.y);\n        const p2 = new SVGPoint(v.x + v.width, v.y);\n        const p3 = new SVGPoint(v.x, v.y);\n        const p4 = new SVGPoint(v.x, v.y + v.height);\n\n        const leftLon = this.converter.convertSVGToGeo(p1).lng;\n        const rightLon = this.converter.convertSVGToGeo(p2).lng;\n        const topLat = this.converter.convertSVGToGeo(p3).lat;\n        const bottomLat = this.converter.convertSVGToGeo(p4).lat;\n\n        return [leftLon, topLat, rightLon, bottomLat];\n    }\n\n    private setStrokes() {\n        $(this.containers.svg)\n            .find(\"path, polygon, circle, ellipse, rect, line, polyline\")\n            .each((index, elem) => {\n                const width = MapObject.getComputedStyle(\"stroke-width\", elem);\n                if (width) {\n                    $(elem).attr(\"data-stroke-width\", width.replace(\"px\", \"\"));\n                }\n            });\n    }\n\n    /**\n     * Adjusts stroke thickness on zoom change\n     */\n    adjustStrokes(): void {\n        $(this.containers.svg)\n            .find(\"path, polygon, circle, ellipse, rect, line, polyline\")\n            .each((index, elem) => {\n                const width = elem.getAttribute(\"data-stroke-width\");\n                if (width) {\n                    $(elem).css(\"stroke-width\", Number(width) / this.scale);\n                }\n            });\n    }\n    /**\n     * Zooms-in the map\n     * @param {SVGPoint} center - if provided, zoom will shift the center point\n     */\n    zoomIn(center?: SVGPoint): void {\n        if (this.canZoom) {\n            this.isZooming = true;\n            this.canZoom = false;\n            setTimeout(() => {\n                this.isZooming = false;\n                this.canZoom = true;\n            }, 700);\n            this.zoom(1, center);\n        }\n    }\n    /**\n     * Zooms-out the map\n     * @param {SVGPoint} center - [x,y] center point (optional)\n     */\n    zoomOut(center?: SVGPoint): void {\n        if (this.canZoom) {\n            this.isZooming = true;\n            this.canZoom = false;\n            setTimeout(() => {\n                this.isZooming = false;\n                this.canZoom = true;\n            }, 700);\n            this.zoom(-1, center);\n        }\n    }\n    /**\n     * Zooms to Region, Marker or array of Markers.\n     * @param {String|Region|Marker|Marker[]|MarkersCluster[]} mapObjects - Region ID, Region, Marker, array of Markers, array of MarkerClusters\n     * @param {number} zoomToLevel - Zoom level\n     *\n     * @example\n     * var region = mapsvg.getRegion(\"US-TX\");\n     * mapsvg.zoomTo(region);\n     */\n    zoomTo(\n        mapObjects: Region | Marker | MarkerCluster | Marker[] | Region[] | MarkerCluster[],\n        zoomToLevel?: number\n    ): boolean {\n        // If a single object Marker | Region | Cluster is passed, convert it to array\n        if (mapObjects instanceof Marker || mapObjects instanceof MarkerCluster) {\n            return this.zoomToMarkerOrCluster(mapObjects, zoomToLevel);\n        } else {\n            const convertedObjects = !Array.isArray(mapObjects) ? [mapObjects] : mapObjects;\n            const bbox = this.getGroupBBox(convertedObjects);\n            return this.fitViewBox(bbox, zoomToLevel);\n        }\n    }\n\n    /**\n     * Zooms to a single marker or cluster\n     * @private\n     */\n    zoomToMarkerOrCluster(mapObject: Marker | MarkerCluster, zoomToLevel?: number): boolean {\n        this.zoomLevel = zoomToLevel || 1;\n        const foundZoomLevel = this.zoomLevels.get(this.zoomLevel);\n        if (!foundZoomLevel) {\n            return false;\n        }\n        const vb = foundZoomLevel.viewBox;\n\n        if (this.canZoom) {\n            this.isZooming = true;\n            this.canZoom = false;\n            setTimeout(() => {\n                this.isZooming = false;\n                this.canZoom = true;\n            }, 700);\n            const vbNew = new ViewBox(\n                mapObject.svgPoint.x - vb.width / 2,\n                mapObject.svgPoint.y - vb.height / 2,\n                vb.width,\n                vb.height\n            );\n            this.setViewBox(vbNew);\n            this._scale = foundZoomLevel._scale;\n            return true;\n        }\n\n        return false;\n    }\n\n    getGroupBBox(mapObjects: (Marker | Region | MarkerCluster)[]): ViewBox {\n        let _bbox, bbox;\n        const xmax: number[] = [];\n        const ymax: number[] = [];\n        const xmin: number[] = [];\n        const ymin: number[] = [];\n\n        for (let i = 0; i < mapObjects.length; i++) {\n            _bbox = mapObjects[i].getBBox();\n            xmin.push(_bbox.x);\n            ymin.push(_bbox.y);\n            const _w = _bbox.x + _bbox.width;\n            const _h = _bbox.y + _bbox.height;\n            xmax.push(_w);\n            ymax.push(_h);\n        }\n        const _xmin = Math.min(...xmin);\n        const _ymin = Math.min(...ymin);\n        const width = Math.max(...xmax) - _xmin;\n        const height = Math.max(...ymax) - _ymin;\n\n        let padding = 10;\n        const point1 = new ScreenPoint(padding, 0);\n        const point2 = new ScreenPoint(0, 0);\n        padding =\n            this.converter.convertPixelToSVG(point1).x - this.converter.convertPixelToSVG(point2).x;\n\n        return new ViewBox(\n            _xmin - padding,\n            _ymin - padding,\n            width + padding * 2,\n            height + padding * 2\n        );\n    }\n\n    fitViewBox(fitViewBox: ViewBox, forceZoomLevel: number): boolean {\n        let viewBoxPrev: ViewBox;\n        let foundZoomLevelNumber = 0;\n        let foundZoomLevel: { zoomLevel: number; viewBox: ViewBox; _scale: number };\n        let newViewBox: ViewBox;\n\n        this.zoomLevels.forEach((zoomLevel) => {\n            if (viewBoxPrev && viewBoxPrev.x !== undefined) {\n                if (\n                    fitViewBox.fitsInViewBox(viewBoxPrev) &&\n                    zoomLevel.viewBox.fitsInViewBox(fitViewBox, true)\n                ) {\n                    foundZoomLevelNumber = forceZoomLevel ? forceZoomLevel : zoomLevel.zoomLevel;\n                    foundZoomLevel = this.zoomLevels.get(foundZoomLevelNumber);\n\n                    newViewBox = new ViewBox(\n                        fitViewBox.x - foundZoomLevel.viewBox.width / 2 + fitViewBox.width / 2,\n                        fitViewBox.y - foundZoomLevel.viewBox.height / 2 + fitViewBox.height / 2,\n                        foundZoomLevel.viewBox.width,\n                        foundZoomLevel.viewBox.height\n                    );\n                }\n            }\n            viewBoxPrev = zoomLevel && zoomLevel.viewBox;\n        });\n        if (foundZoomLevel) {\n            if (this.canZoom) {\n                this.isZooming = true;\n                this.canZoom = false;\n                setTimeout(() => {\n                    this.isZooming = false;\n                    this.canZoom = true;\n                }, 700);\n                this.zoomLevel = foundZoomLevelNumber;\n                this._scale = foundZoomLevel._scale;\n                this.setViewBox(newViewBox);\n                return true;\n            }\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Zooms to a single region\n     * @param region\n     * @param zoomToLevel\n     *\n     * @private\n     */\n    zoomToRegion(region: Region, zoomToLevel?: number): boolean {\n        this.fitViewBox(region.getBBox(), zoomToLevel);\n        return true;\n    }\n\n    /**\n     * Centers map on Region or Marker.\n     * @param {Region|Marker} region - Region or Marker\n     * @param {number} yShift - Vertical shift from center. Used by showPopover method to fit popover in the map container\n     */\n    centerOn(region: Region | Marker, yShift?: number): void {\n        if (this.options.googleMaps.on) {\n            yShift = yShift ? (yShift + 12) / this.getScale() : 0;\n            $(this.containers.map).addClass(\"scrolling\");\n            const latLng = region.getCenterLatLng(yShift);\n            this.googleMaps.map.panTo(latLng);\n            setTimeout(() => {\n                $(this.containers.map).removeClass(\"scrolling\");\n            }, 100);\n        } else {\n            yShift = yShift ? (yShift + 12) / this.getScale() : 0;\n            const bbox = region.getBBox();\n            const vb = this.viewBox;\n            const newViewBox = new ViewBox(\n                bbox.x - vb.width / 2 + bbox.width / 2,\n                bbox.y - vb.height / 2 + bbox.height / 2 - yShift,\n                vb.width,\n                vb.height\n            );\n            this.setViewBox(newViewBox);\n        }\n    }\n    /**\n     * Zooms the map\n     * @param {number} delta - 1/-1\n     * @param {SVGPoint} center - [x,y] zoom center point\n     * @returns {boolean}\n     */\n    zoom(delta: number, center?: SVGPoint): void {\n        let newViewBox = new ViewBox(0, 0, 0, 0);\n\n        const d = delta > 0 ? 1 : -1;\n\n        if (!this.zoomLevels.get(this.zoomLevel + d)) return;\n\n        const newZoomLevel = this.zoomLevel + d;\n        const zoomIn = d > 0;\n        const zoomOut = d < 0;\n\n        const zoomRange = this.getZoomRange();\n\n        const isInZoomRange = this.zoomLevel >= zoomRange.min && this.zoomLevel <= zoomRange.max;\n\n        const goingOutOfZoomRange =\n            isInZoomRange && (newZoomLevel > zoomRange.max || newZoomLevel < zoomRange.min);\n\n        const outOfRangeAndMovingAway =\n            !isInZoomRange &&\n            ((zoomIn && newZoomLevel > zoomRange.max) || (zoomOut && newZoomLevel < zoomRange.min));\n\n        if (goingOutOfZoomRange || outOfRangeAndMovingAway) {\n            return;\n        }\n\n        this.zoomLevel = newZoomLevel;\n\n        const z = this.zoomLevels.get(this.zoomLevel);\n        this._scale = z._scale;\n        newViewBox = z.viewBox;\n\n        let shift = [];\n        if (center) {\n            const koef = zoomIn ? 0.5 : -1; // 1/2 * (d=1) || 2 * (d=-1)\n            // shift = [(center.x - this.viewBox.x) * koef, (center.y - this.viewBox.y) * koef];\n            // shift = newNewBox.width/2 - (center.x - this.viewBox.x)\n\n            newViewBox.x = this.viewBox.x + (center.x - this.viewBox.x) * koef;\n            newViewBox.y = this.viewBox.y + (center.y - this.viewBox.y) * koef;\n\n            // newViewBox.x =\n            //     this.svgDefault.viewBox.x + (center.x - this.svgDefault.viewBox.x) * koef;\n            //\n            // newViewBox.y =\n            //     this.svgDefault.viewBox.y + (center.y - this.svgDefault.viewBox.y) * koef;\n            // shift = newNewBox.width/2 - ()\n            // newViewBox.x -= this.viewBox.x + shift[0];\n            // newViewBox.y -= this.viewBox.y + shift[1];\n        } else {\n            shift = [\n                (this.viewBox.width - newViewBox.width) / 2,\n                (this.viewBox.height - newViewBox.height) / 2,\n            ];\n            newViewBox.x = this.viewBox.x + shift[0];\n            newViewBox.y = this.viewBox.y + shift[1];\n        }\n\n        this.shiftViewBoxToScrollBoundaries(newViewBox);\n\n        this.setViewBox(newViewBox);\n\n        // this.events.trigger('zoom');\n    }\n\n    private toggleSvgLayerOnZoom(): void {\n        if (\n            this.options.googleMaps.on &&\n            this.googleMaps.map &&\n            this.options.zoom.hideSvg &&\n            this.googleMaps.map.getZoom() >= this.options.zoom.hideSvgZoomLevel\n        ) {\n            if (!$(this.containers.svg).hasClass(\"mapsvg-invisible\")) {\n                $(this.containers.svg).animate({ opacity: 0 }, 400, \"linear\", () => {\n                    $(this.containers.svg).addClass(\"mapsvg-invisible\");\n                });\n            }\n        } else {\n            if ($(this.containers.svg).hasClass(\"mapsvg-invisible\")) {\n                $(this.containers.svg).animate({ opacity: 1 }, 400, \"linear\", () => {\n                    $(this.containers.svg).removeClass(\"mapsvg-invisible\");\n                });\n            }\n        }\n    }\n\n    private shiftViewBoxToScrollBoundaries(newViewBox: ViewBox): ViewBox {\n        if (this.options.scroll.limit) {\n            if (newViewBox.x < this.svgDefault.viewBox.x) newViewBox.x = this.svgDefault.viewBox.x;\n            else if (\n                newViewBox.x + newViewBox.width >\n                this.svgDefault.viewBox.x + this.svgDefault.viewBox.width\n            )\n                newViewBox.x =\n                    this.svgDefault.viewBox.x + this.svgDefault.viewBox.width - newViewBox.width;\n\n            if (newViewBox.y < this.svgDefault.viewBox.y) newViewBox.y = this.svgDefault.viewBox.y;\n            else if (\n                newViewBox.y + newViewBox.height >\n                this.svgDefault.viewBox.y + this.svgDefault.viewBox.height\n            )\n                newViewBox.y =\n                    this.svgDefault.viewBox.y + this.svgDefault.viewBox.height - newViewBox.height;\n        }\n        return newViewBox;\n    }\n\n    /**\n     * Deletes a marker\n     * @param {Marker} marker\n     */\n    markerDelete(marker: Marker): void {\n        if (this.editingMarker && this.editingMarker.id == marker.id) {\n            this.unsetEditingMarker();\n        }\n\n        if (this.markers.findById(marker.id)) {\n            this.markers.delete(marker.id);\n        }\n        marker.delete();\n        marker = null;\n\n        if (this.markers.length === 0) this.options.markerLastID = 0;\n    }\n    /**\n     * Adds a marker cluster\n     * @param {MarkerCluster} markersCluster\n     */\n    markersClusterAdd(markersCluster: MarkerCluster): void {\n        this.layers.markers.append(markersCluster.elem);\n        this.markersClusters.push(markersCluster);\n        markersCluster.adjustScreenPosition();\n    }\n    /** Adds a marker to the map.\n     * @param {Marker} marker\n     * @example\n     */\n    markerAdd(marker): void {\n        $(marker.element).hide();\n        marker.adjustScreenPosition();\n        // marker.setImage(this.getMarkerImage(marker.object, marker.location), true);\n        this.layers.markers.append(marker.element);\n        this.markers.push(marker);\n        marker.mapped = true;\n\n        setTimeout(function () {\n            $(marker.element).show();\n        }, 100);\n    }\n    /**\n     * Removes marker from the map\n     * @param marker\n     */\n    markerRemove(marker: Marker): void {\n        if (this.editingMarker && this.editingMarker.id == marker.id) {\n            this.editingMarker = null;\n            delete this.editingMarker;\n        }\n\n        if (this.markers.findById(marker.id)) {\n            this.markers.findById(marker.id).element.remove();\n            this.markers.delete(marker.id);\n            marker = null;\n        }\n        if (this.markers.length === 0) this.options.markerLastID = 0;\n    }\n    /**\n     * Generates new Marker ID\n     * @returns {*}\n     * @private\n     */\n    markerId(): string {\n        this.options.markerLastID = this.options.markerLastID + 1;\n        const id = \"marker_\" + this.options.markerLastID;\n        if (this.getMarker(id)) return this.markerId();\n        else return id;\n    }\n\n    /**\n     * Adjust positions of all movable objects (markers, clusters, popovers, labels)\n     *\n     */\n    movingItemsAdjustScreenPosition() {\n        this.markersAdjustScreenPosition();\n\n        this.popoverAdjustScreenPosition();\n\n        this.bubblesRegionsAdjustScreenPosition();\n\n        this.labelsRegionsAdjustScreenPosition();\n    }\n\n    /**\n     * Move all movable objects (markers, clusters, popovers, labels) by given values\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    movingItemsMoveScreenPositionBy(deltaX, deltaY) {\n        this.markersMoveScreenPositionBy(deltaX, deltaY);\n\n        this.popoverMoveScreenPositionBy(deltaX, deltaY);\n\n        this.bubblesRegionsMoveScreenPositionBy(deltaX, deltaY);\n\n        this.labelsRegionsMoveScreenPositionBy(deltaX, deltaY);\n    }\n\n    /**\n     * Adjusts position of Region Labels\n     */\n    labelsRegionsAdjustScreenPosition() {\n        if ($(this.containers.map).is(\":visible\")) {\n            this.regions.forEach(function (region) {\n                region.adjustLabelScreenPosition();\n            });\n        }\n    }\n\n    /**\n     * Adjusts position of Regions bubbles\n     */\n    bubblesRegionsAdjustScreenPosition() {\n        if ($(this.containers.map).is(\":visible\")) {\n            this.regions.forEach(function (region) {\n                region.adjustBubbleScreenPosition();\n            });\n        }\n    }\n\n    /**\n     * Move position of Region Labels by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    labelsRegionsMoveScreenPositionBy(deltaX: number, deltaY: number): void {\n        if ($(this.containers.map).is(\":visible\")) {\n            this.regions.forEach(function (region) {\n                region.moveLabelScreenPositionBy(deltaX, deltaY);\n            });\n        }\n    }\n\n    /**\n     * Move position of Regions bubbles by given numbers\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    bubblesRegionsMoveScreenPositionBy(deltaX: number, deltaY: number): void {\n        if ($(this.containers.map).is(\":visible\")) {\n            this.regions.forEach((region) => {\n                region.moveBubbleScreenPositionBy(deltaX, deltaY);\n            });\n        }\n    }\n\n    /**\n     * Adjusts position of Markers and MarkerClusters.\n     * This method is called on zoom or when map container is resized.\n     */\n    markersAdjustScreenPosition(): void {\n        this.markers.forEach((marker: Marker) => {\n            marker.adjustScreenPosition();\n        });\n        this.markersClusters.forEach((cluster: MarkerCluster) => {\n            cluster.adjustScreenPosition();\n        });\n        if (this.userLocationMarker) {\n            this.userLocationMarker.adjustScreenPosition();\n        }\n    }\n\n    /**\n     * Move Markers and clusters by given numbers.\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    markersMoveScreenPositionBy(deltaX: number, deltaY: number): void {\n        this.markers.forEach((marker) => {\n            marker.moveSrceenPositionBy(deltaX, deltaY);\n        });\n\n        this.markersClusters.forEach((cluster: MarkerCluster) => {\n            cluster.moveSrceenPositionBy(deltaX, deltaY);\n        });\n\n        if (this.userLocationMarker) {\n            this.userLocationMarker.moveSrceenPositionBy(deltaX, deltaY);\n        }\n    }\n\n    /**\n     * Sets marker into \"edit mode\".\n     * Used in Map Editor.\n     * @param {Marker} marker\n     * @private\n     */\n    setEditingMarker(marker: Marker): void {\n        this.editingMarker = marker;\n        if (!this.editingMarker.mapped) {\n            this.editingMarker.needToRemove = true;\n            // this.editingMarker.node.addClass(\"mapsvg-editing-marker\");\n            this.markerAdd(this.editingMarker);\n        }\n    }\n    /**\n     * Disables marker \"edit mode\".\n     * Used in Map Editor.\n     * @private\n     */\n    unsetEditingMarker(): void {\n        if (this.editingMarker && this.editingMarker.needToRemove) {\n            this.markerRemove(this.editingMarker);\n        }\n        this.editingMarker = null;\n    }\n    /**\n     * Returns marker that is currently in the \"edit mode\"\n     * Used in Map Editor.\n     * @private\n     */\n    getEditingMarker(): Marker {\n        return this.editingMarker;\n    }\n    /**\n     * Event handler - called when map scroll starts\n     * @param e\n     * @param mapsvg\n     * @returns {boolean}\n     * @private\n     */\n    scrollStart(e: JQuery.TouchEventBase, mapsvg: MapSVGMap): void {\n        if (\n            $(e.target).hasClass(\"mapsvg-btn-map\") ||\n            $(e.target).closest(\".mapsvg-choropleth\").length\n        )\n            return;\n\n        if (this.editMarkers.on && $(e.target).hasClass(\"mapsvg-marker\")) return;\n\n        e.preventDefault();\n\n        $(this.containers.map).addClass(\"no-transitions\");\n\n        const ce =\n            e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0]\n                ? e.originalEvent.touches[0]\n                : e;\n\n        this.scrollStarted = true;\n\n        this.scroll = {\n            tx: this.scroll.tx || 0,\n            ty: this.scroll.ty || 0,\n            // initial viewbox when scrollning started\n            vxi: this.viewBox.x,\n            vyi: this.viewBox.y,\n            // mouse coordinates when scrolling started\n            x: ce.clientX,\n            y: ce.clientY,\n            // mouse delta\n            dx: 0,\n            dy: 0,\n            // new viewbox x/y\n            vx: 0,\n            vy: 0,\n            // for google maps scroll\n            gx: ce.clientX,\n            gy: ce.clientY,\n            touchScrollStart: 0,\n        };\n\n        if (e.type.indexOf(\"mouse\") === 0) {\n            $(document).on(\"mousemove.scroll.mapsvg\", (e: JQuery.TouchEventBase) => {\n                this.scrollMove(e);\n            });\n            if (this.options.scroll.spacebar) {\n                $(document).on(\"keyup.scroll.mapsvg\", (e: JQuery.TouchEventBase) => {\n                    if (e.keyCode == 32) {\n                        this.scrollEnd(e, mapsvg);\n                    }\n                });\n            } else {\n                $(document).on(\"mouseup.scroll.mapsvg\", (e: JQuery.TouchEventBase) => {\n                    this.scrollEnd(e, mapsvg);\n                });\n            }\n        }\n    }\n    /**\n     * Event handler - called when map scroll moves\n     * @param e\n     * @event\n     * @private\n     */\n    scrollMove(e: JQuery.TouchEventBase): void {\n        e.preventDefault();\n\n        if (!this.isScrolling) {\n            this.isScrolling = true;\n            // $(this.containers.map).css('pointer-events','none');\n            $(this.containers.map).addClass(\"scrolling\");\n        }\n\n        const ce =\n            e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0]\n                ? e.originalEvent.touches[0]\n                : e;\n\n        this.panBy(this.scroll.gx - ce.clientX, this.scroll.gy - ce.clientY);\n\n        this.scroll.gx = ce.clientX;\n        this.scroll.gy = ce.clientY;\n\n        // delta x/y\n        this.scroll.dx = this.scroll.x - ce.clientX;\n        this.scroll.dy = this.scroll.y - ce.clientY;\n\n        // new viewBox x/y\n        let vx = this.scroll.vxi + this.scroll.dx / this.scale;\n        let vy = this.scroll.vyi + this.scroll.dy / this.scale;\n\n        // Limit scroll to map boundaries\n        if (this.options.scroll.limit) {\n            if (vx < this.svgDefault.viewBox.x) vx = this.svgDefault.viewBox.x;\n            else if (\n                this.viewBox.width + vx >\n                this.svgDefault.viewBox.x + this.svgDefault.viewBox.width\n            )\n                vx = this.svgDefault.viewBox.x + this.svgDefault.viewBox.width - this.viewBox.width;\n\n            if (vy < this.svgDefault.viewBox.y) vy = this.svgDefault.viewBox.y;\n            else if (\n                this.viewBox.height + vy >\n                this.svgDefault.viewBox.y + this.svgDefault.viewBox.height\n            )\n                vy =\n                    this.svgDefault.viewBox.y +\n                    this.svgDefault.viewBox.height -\n                    this.viewBox.height;\n        }\n\n        this.scroll.vx = vx;\n        this.scroll.vy = vy;\n    }\n    /**\n     * Event handler - called when map scroll ends\n     * @param {JQuery.TriggeredEvent} e\n     * @param {MapSVGMap} mapsvg\n     * @param {boolean} noClick\n     * @returns {boolean}\n     * @event\n     * @private\n     */\n    scrollEnd(e: JQuery.TouchEventBase, mapsvg: MapSVGMap, noClick?: boolean): void {\n        setTimeout(() => {\n            this.enableAnimation();\n            this.scrollStarted = false;\n            this.isScrolling = false;\n        }, 100);\n        if (this.googleMaps && this.googleMaps.overlay) {\n            this.googleMaps.overlay.draw();\n        }\n\n        $(this.containers.map).removeClass(\"scrolling\");\n        $(document).off(\"keyup.scroll.mapsvg\");\n        $(document).off(\"mousemove.scroll.mapsvg\");\n        $(document).off(\"mouseup.scroll.mapsvg\");\n\n        // call regionClickHandler if mouse did not move more than 5 pixels\n        if (noClick !== true && Math.abs(this.scroll.dx) < 5 && Math.abs(this.scroll.dy) < 5) {\n            // this.controllers.popoverOffHandler(e);\n            /*\n            if (this.editMarkers.on && this.clickAddsMarker) this.markerAddClickHandler(e);\n            this.events.trigger(\"click\", this, [e, this, this]);\n            if (this.objectClickedBeforeScroll) {\n                const objectType =\n                    this.objectClickedBeforeScroll instanceof Marker\n                        ? \"marker\"\n                        : this.objectClickedBeforeScroll instanceof Region\n                        ? \"region\"\n                        : \"markerCluster\";\n                this.events.trigger(\"click.\" + objectType, this, [\n                    e,\n                    this.objectClickedBeforeScroll,\n                    this,\n                ]);\n            }\n            */\n            if (this.editMarkers.on) this.clickAddsMarker && this.markerAddClickHandler(e);\n            else if (this.objectClickedBeforeScroll)\n                if (this.objectClickedBeforeScroll instanceof Marker) {\n                    this.markerClickHandler(e, this.objectClickedBeforeScroll);\n                } else if (this.objectClickedBeforeScroll instanceof Region) {\n                    this.regionClickHandler(e, this.objectClickedBeforeScroll);\n                } else if (this.objectClickedBeforeScroll instanceof MarkerCluster) {\n                    this.markerClusterClickHandler(e, this.objectClickedBeforeScroll);\n                }\n        }\n\n        this.viewBox.x = this.scroll.vx || this.viewBox.x;\n        this.viewBox.y = this.scroll.vy || this.viewBox.y;\n    }\n\n    setViewBoxByGoogleMapsOverlay(): void {\n        const bounds = this.googleMaps.overlay.getPixelBounds();\n        const scale = (bounds.ne.x - bounds.sw.x) / this.svgDefault.viewBox.width;\n\n        const vb = new ViewBox(\n            this.svgDefault.viewBox.x - bounds.sw.x / scale,\n            this.svgDefault.viewBox.y - bounds.ne.y / scale,\n            this.containers.map.offsetWidth / scale,\n            this.containers.map.offsetHeight / scale\n        );\n        this.setViewBox(vb, false);\n    }\n\n    /**\n     * Shift the map by x,y pixels\n     * @param {number} x\n     * @param {number} y\n     */\n    panBy(x: number, y: number): { x: boolean; y: boolean } {\n        let tx = this.scroll.tx - x;\n        let ty = this.scroll.ty - y;\n\n        const scrolled = { x: true, y: true };\n\n        if (this.options.scroll.limit) {\n            const svg = $(this.containers.svg)[0].getBoundingClientRect();\n            const bounds = $(this.containers.map)[0].getBoundingClientRect();\n            if ((svg.left - x > bounds.left && x < 0) || (svg.right - x < bounds.right && x > 0)) {\n                tx = this.scroll.tx;\n                scrolled.x = false;\n            }\n            if ((svg.top - y > bounds.top && y < 0) || (svg.bottom - y < bounds.bottom && y > 0)) {\n                ty = this.scroll.ty;\n                scrolled.y = false;\n            }\n        }\n\n        $(this.containers.scrollpane).css({\n            transform: \"translate(\" + tx + \"px,\" + ty + \"px)\",\n        });\n\n        this.scroll.tx = tx;\n        this.scroll.ty = ty;\n\n        if (scrolled.x || scrolled.y) {\n            const moveX = scrolled.x ? x : 0;\n            const moveY = scrolled.y ? y : 0;\n\n            this.movingItemsMoveScreenPositionBy(moveX, moveY);\n\n            if (this.googleMaps.map) {\n                let point = this.googleMaps.map.getCenter();\n\n                const projection = this.googleMaps.overlay.getProjection();\n\n                const pixelpoint = projection.fromLatLngToDivPixel(point);\n                pixelpoint.x += moveX;\n                pixelpoint.y += moveY;\n\n                point = projection.fromDivPixelToLatLng(pixelpoint);\n\n                this.googleMaps.map.setCenter(point);\n            }\n        }\n\n        return scrolled;\n    }\n    /**\n     * Save the Region ID that was clicked before starting map scroll.\n     * It is used to trigger .regionClickHandler() later if scroll was less than 5px\n     */\n    setObjectClickedBeforeScroll(object: Region | Marker | MarkerCluster): void {\n        this.objectClickedBeforeScroll = object;\n    }\n    /**\n     * Event hanlder\n     * @param _e\n     * @param mapsvg\n     * @private\n     * @event\n     */\n    touchStart(_e: JQuery.TouchEventBase, mapsvg: MapSVGMap): void {\n        _e.preventDefault();\n\n        // stop scroll and cancel click event\n        if (this.scrollStarted) {\n            this.scrollEnd(_e, mapsvg, true);\n        }\n        const e = _e.originalEvent;\n\n        if (this.options.zoom.fingers && e.touches && e.touches.length == 2) {\n            // this.touchZoomStartViewBox = this.viewBox;\n            // this.touchZoomStartScale =  this.scale;\n            this.touchZoomStart = true;\n            this.scaleDistStart = Math.hypot(\n                e.touches[0].pageX - e.touches[1].pageX,\n                e.touches[0].pageY - e.touches[1].pageY\n            );\n        } else if (e.touches && e.touches.length == 1) {\n            this.scrollStart(_e, mapsvg);\n        }\n\n        $(document)\n            .on(\"touchmove.scroll.mapsvg\", (e: JQuery.TouchEventBase) => {\n                e.preventDefault();\n                this.touchMove(e, this);\n            })\n            .on(\"touchend.scroll.mapsvg\", (e: JQuery.TouchEventBase) => {\n                e.preventDefault();\n                this.touchEnd(e, this);\n            });\n    }\n    /**\n     * Event hanlder\n     * @param {JQuery.TriggeredEvent} _e\n     * @param mapsvg\n     * @private\n     */\n    touchMove(_e: JQuery.TouchEventBase, mapsvg: MapSVGMap): void {\n        _e.preventDefault();\n        const e = _e.originalEvent;\n\n        if (this.options.zoom.fingers && e.touches && e.touches.length == 2) {\n            if (!MapSVG.ios) {\n                // e.scale is present on iOS devices only so we need to add \"ts-ignore\"\n                // @ts-ignore\n                e.scale =\n                    Math.hypot(\n                        e.touches[0].pageX - e.touches[1].pageX,\n                        e.touches[0].pageY - e.touches[1].pageY\n                    ) / this.scaleDistStart;\n            }\n\n            // e.scale is present on iOS devices only so we need to add \"ts-ignore\"\n            // @ts-ignore\n            if (e.scale != 1 && this.canZoom) {\n                // @ts-ignore\n                const d = e.scale > 1 ? 1 : -1;\n\n                const cx =\n                    e.touches[0].pageX >= e.touches[1].pageX\n                        ? e.touches[0].pageX -\n                          (e.touches[0].pageX - e.touches[1].pageX) / 2 -\n                          $(this.containers.map).offset().left\n                        : e.touches[1].pageX -\n                          (e.touches[1].pageX - e.touches[0].pageX) / 2 -\n                          $(this.containers.map).offset().left;\n                const cy =\n                    e.touches[0].pageY >= e.touches[1].pageY\n                        ? e.touches[0].pageY -\n                          (e.touches[0].pageY - e.touches[1].pageY) -\n                          $(this.containers.map).offset().top\n                        : e.touches[1].pageY -\n                          (e.touches[1].pageY - e.touches[0].pageY) -\n                          $(this.containers.map).offset().top;\n\n                const center = this.converter.convertPixelToSVG(new ScreenPoint(cx, cy));\n\n                if (d > 0) this.zoomIn(center);\n                else this.zoomOut(center);\n            }\n        } else if (e.touches && e.touches.length == 1) {\n            this.scrollMove(_e);\n        }\n    }\n    /**\n     * Event hanlder\n     * @param _e\n     * @param mapsvg\n     * @private\n     */\n    touchEnd(_e: JQuery.TouchEventBase, mapsvg: MapSVGMap): void {\n        _e.preventDefault();\n        const e = _e.originalEvent;\n        if (this.touchZoomStart) {\n            this.touchZoomStart = false;\n        } else if (this.scrollStarted) {\n            this.scrollEnd(_e, mapsvg);\n        }\n\n        $(document).off(\"touchmove.scroll.mapsvg\");\n        $(document).off(\"touchend.scroll.mapsvg\");\n    }\n    /**\n     * Returns array of IDs of selected Regions\n     * @returns {String[]}\n     */\n    getSelected(): string[] {\n        return this.selected_id;\n    }\n    /**\n     * Selects a Region\n     * @param {Region|string} id - Region or ID\n     * @param {bool} skipDirectorySelection\n     * @returns {boolean}\n     */\n    selectRegion(id: string | Region, skipDirectorySelection?: boolean): void {\n        let region: Region;\n\n        // this.hidePopover();\n        if (typeof id == \"string\") {\n            region = this.getRegion(id);\n        } else {\n            region = id;\n        }\n        if (!region) return;\n\n        let ids: Array<string>;\n\n        if (this.options.multiSelect && !this.editRegions.on) {\n            if (region.selected) {\n                this.deselectRegion(region);\n                if (!skipDirectorySelection && this.options.menu.on) {\n                    if (this.options.menu.source == \"database\") {\n                        if (region.objects && region.objects.length) {\n                            ids = region.objects.map((obj: CustomObject) => {\n                                return obj.id.toString();\n                            });\n                        }\n                    } else {\n                        ids = [region.id];\n                    }\n                    this.controllers.directory.deselectItems();\n                }\n\n                return;\n            }\n        } else if (this.selected_id.length > 0) {\n            this.deselectAllRegions();\n            if (!skipDirectorySelection && this.options.menu.on) {\n                if (this.options.menu.source == \"database\") {\n                    if (region.objects && region.objects.length) {\n                        ids = region.objects.map((obj: CustomObject) => {\n                            return obj.id.toString();\n                        });\n                    }\n                } else {\n                    ids = [region.id];\n                }\n                this.controllers.directory.deselectItems();\n            }\n        }\n\n        this.selected_id.push(region.id);\n        region.select();\n\n        const skip = this.options.actions.region.click.filterDirectory;\n\n        if (\n            !skip &&\n            !skipDirectorySelection &&\n            this.options.menu.on &&\n            this.controllers &&\n            this.controllers.directory\n        ) {\n            if (this.options.menu.source == \"database\") {\n                if (region.objects && region.objects.length) {\n                    ids = region.objects.map((obj: CustomObject) => {\n                        return obj.id.toString();\n                    });\n                } else {\n                    ids = [region.id];\n                }\n            } else {\n                ids = [region.id];\n            }\n            this.controllers.directory.selectItems(ids);\n        }\n\n        if (\n            this.options.actions.region.click.addIdToUrl &&\n            !this.options.actions.region.click.showAnotherMap\n        ) {\n            window.location.hash = \"/m/\" + region.id;\n            // history.replaceState(null, null, region.id);\n            // history.replaceState(\"\", document.title, window.location.pathname\n            //     + window.location.search + '#m_'+region.id);\n        }\n    }\n    /**\n     * Deselects all Regions\n     */\n    deselectAllRegions(): void {\n        $.each(this.selected_id, (index, id) => {\n            this.deselectRegion(this.getRegion(id));\n        });\n    }\n    /**\n     * Deselects one Region\n     * @param {Region} region\n     */\n    deselectRegion(region: Region): void {\n        if (!region) region = this.getRegion(this.selected_id[0]);\n        if (region) {\n            region.deselect();\n            const i = $.inArray(region.id, this.selected_id);\n            this.selected_id.splice(i, 1);\n            // if(MapSVG.browser.ie)//|| MapSVG.browser.firefox)\n            //     this.mapAdjustStrokes();\n        }\n        if (this.options.actions.region.click.addIdToUrl) {\n            // window.location.hash = ' '; //window.location.hash.replace(region.id,'');\n            // history.replaceState(\"\", document.title, window.location.pathname\n            //     + window.location.search);\n            if (window.location.hash.indexOf(region.id) !== -1) {\n                history.replaceState(null, null, \" \");\n            }\n        }\n    }\n    /**\n     * Highlights an array of Regions (used on mouseover)\n     * @param {Region[]} regions\n     */\n    highlightRegions(regions: Region[]): void {\n        regions.forEach((region) => {\n            if (region && !region.selected && !region.disabled) {\n                this.highlightedRegions.push(region);\n                region.highlight();\n            }\n        });\n    }\n    /**\n     * Unhighlights all Regions  (used on mouseout)\n     */\n    unhighlightRegions(): void {\n        this.highlightedRegions.forEach((region: Region) => {\n            if (region && !region.selected && !region.disabled) region.unhighlight();\n        });\n        this.highlightedRegions = [];\n    }\n    /**\n     * Selects a Marker\n     * @param {Marker} marker\n     */\n    selectMarker(marker: Marker): void {\n        if (!(marker instanceof Marker)) return;\n\n        this.deselectAllMarkers();\n        marker.select();\n        this.selected_marker = marker;\n\n        $(this.layers.markers).addClass(\"mapsvg-with-marker-active\");\n\n        if (this.options.menu.on && this.options.menu.source == \"database\") {\n            this.controllers.directory.deselectItems();\n            this.controllers.directory.selectItems(marker.object.id);\n        }\n    }\n\n    /**\n     * Deselects all Markers\n     */\n    deselectAllMarkers(): void {\n        this.selected_marker && this.selected_marker.deselect();\n        $(this.layers.markers).removeClass(\"mapsvg-with-marker-active\");\n    }\n\n    /**\n     * Deselects one Marker\n     * @param {Marker} marker\n     */\n    deselectMarker(marker: Marker): void {\n        if (marker) {\n            marker.deselect();\n        }\n    }\n    /**\n     * Highlight marker\n     * @param {Marker} marker\n     */\n    highlightMarker(marker: Marker): void {\n        $(this.layers.markers).addClass(\"mapsvg-with-marker-hover\");\n        marker.highlight();\n        this.highlighted_marker = marker;\n    }\n    /**\n     * Unhighlights all Regions  (used on mouseout)\n     */\n    unhighlightMarker(): void {\n        $(this.layers.markers).removeClass(\"mapsvg-with-marker-hover\");\n        this.highlighted_marker && this.highlighted_marker.unhighlight();\n    }\n    /**\n     * Converts mouse pointer coordinates to SVG coordinates\n     * @param {object} e - Event object\n     * @returns {Array} - [x,y] SVG coordinates\n     */\n    convertMouseToSVG(e: JQuery.TriggeredEvent): SVGPoint {\n        const mc = MapSVG.mouseCoords(e);\n        const x = mc.x - $(this.containers.map).offset().left;\n        const y = mc.y - $(this.containers.map).offset().top;\n        const screenPoint = new ScreenPoint(x, y);\n        return this.converter.convertPixelToSVG(screenPoint);\n    }\n\n    /**\n     * Converts map geo-boundaries to viewBox\n     * @param sw\n     * @param ne\n     * @returns {*[]}\n     *\n     * @private\n     * @deprecated\n     */\n    /*\n    convertGeoBoundsToViewBox (geoViewBox: GeoViewBox): ViewBox {\n        //sw, ne\n\n        var lat = parseFloat(coords[0]);\n        var lon = parseFloat(coords[1]);\n        var x = (lon - this.geoViewBox.leftLon) * (this.svgDefault.viewBox.width / this.converter.mapLonDelta);\n\n        var lat = lat * 3.14159 / 180;\n        // var worldMapWidth = ((this.svgDefault.width / this.converter.mapLonDelta) * 360) / (2 * 3.14159);\n        var worldMapWidth = ((this.svgDefault.viewBox.width / this.converter.mapLonDelta) * 360) / (2 * 3.14159);\n        var mapOffsetY = (worldMapWidth / 2 * Math.log((1 + Math.sin(this.mapLatBottomDegree)) / (1 - Math.sin(this.mapLatBottomDegree))));\n        var y = this.svgDefault.viewBox.height - ((worldMapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY);\n\n        x += this.svgDefault.viewBox.x;\n        y += this.svgDefault.viewBox.y;\n\n        return [x, y];\n    }\n    */\n\n    /**\n     * For choropleth map: returns color for given number value\n     * @param {number} choroplethValue - Number value\n     * @returns {{r: number, g: number, b: number, a: number}} - Color values, 0-255.\n     */\n    pickChoroplethColor(choroplethValue: number): { r: number; g: number; b: number; a: number } {\n        const w =\n            (choroplethValue - this.options.choropleth.coloring.gradient.values.min) /\n            this.options.choropleth.coloring.gradient.values.maxAdjusted;\n        const rgba = {\n            r: Math.round(\n                this.options.choropleth.coloring.gradient.colors.diffRGB.r * w +\n                    this.options.choropleth.coloring.gradient.colors.lowRGB.r\n            ),\n            g: Math.round(\n                this.options.choropleth.coloring.gradient.colors.diffRGB.g * w +\n                    this.options.choropleth.coloring.gradient.colors.lowRGB.g\n            ),\n            b: Math.round(\n                this.options.choropleth.coloring.gradient.colors.diffRGB.b * w +\n                    this.options.choropleth.coloring.gradient.colors.lowRGB.b\n            ),\n            a: Math.round(\n                this.options.choropleth.coloring.gradient.colors.diffRGB.a * w +\n                    this.options.choropleth.coloring.gradient.colors.lowRGB.a\n            ),\n        };\n        return rgba;\n    }\n    /**\n     * Checks if Region should be disabled\n     * @param {string} id - Region ID\n     * @param {string} svgfill - Region color (\"fill\" attribute)\n     * @returns {boolean} - \"true\" if Region should be disabled.\n     */\n    isRegionDisabled(id: string, svgfill: string): boolean {\n        if (this.options.regions[id] && (this.options.regions[id].disabled || svgfill == \"none\")) {\n            return true;\n        } else if (\n            (this.options.regions[id] == undefined ||\n                MapSVG.parseBoolean(this.options.regions[id].disabled)) &&\n            (this.options.disableAll || svgfill == \"none\" || id == \"labels\" || id == \"Labels\")\n        ) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Gets map settings from the server\n     */\n    loadMap(id: number | string, container: HTMLElement): void {\n        if (!(container instanceof HTMLElement)) {\n            console.error(\"Can't load a new map: container was not provided.\");\n            return;\n        }\n\n        const previousMapsIds = [...this.options.previousMapsIds];\n        const currentMapId = this.id;\n        if (previousMapsIds[previousMapsIds.length - 1] !== id) {\n            previousMapsIds.push(currentMapId);\n        } else {\n            previousMapsIds.pop();\n        }\n\n        let showPreviousMapButton;\n        if (\n            typeof this.options.actions.region.click.showAnotherMapContainerId !== \"undefined\" &&\n            this.options.actions.region.click.showAnotherMapContainerId !== \"\"\n        ) {\n            showPreviousMapButton = false;\n        } else {\n            showPreviousMapButton = this.options.controls.previousMap;\n        }\n\n        const mapsRepo = new MapsRepository();\n        const sameContainer = container === this.containers.map;\n\n        mapsRepo.findById(id).done((map) => {\n            sameContainer && this.destroy();\n            const newMap = new MapSVGMap(container.getAttribute(\"id\"), map);\n            newMap.events.on(\"afterLoad\", function () {\n                this.options.previousMapsIds = previousMapsIds;\n                this.options.controls.previousMap = showPreviousMapButton;\n                this.setControls(this.options.controls);\n            });\n        });\n    }\n\n    /**\n     * Load previous map from the history (MapSVGMap.options.previousMapsIds)\n     */\n    loadPreviousMap(): void {\n        const previousMapId = this.options.previousMapsIds[this.options.previousMapsIds.length - 1];\n        const container: HTMLElement = document.getElementById(this.containerId);\n\n        this.loadMap(previousMapId, container);\n    }\n    markerClusterClickHandler(e: JQuery.TriggeredEvent, markerCluster: MarkerCluster): void {\n        this.objectClickedBeforeScroll = null;\n        if (this.eventsPreventList[\"click\"]) return;\n        this.zoomTo(markerCluster.markers);\n        return;\n    }\n    regionClickHandler(e: JQuery.TriggeredEvent, region: Region): void {\n        this.objectClickedBeforeScroll = null;\n        if (this.eventsPreventList[\"click\"]) return;\n\n        this.selectRegion(region.id);\n\n        if (this.editRegions.on) {\n            this.regionEditHandler.call(region);\n            return;\n        }\n\n        const actions = this.options.actions;\n\n        if (actions.region.click.zoom) {\n            this.zoomTo(region, parseInt(actions.region.click.zoomToLevel));\n        }\n\n        if (actions.region.click.filterDirectory) {\n            const query = new Query({\n                filters: {\n                    regions: {\n                        table_name: this.regionsRepository.getSchema().name,\n                        region_ids: [region.id],\n                    },\n                },\n            });\n\n            this.objectsRepository.query.resetFilters();\n            this.setFilterOut();\n\n            this.objectsRepository.find(query).done(() => {\n                if (this.controllers.popover) {\n                    this.controllers.popover.redraw(region.forTemplate());\n                }\n                if (this.controllers.detailsView) {\n                    this.controllers.detailsView.redraw(region.forTemplate());\n                }\n            });\n            this.updateFiltersState();\n        }\n\n        if (actions.region.click.showDetails) {\n            this.loadDetailsView(region);\n        }\n\n        if (actions.region.click.showPopover) {\n            if (actions.region.click.zoom) {\n                setTimeout(() => {\n                    this.showPopover(region);\n                }, 400);\n            } else {\n                this.showPopover(region);\n            }\n        } else if (e && e.type.indexOf(\"touch\") !== -1 && actions.region.touch.showPopover) {\n            if (actions.region.click.zoom) {\n                setTimeout(() => {\n                    this.showPopover(region);\n                }, 400);\n            } else {\n                this.showPopover(region);\n            }\n        }\n\n        if (actions.region.click.goToLink) {\n            const linkParts = actions.region.click.linkField.split(\".\");\n            let url;\n            if (linkParts.length > 1) {\n                const obj = linkParts.shift();\n                const attr = \".\" + linkParts.join(\".\");\n                if (obj == \"Region\") {\n                    if (region.data) {\n                        try {\n                            url = eval(\"region.data\" + attr);\n                        } catch (err) {\n                            console.log(\"No such field as region.data\" + attr);\n                        }\n                    }\n                } else {\n                    if (region.objects && region.objects[0]) {\n                        try {\n                            url = eval(\"region.objects[0]\" + attr);\n                        } catch (err) {\n                            console.log(\"No such field as region.objects[0]\" + attr);\n                        }\n                    }\n                }\n\n                if (url && !this.disableLinks) {\n                    if (this.editMode) {\n                        alert(\"Redirect: \" + url + \"\\nLinks are disabled in the preview.\");\n                        return;\n                    }\n                    if (actions.region.click.newTab) {\n                        const win = window.open(url, \"_blank\");\n                        win.focus();\n                    } else {\n                        window.location.href = url;\n                    }\n                }\n            }\n        }\n        if (actions.region.click.showAnotherMap) {\n            if (this.editMode) {\n                alert('\"Show another map\" action is disabled in the preview');\n                return;\n            }\n            const linkParts = actions.region.click.showAnotherMapField.split(\".\");\n            let url;\n            if (linkParts.length > 1) {\n                const obj = linkParts.shift();\n                const attr = \".\" + linkParts.join(\".\");\n                let map_id;\n                if (obj == \"Region\") {\n                    if (region.data) map_id = eval(\"region.data\" + attr);\n                } else {\n                    if (region.objects && region.objects[0])\n                        map_id = eval(\"region.objects[0]\" + attr);\n                }\n\n                if (map_id) {\n                    const container = actions.region.click.showAnotherMapContainerId\n                        ? $(\"#\" + actions.region.click.showAnotherMapContainerId)[0]\n                        : $(this.containers.map)[0];\n                    this.loadMap(map_id, container);\n                }\n            }\n        }\n        this.events.trigger(\"click.region\", region, [e, region, this]);\n    }\n    markerClickHandler(e: JQuery.TriggeredEvent, marker: Marker): void {\n        this.objectClickedBeforeScroll = null;\n        if (this.eventsPreventList[\"click\"]) return;\n\n        const actions = this.options.actions;\n\n        this.selectMarker(marker);\n        const passingObject = marker.object;\n\n        if (actions.marker.click.zoom) {\n            this.zoomTo(marker, parseInt(actions.marker.click.zoomToLevel));\n        }\n\n        if (actions.marker.click.filterDirectory) {\n            const query = new Query({ filters: { id: marker.object.id } });\n            this.objectsRepository.find(query);\n            this.updateFiltersState();\n        }\n\n        if (actions.marker.click.showDetails) this.loadDetailsView(passingObject);\n        if (actions.marker.click.showPopover) {\n            if (actions.marker.click.zoom) {\n                setTimeout(() => {\n                    this.showPopover(passingObject);\n                }, 500);\n            } else {\n                this.showPopover(passingObject);\n            }\n        } else if (e && e.type.indexOf(\"touch\") !== -1 && actions.marker.touch.showPopover) {\n            if (actions.marker.click.zoom) {\n                setTimeout(() => {\n                    this.showPopover(passingObject);\n                }, 500);\n            } else {\n                this.showPopover(passingObject);\n            }\n        }\n        if (actions.marker.click.goToLink) {\n            const linkParts = actions.marker.click.linkField.split(\".\");\n            let url;\n            if (linkParts.length > 1) {\n                const obj = linkParts.shift();\n                const attr = \".\" + linkParts.join(\".\");\n                try {\n                    url = eval(\"passingObject\" + attr);\n                } catch (err) {\n                    console.log(\"MapSVG: No such field as passingObject\" + attr);\n                }\n                if (url && !this.disableLinks)\n                    if (this.editMode) {\n                        alert(\"Redirect: \" + url + \"\\nLinks are disabled in the preview.\");\n                        return;\n                    }\n                if (actions.marker.click.newTab) {\n                    const win = window.open(url, \"_blank\");\n                    win.focus();\n                } else {\n                    window.location.href = url;\n                }\n            }\n        }\n        this.events.trigger(\"click.marker\", marker, [e, marker, this]);\n    }\n    /**\n     * Checks if file exists by provided URL.\n     * @param {string} url\n     * @returns {boolean}\n     *\n     * @private\n     */\n    fileExists(url: string): boolean {\n        if (url.substr(0, 4) == \"data\") return true;\n        const http = new XMLHttpRequest();\n        http.open(\"HEAD\", url, false);\n        http.send();\n        return http.status != 404;\n    }\n\n    /**\n     * Hides all markers\n     * @private\n     */\n    hideMarkers(): void {\n        this.markers.forEach(function (marker) {\n            marker.hide();\n        });\n        $(this.containers.wrap).addClass(\"mapsvg-edit-marker-mode\");\n    }\n    /**\n     * Hides all markers except one.\n     * Used in Map Editor.\n     * @param {string} id - ID of the Marker\n     * @private\n     */\n    hideMarkersExceptOne(id: string): void {\n        this.markers.forEach(function (marker) {\n            if (typeof id === \"undefined\" || (marker.object && id != marker.object.id)) {\n                marker.hide();\n            }\n        });\n\n        $(this.containers.wrap).addClass(\"mapsvg-edit-marker-mode\");\n    }\n    /**\n     * Shows all markers after .hideMarkersExceptOne()\n     * Used in Map Editor.\n     * @private\n     */\n    showMarkers(): void {\n        this.markers.forEach(function (m) {\n            m.show();\n        });\n        this.deselectAllMarkers();\n        // $(this.containers.wrap).removeClass('mapsvg-clusters-hidden');\n        $(this.containers.wrap).removeClass(\"mapsvg-edit-marker-mode\");\n    }\n    /**\n     * Event handler that creates marker on click on the map.\n     * Used in the Map Editor.\n     * @param {object} e - Event object\n     * @returns {boolean}\n     */\n    markerAddClickHandler(e: JQuery.TriggeredEvent): void {\n        // Don't add marker if marker was clicked\n        if ($(e.target).hasClass(\"mapsvg-marker\")) return;\n        const svgPoint = this.getSvgPointAtClick(e);\n        const geoPoint = this.isGeo() ? this.converter.convertSVGToGeo(svgPoint) : null;\n\n        if (!$.isNumeric(svgPoint.x) || !$.isNumeric(svgPoint.y)) return;\n\n        if (this.editingMarker) {\n            if (geoPoint) {\n                this.editingMarker.location.setGeoPoint(geoPoint);\n            } else {\n                this.editingMarker.location.setSvgPoint(svgPoint);\n            }\n            return;\n        }\n        const location = new Location({\n            svgPoint: svgPoint,\n            geoPoint: geoPoint,\n            img: this.options.defaultMarkerImage,\n        });\n\n        const marker = new Marker({\n            location: location,\n            mapsvg: this,\n        });\n        this.markerAdd(marker);\n\n        this.markerEditHandler && this.markerEditHandler.call(location, location);\n    }\n\n    private getSvgPointAtClick(\n        e: JQuery.TriggeredEvent | JQuery.MouseEventBase | MouseEvent\n    ): SVGPoint {\n        const mc = MapSVG.mouseCoords(e);\n        const x = mc.x - $(this.containers.map).offset().left;\n        const y = mc.y - $(this.containers.map).offset().top;\n        const screenPoint = new ScreenPoint(x, y);\n        return this.converter.convertPixelToSVG(screenPoint);\n    }\n\n    /**\n     * Sets default marker image.\n     * Used in Map Editor.\n     * @param {string} src - Image URL\n     * @private\n     */\n    setDefaultMarkerImage(src: string): void {\n        this.options.defaultMarkerImage = src;\n    }\n\n    /**\n     * Checks and remebers if marker images should be set by a field value\n     * @private\n     */\n    setMarkerImagesDependency(): void {\n        this.locationField = this.objectsRepository.schema.getFieldByType(\"location\");\n        // @ts-ignore\n        if (\n            this.locationField &&\n            this.locationField.markersByFieldEnabled &&\n            this.locationField.markerField &&\n            Object.values(this.locationField.markersByField).length > 0\n        ) {\n            this.setMarkersByField = true;\n        } else {\n            this.setMarkersByField = false;\n        }\n    }\n\n    /**\n     * Returns default marker image or marker image by field value if such option is enabled\n     * @param {Number|String} fieldValue\n     * @returns {String} URL of marker image\n     * @private\n     */\n    getMarkerImage(fieldValueOrObject: any, location?: Location): string {\n        let fieldValue;\n\n        if (this.setMarkersByField) {\n            if (typeof fieldValueOrObject === \"object\") {\n                // @ts-ignore\n                fieldValue = fieldValueOrObject[this.locationField.markerField];\n                if (this.locationField.markerField === \"regions\") {\n                    fieldValue = fieldValue[0] && fieldValue[0].id;\n                } else if (typeof fieldValue === \"object\" && fieldValue.length) {\n                    fieldValue = fieldValue[0].value;\n                }\n            } else {\n                fieldValue = fieldValueOrObject;\n            }\n            // @ts-ignore\n            if (this.locationField.markersByField[fieldValue]) {\n                // @ts-ignore\n                return this.locationField.markersByField[fieldValue];\n            }\n        }\n\n        return location && location.imagePath\n            ? location.imagePath\n            : this.options.defaultMarkerImage\n            ? this.options.defaultMarkerImage\n            : MapSVG.urls.root + \"markers/_pin_default.png\";\n    }\n\n    /**\n     * Sets on/off \"edit markers\" mode\n     * @param {bool} on - on/off\n     * @param {bool} clickAddsMarker - defines if click on the map should add a marker\n     * @private\n     */\n    setMarkersEditMode(on: boolean, clickAddsMarker: boolean): void {\n        this.editMarkers.on = MapSVG.parseBoolean(on);\n        this.clickAddsMarker = this.editMarkers.on;\n        this.setEventHandlers();\n    }\n\n    /**\n     * Sets on/off \"edit regions\" mode\n     * Used in Map Editor.\n     * @param {bool} on - on/off\n     *\n     * @private\n     */\n    setRegionsEditMode(on: boolean): void {\n        this.editRegions.on = MapSVG.parseBoolean(on);\n        this.deselectAllRegions();\n        this.setEventHandlers();\n    }\n\n    /**\n     * Enables edit mode (which means that the map is going to be shown in the Map Editor)\n     * Used in the Map Editor.\n     * @param {bool} on\n     * @private\n     */\n    setEditMode(on: boolean): void {\n        this.editMode = on;\n    }\n\n    /**\n     * Enables \"Edit objects\" mode\n     * Used in the Map Editor.\n     * @param {bool} on\n     * @private\n     */\n    setDataEditMode(on: boolean): void {\n        this.editData.on = MapSVG.parseBoolean(on);\n        this.deselectAllRegions();\n        this.setEventHandlers();\n    }\n\n    /**\n     * Downloads SVG file.\n     * @private\n     */\n    download() {\n        window.location.href = window.location.origin + this.options.source;\n    }\n\n    /**\n     * Adjusts popover position. User on zoom and when map container is resized.\n     *\n     */\n    popoverAdjustScreenPosition(): void {\n        if (this.controllers.popover instanceof PopoverController) {\n            this.controllers.popover.adjustScreenPosition();\n        }\n    }\n\n    /**\n     * Moves popover position. User on zoom and when map container is resized.\n     *\n     * @param {number} deltaX\n     * @param {number} deltaY\n     */\n    popoverMoveScreenPositionBy(deltaX: number, deltaY: number): void {\n        if (this.controllers.popover instanceof PopoverController) {\n            this.controllers.popover.moveSrceenPositionBy(deltaX, deltaY);\n        }\n    }\n\n    /**\n     * Shows a popover for provided Region or DB Object.\n     * @param {Region|object} object - Region or DB Object\n     *\n     * @example\n     * var region = mapsvg.getRegion(\"US-TX\");\n     * mapsvg.showPopover(region);\n     */\n    showPopover(object: Region | CustomObject): void {\n        const mapObject =\n            object instanceof Region\n                ? object\n                : object.location && object.location.marker\n                ? object.location.marker\n                : null;\n        if (!mapObject) return;\n\n        let point;\n        if (mapObject instanceof Marker) {\n            point = mapObject.svgPoint;\n        } else {\n            point = mapObject.getCenterSVG();\n        }\n        this.controllers.popover && this.controllers.popover.destroy();\n        this.controllers.popover = new PopoverController({\n            container: this.containers.popover,\n            point: point,\n            yShift: mapObject instanceof Marker ? mapObject.height : 0,\n            template:\n                object instanceof Region\n                    ? this.options.templates.popoverRegion\n                    : this.options.templates.popoverMarker,\n            mapsvg: this,\n            data: object.getData(),\n            mapObject: mapObject,\n            scrollable: true,\n            withToolbar: !(MapSVG.isPhone && this.options.popovers.mobileFullscreen),\n            events: {\n                shown: (popover: PopoverController) => {\n                    if (this.options.popovers.centerOn) {\n                        const shift = popover.containers.main.offsetHeight / 2;\n                        if (\n                            this.options.popovers.centerOn &&\n                            !(MapSVG.isPhone && this.options.popovers.mobileFullscreen)\n                        ) {\n                            this.centerOn(mapObject, shift);\n                        }\n                    }\n                    this.popoverShowingFor = mapObject;\n                    this.events.trigger(\"shown.popover\", this, [this, popover]);\n                    $(window).trigger(\"shown.popover\", [this, popover]);\n                },\n                closed: (popover: PopoverController) => {\n                    this.options.popovers.resetViewboxOnClose && this.viewBoxReset(true);\n                    this.popoverShowingFor = null;\n                    this.events.trigger(\"closed.popover\", this, [this, popover]);\n                },\n                resize: (popover: PopoverController) => {\n                    if (this.options.popovers.centerOn) {\n                        const shift = popover.containers.main.offsetHeight / 2;\n                        if (\n                            this.options.popovers.centerOn &&\n                            !(MapSVG.isPhone && this.options.popovers.mobileFullscreen)\n                        ) {\n                            this.centerOn(mapObject, shift);\n                        }\n                    }\n                },\n            },\n        });\n        this.controllers.popover._init();\n    }\n\n    /**\n     * Hides the popover\n     */\n    hidePopover(): void {\n        this.controllers.popover && this.controllers.popover.close();\n    }\n\n    /**\n     * Event handler that catches clicks outside of the popover and closes the popover.\n     * @param {object} e - Event object\n     */\n    popoverOffHandler(e: JQuery.TriggeredEvent): void {\n        if (\n            this.isScrolling ||\n            $(e.target).closest(\".mapsvg-popover\").length ||\n            $(e.target).hasClass(\"mapsvg-btn-map\")\n        )\n            return;\n        this.controllers.popover && this.controllers.popover.close();\n    }\n\n    /**\n     * Mouseover event handler for Regions and Markers\n     * @param {object} e - Event object\n     * @param {Marker|Region} object\n     * @private\n     */\n    mouseOverHandler(e: JQuery.TriggeredEvent, object: Marker | Region | MarkerCluster): void {\n        if (this.eventsPreventList[\"mouseover\"]) {\n            return;\n        }\n\n        if (object instanceof Marker) {\n            if (this.options.actions.marker.mouseover.showTooltip) {\n                this.showTooltip(object);\n            }\n        }\n\n        if (object instanceof Region) {\n            if (this.options.actions.region.mouseover.showTooltip) {\n                this.showTooltip(object);\n            }\n        }\n\n        let ids: any[];\n        if (this.options.menu.on) {\n            if (this.options.menu.source == \"database\") {\n                if (object instanceof Region && object.objects.length) {\n                    ids = object.objects.map((obj) => {\n                        return obj.id;\n                    });\n                }\n                if (object instanceof Marker) {\n                    ids = object.object ? [object.object.id] : [];\n                }\n            } else {\n                if (object instanceof Region) {\n                    ids = [object.id];\n                }\n                if (\n                    this instanceof Marker &&\n                    // @ts-ignore\n                    object.object.regions &&\n                    // @ts-ignore\n                    object.object.regions.length\n                ) {\n                    // @ts-ignore\n                    ids = object.object.regions.map((obj) => {\n                        return obj.id;\n                    });\n                }\n            }\n            this.controllers.directory.highlightItems(ids);\n        }\n\n        if (object instanceof Region) {\n            if (!object.selected) object.highlight();\n            this.events.trigger(\"mouseover.region\", object, [e, this]);\n        } else {\n            this.highlightMarker(<Marker>object);\n            this.events.trigger(\"mouseover.marker\", object, [e, this]);\n        }\n    }\n\n    public showTooltip(object: Marker | Region | MarkerCluster): void {\n        let name, _object;\n        if (object instanceof Region) {\n            name = \"tooltipRegion\";\n            _object = object;\n        } else if (object instanceof Marker) {\n            name = \"tooltipMarker\";\n            _object = object.object;\n        } else {\n            name = \"tooltipMarker\";\n            _object = object;\n        }\n        if (_object != null && this.popoverShowingFor !== object) {\n            this.controllers.tooltip.setMainTemplate(this.options.templates[name]);\n            this.controllers.tooltip.redraw(_object.getData());\n            this.controllers.tooltip.show();\n        }\n    }\n\n    /**\n     * Mouseout event handler for Regions and Markers\n     * @param {object} e - Event object\n     * @param {Marker|Region} object\n     * @private\n     */\n    mouseOutHandler(e: JQuery.TriggeredEvent, object: Marker | Region | MarkerCluster): void {\n        if (this.eventsPreventList[\"mouseout\"]) {\n            return;\n        }\n\n        if (this.controllers.tooltip) this.controllers.tooltip.hide();\n\n        if (object instanceof Region) {\n            if (!object.selected) object.unhighlight();\n            this.events.trigger(\"mouseout.region\", object, [e, this]);\n        } else {\n            this.unhighlightMarker();\n            this.events.trigger(\"mouseout.marker\", object, [e, this]);\n        }\n\n        let ids: any[];\n        if (this.options.menu.on) {\n            if (this.options.menu.source == \"database\") {\n                if (object instanceof Marker) {\n                    const marker = <Marker>object;\n                    ids = marker.object ? [marker.object.id] : [];\n                }\n            }\n            this.controllers.directory.unhighlightItems();\n        }\n    }\n\n    /**\n     * Prevents provided event from being fired\n     * @param {string} event - Event name\n     * @private\n     */\n    eventsPrevent(event: string): void {\n        this.eventsPreventList[event] = true;\n    }\n\n    /**\n     * Restores event disabled by .eventsPrevent()\n     * @param {string} event - Event name\n     * @private\n     */\n    eventsRestore(event: string): void {\n        if (event) {\n            this.eventsPreventList[event] = false;\n        } else {\n            this.eventsPreventList = {};\n        }\n    }\n\n    /**\n     * Sets all event handlers\n     * @private\n     */\n    setEventHandlers() {\n        const _this = this;\n\n        $(_this.containers.map).off(\".common.mapsvg\");\n        $(_this.containers.scrollpane).off(\".common.mapsvg\");\n        $(document).off(\".scroll.mapsvg\");\n        $(document).off(\".scrollInit.mapsvg\");\n\n        if (_this.editMarkers.on) {\n            $(_this.containers.map).on(\n                \"touchstart.common.mapsvg mousedown.common.mapsvg\",\n                \".mapsvg-marker\",\n                function (e) {\n                    e.originalEvent.preventDefault();\n                    const marker = _this.getMarker($(this).attr(\"id\"));\n                    const startCoords = MapSVG.mouseCoords(e);\n                    marker.drag(startCoords, _this.scale);\n\n                    /*\n                marker.drag(startCoords, _this.scale, function() {\n                    if (_this.mapIsGeo){\n                        var svgPoint = new SVGPoint(this.x + this.width / 2, this.y + (this.height-1));\n                        this.geoCoords = _this.converter.convertSVGToGeo(svgPoint);\n                    }\n                    //_this.markerEditHandler && _this.markerEditHandler.call(this,true);\n                },function(){\n                    //_this.markerEditHandler && _this.markerEditHandler.call(this);\n                });\n\n                 */\n                }\n            );\n        }\n\n        // REGIONS\n        if (!_this.editMarkers.on) {\n            $(_this.containers.map)\n                .on(\"mouseover.common.mapsvg\", \".mapsvg-region\", function (e) {\n                    const id = $(this).attr(\"id\");\n                    _this.mouseOverHandler.call(_this, e, _this.getRegion(id));\n                })\n                .on(\"mouseleave.common.mapsvg\", \".mapsvg-region\", function (e) {\n                    const id = $(this).attr(\"id\");\n                    _this.mouseOutHandler.call(_this, e, _this.getRegion(id));\n                });\n        }\n        if (!_this.editRegions.on) {\n            $(_this.containers.map)\n                .on(\"mouseover.common.mapsvg\", \".mapsvg-marker\", function (e) {\n                    const id = $(this).attr(\"id\");\n                    _this.mouseOverHandler.call(_this, e, _this.getMarker(id));\n                })\n                .on(\"mouseleave.common.mapsvg\", \".mapsvg-marker\", function (e) {\n                    const id = $(this).attr(\"id\");\n                    _this.mouseOutHandler.call(_this, e, _this.getMarker(id));\n                });\n        }\n\n        if (_this.options.scroll.spacebar) {\n            $(document).on(\"keydown.scroll.mapsvg\", function (e) {\n                if (\n                    !(\n                        document.activeElement.tagName === \"INPUT\" &&\n                        $(document.activeElement).attr(\"type\") === \"text\"\n                    ) &&\n                    !_this.isScrolling &&\n                    e.keyCode == 32\n                ) {\n                    e.preventDefault();\n                    $(_this.containers.map).addClass(\"mapsvg-scrollable\");\n                    $(document)\n                        .on(\"mousemove.scrollInit.mapsvg\", function (e: JQuery.TouchEventBase) {\n                            _this.isScrolling = true;\n                            $(document).off(\"mousemove.scrollInit.mapsvg\");\n                            _this.scrollStart(e, _this);\n                        })\n                        .on(\"keyup.scroll.mapsvg\", function (e: JQuery.TouchEventBase) {\n                            if (e.keyCode == 32) {\n                                $(document).off(\"mousemove.scrollInit.mapsvg\");\n                                $(_this.containers.map).removeClass(\"mapsvg-scrollable\");\n                            }\n                        });\n                }\n            });\n        } else if (!_this.options.scroll.on) {\n            if (!_this.editMarkers.on) {\n                $(_this.containers.map).on(\n                    \"touchstart.common.mapsvg\",\n                    \".mapsvg-region\",\n                    function (e) {\n                        _this.scroll.touchScrollStart = $(window).scrollTop();\n                    }\n                );\n                $(_this.containers.map).on(\n                    \"touchstart.common.mapsvg\",\n                    \".mapsvg-marker\",\n                    function (e) {\n                        _this.scroll.touchScrollStart = $(window).scrollTop();\n                    }\n                );\n\n                $(_this.containers.map).on(\n                    \"touchend.common.mapsvg mouseup.common.mapsvg\",\n                    \".mapsvg-region\",\n                    function (e) {\n                        if (e.cancelable) {\n                            e.preventDefault();\n                        }\n                        if (\n                            !_this.scroll.touchScrollStart ||\n                            _this.scroll.touchScrollStart === $(window).scrollTop()\n                        ) {\n                            _this.regionClickHandler(e, _this.getRegion($(this).attr(\"id\")));\n                        }\n                    }\n                );\n                $(_this.containers.map).on(\n                    \"touchend.common.mapsvg mouseup.common.mapsvg\",\n                    \".mapsvg-marker\",\n                    function (e) {\n                        if (e.cancelable) {\n                            e.preventDefault();\n                        }\n                        if (\n                            !_this.scroll.touchScrollStart ||\n                            _this.scroll.touchScrollStart === $(window).scrollTop()\n                        ) {\n                            _this.markerClickHandler.call(\n                                _this,\n                                e,\n                                _this.getMarker($(this).attr(\"id\"))\n                            );\n                        }\n                    }\n                );\n                $(_this.containers.map).on(\n                    \"touchend.common.mapsvg mouseup.common.mapsvg\",\n                    \".mapsvg-marker-cluster\",\n                    function (e) {\n                        if (e.cancelable) {\n                            e.preventDefault();\n                        }\n                        if (\n                            !_this.scroll.touchScrollStart ||\n                            _this.scroll.touchScrollStart == $(window).scrollTop()\n                        ) {\n                            const cluster = $(this).data(\"cluster\");\n                            _this.zoomTo(cluster.markers);\n                        }\n                    }\n                );\n                // }\n            } else {\n                if (_this.clickAddsMarker)\n                    $(_this.containers.map).on(\n                        \"touchend.common.mapsvg mouseup.common.mapsvg\",\n                        function (e) {\n                            // e.stopImmediatePropagation();\n                            if (e.cancelable) {\n                                e.preventDefault();\n                            }\n                            _this.markerAddClickHandler(e);\n                        }\n                    );\n            }\n        } else {\n            $(_this.containers.map).on(\n                \"touchstart.common.mapsvg mousedown.common.mapsvg\",\n                function (e: JQuery.TouchEventBase) {\n                    if (\n                        $(e.target).hasClass(\"mapsvg-popover\") ||\n                        $(e.target).closest(\".mapsvg-popover\").length\n                    ) {\n                        // Prevent even dobule firing touchstart+mousedown on clicking popover close button\n                        if ($(e.target).hasClass(\"mapsvg-popover-close\")) {\n                            if (e.type == \"touchstart\") {\n                                if (e.cancelable) {\n                                    e.preventDefault();\n                                }\n                            }\n                        }\n                        return;\n                    }\n\n                    if (e.type == \"touchstart\") {\n                        if (e.cancelable) {\n                            e.preventDefault();\n                        }\n                    }\n\n                    let obj: any;\n\n                    if (\n                        e.target &&\n                        $(e.target).attr(\"class\") &&\n                        $(e.target).attr(\"class\").indexOf(\"mapsvg-region\") != -1\n                    ) {\n                        obj = _this.getRegion($(e.target).attr(\"id\"));\n                        _this.setObjectClickedBeforeScroll(obj);\n                    } else if (\n                        e.target &&\n                        $(e.target).attr(\"class\") &&\n                        $(e.target).attr(\"class\").indexOf(\"mapsvg-marker\") != -1 &&\n                        $(e.target).attr(\"class\").indexOf(\"mapsvg-marker-cluster\") === -1\n                    ) {\n                        if (_this.editMarkers.on) {\n                            return;\n                        }\n                        obj = _this.getMarker($(e.target).attr(\"id\"));\n                        _this.setObjectClickedBeforeScroll(obj);\n                    } else if (\n                        e.target &&\n                        $(e.target).attr(\"class\") &&\n                        $(e.target).attr(\"class\").indexOf(\"mapsvg-marker-cluster\") != -1\n                    ) {\n                        if (_this.editMarkers.on) {\n                            return;\n                        }\n                        obj = $(e.target).data(\"cluster\");\n                        _this.setObjectClickedBeforeScroll(obj);\n                    }\n                    if (e.type == \"mousedown\") {\n                        _this.scrollStart(e, _this);\n                    } else {\n                        _this.touchStart(e, _this);\n                    }\n                }\n            );\n        }\n\n        //TODO Vyacheslav - переделать под новый choropleth\n        /*\n        $(_this.containers.map).on('mouseover.common.mapsvg', '.mapsvg-choropleth-gradient-wrap', function(e){\n            let currentSegment = _this.options.choropleth.segments[$(e.target).parents('.mapsvg-choropleth-gradient-wrap').data('idx')];\n\n            if (currentSegment.description){\n                _this.showTooltip(currentSegment.description);\n            }\n        });\n        */\n\n        $(_this.containers.map).on(\n            \"mouseleave.common.mapsvg\",\n            \".mapsvg-choropleth-gradient-wrap\",\n            (e) => {\n                this.controllers.tooltip.hide();\n            }\n        );\n    }\n\n    setLabelsRegions(options?: any): void {\n        options = options || this.options.labelsRegions;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        $.extend(true, this.options, { labelsRegions: options });\n\n        if (this.options.labelsRegions.on) {\n            this.regions.forEach((region) => {\n                if (!region.label) {\n                    region.label = jQuery('<div class=\"mapsvg-region-label\" />')[0];\n                    $(this.layers.labels).append(region.label);\n                }\n                try {\n                    $(region.label).html(this.templates.labelRegion(region.forTemplate()));\n                } catch (err) {\n                    console.error('MapSVG: Error in the \"Region Label\" template');\n                }\n            });\n            this.labelsRegionsAdjustScreenPosition();\n        } else {\n            this.regions.forEach((region) => {\n                if (region.label) {\n                    $(region.label).remove();\n                    region.label = null;\n                    delete region.label;\n                }\n            });\n        }\n    }\n\n    /**\n     * Sets Marker labels\n     * @param {object} options\n     */\n    setLabelsMarkers(options?: any): void {\n        options = options || this.options.labelsMarkers;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        $.extend(true, this.options, { labelsMarkers: options });\n\n        if (this.options.labelsMarkers.on) {\n            this.markers.forEach((marker: Marker) => {\n                try {\n                    marker.setLabel(this.templates.labelMarker(marker.object));\n                } catch (err) {\n                    console.error('MapSVG: Error in the \"Marker Label\" template');\n                }\n            });\n        } else {\n            this.markers.forEach((marker: Marker) => {\n                marker.setLabel(\"\");\n            });\n        }\n    }\n\n    /**\n     * Adds a layer to the map that may contain some objects.\n     * @private\n     */\n    addLayer(name: string): HTMLElement {\n        this.layers[name] = $('<div class=\"mapsvg-layer mapsvg-layer-' + name + '\"></div>')[0];\n        this.containers.layers.appendChild(this.layers[name]);\n        return this.layers[name];\n    }\n\n    /**\n     * Returns layer by provided name\n     * @param name\n     */\n    getLayer(name: string): HTMLElement {\n        return this.layers[name];\n    }\n\n    /**\n     * Returns Database\n     * @example\n     * var objects = mapsvg.getDb().getLoaded();\n     * var object  = mapsvg.getDb().getLoadedObject(12);\n     *\n     * // Filter DB by region \"US-TX\". This automatically triggers markers and directory reloading\n     * mapsvg.getDatabase().getAll({filters: {regions: \"US-TX\"}});\n     */\n    getDb(): CustomObjectsRepository {\n        return this.objectsRepository;\n    }\n\n    /**\n     * Returns Regions database\n     */\n    getDbRegions(): RegionsRepository {\n        return this.regionsRepository;\n    }\n\n    /**\n     * Adds an SVG object as Region to MapSVG\n     * @param {object} svgObject - SVG Object\n     * @returns {Region}\n     * @private\n     */\n    regionAdd(\n        svgObject:\n            | SVGPathElement\n            | SVGCircleElement\n            | SVGEllipseElement\n            | SVGRectElement\n            | SVGPolygonElement\n            | SVGPolylineElement\n    ) {\n        const region = new Region(svgObject, this);\n        region.setStatus(1);\n        this.regions.push(region);\n        this.regions.sort(function (a, b) {\n            return a.id == b.id ? 0 : +(a.id > b.id) || -1;\n        });\n        return region;\n    }\n\n    /**\n     * Deletes a Region from the map\n     * @param {string} id - Region ID\n     * @private\n     */\n    regionDelete(id: string): void {\n        if (this.regions.findById(id)) {\n            this.regions.findById(id).elem.remove();\n            this.regions.delete(id);\n        } else if ($(\"#\" + id).length) {\n            $(\"#\" + id).remove();\n        }\n    }\n    /**\n     * Reloads Regions from SVG file\n     */\n    reloadRegions(): void {\n        // this.regions.forEach(function (r: Region) {\n        //     $(r.element).css({ \"stroke-width\": r.style[\"stroke-width\"] });\n        // });\n        this.regions.clear();\n        $(this.containers.svg).find(\".mapsvg-region\").removeClass(\"mapsvg-region\");\n        $(this.containers.svg)\n            .find(\".mapsvg-region-disabled\")\n            .removeClass(\"mapsvg-region-disabled\");\n        $(this.containers.svg)\n            .find(\"path, polygon, circle, ellipse, rect\")\n            .each((index: number, element: HTMLElement) => {\n                // @ts-ignore\n                const elem = <SVGElement>element;\n                if ($(elem).closest(\"defs\").length) return;\n                if (elem.getAttribute(\"data-stroke-width\")) {\n                    elem.style[\"stroke-width\"] = elem.getAttribute(\"data-stroke-width\");\n                }\n                if (elem.getAttribute(\"id\")) {\n                    if (\n                        !this.options.regionPrefix ||\n                        (this.options.regionPrefix &&\n                            elem.getAttribute(\"id\").indexOf(this.options.regionPrefix) === 0)\n                    ) {\n                        const region = new Region(elem, this);\n                        this.regions.push(region);\n                    }\n                }\n            });\n    }\n    /**\n     * Reloads Regions data\n     */\n    reloadRegionsFull(): void {\n        const statuses = this.regionsRepository.getSchema().getFieldByType(\"status\");\n\n        this.regions.forEach((region) => {\n            const _region = <CustomObject>this.regionsRepository.getLoaded().findById(region.id);\n\n            if (_region) {\n                region.setData(_region);\n                if (statuses && _region.status !== undefined && _region.status !== null) {\n                    region.setStatus(_region.status);\n                }\n            } else {\n                if (\n                    this.options.filters.filteredRegionsStatus ||\n                    this.options.filters.filteredRegionsStatus === 0 ||\n                    (this.options.menu.source === \"regions\" &&\n                        this.options.menu.filterout &&\n                        this.options.menu.filterout.field === \"status\" &&\n                        this.options.menu.filterout.val) ||\n                    this.options.menu.filterout.val === 0\n                ) {\n                    const status =\n                        this.options.filters.filteredRegionsStatus ||\n                        this.options.filters.filteredRegionsStatus === 0\n                            ? this.options.filters.filteredRegionsStatus\n                            : this.options.menu.filterout.val;\n                    region.setStatus(status);\n                }\n            }\n        });\n\n        this.loadDirectory();\n        this.setChoropleth();\n        this.setLayersControl();\n        this.setGroups();\n        if (this.options.labelsRegions.on) {\n            this.setLabelsRegions();\n        }\n    }\n\n    /**\n     * Fix \"fit markers\" view world screen offset\n     * @private\n     */\n    fixMarkersWorldScreen(): void {\n        if (this.googleMaps.map)\n            setTimeout(() => {\n                const markers = { left: 0, right: 0, leftOut: 0, rightOut: 0 };\n                if (this.markers.length > 1) {\n                    this.markers.forEach((m: Marker) => {\n                        if (\n                            $(m.element).offset().left <\n                            $(this.containers.map).offset().left +\n                                this.containers.map.clientWidth / 2\n                        ) {\n                            markers.left++;\n                            if ($(m.element).offset().left < $(this.containers.map).offset().left) {\n                                markers.leftOut++;\n                            }\n                        } else {\n                            markers.right++;\n                            if (\n                                $(m.element).offset().left >\n                                $(this.containers.map).offset().left +\n                                    this.containers.map.clientWidth\n                            ) {\n                                markers.rightOut++;\n                            }\n                        }\n                    });\n\n                    if (\n                        (markers.left === 0 && markers.rightOut) ||\n                        (markers.right === 0 && markers.leftOut)\n                    ) {\n                        const k = markers.left === 0 ? 1 : -1;\n                        const ww =\n                            (this.svgDefault.viewBox.width / this.converter.mapLonDelta) *\n                            360 *\n                            this.getScale();\n                        this.googleMaps.map.panBy(k * ww, 0);\n                    }\n                }\n            }, 600);\n    }\n\n    /**\n     * Updates map options from old version of MapSVG\n     * @param options\n     * @private\n     */\n    updateOutdatedOptions(options) {\n        // Fix Directory options\n        if (options.menu && (options.menu.position || options.menu.customContainer)) {\n            if (options.menu.customContainer) {\n                options.menu.location = \"custom\";\n            } else {\n                options.menu.position = options.menu.position === \"left\" ? \"left\" : \"right\";\n                options.menu.location =\n                    options.menu.position === \"left\" ? \"leftSidebar\" : \"rightSidebar\";\n                if (!options.containers || !options.containers[options.menu.location]) {\n                    options.containers = options.containers || {};\n                    options.containers[options.menu.location] = { on: false, width: \"200px\" };\n                }\n                options.containers[options.menu.location].width = options.menu.width;\n                if (MapSVG.parseBoolean(options.menu.on)) {\n                    options.containers[options.menu.location].on = true;\n                }\n            }\n            delete options.menu.position;\n            delete options.menu.width;\n            delete options.menu.customContainer;\n        }\n        // Fix Details View options\n        if (\n            options.detailsView &&\n            (options.detailsView.location === \"mapContainer\" ||\n                options.detailsView.location === \"near\" ||\n                options.detailsView.location === \"top\")\n        ) {\n            options.detailsView.location = \"map\";\n        }\n        // Transfer zoom options to controls options\n        if (!options.controls) {\n            options.controls = {};\n            options.controls.zoom =\n                options.zoom &&\n                options.zoom.on &&\n                (!options.zoom.buttons || options.zoom.buttons.location !== \"hide\");\n            options.controls.location =\n                options.zoom && options.zoom.buttons && options.zoom.buttons.location !== \"hide\"\n                    ? options.zoom.buttons.location\n                    : \"right\";\n        }\n        // Transfer zoom options to controls options\n        if (options.colors && !options.colors.markers) {\n            options.colors.markers = {\n                base: { opacity: 100, saturation: 100 },\n                hovered: { opacity: 100, saturation: 100 },\n                unhovered: { opacity: 100, saturation: 100 },\n                active: { opacity: 100, saturation: 100 },\n                inactive: { opacity: 100, saturation: 100 },\n            };\n        }\n        if (options.tooltipsMode) {\n            options.tooltips.mode = options.tooltipsMode;\n            delete options.tooltipsMode;\n        }\n        if (options.popover) {\n            options.popovers = options.popover;\n            delete options.popover;\n        }\n    }\n\n    /**\n     * Initialization. Map rendering happens here. Gets called on map creation.\n     * @param {MapOptionsInterface} options - Map options\n     * @param {HTMLElement} elem\n     * @returns {*}\n     * @private\n     */\n    init(): MapSVGMap {\n        MapSVG.addInstance(this);\n\n        if (this.options.source === \"\") {\n            throw new Error(\"MapSVG: please provide SVG file source.\");\n        }\n\n        this.disableAnimation();\n\n        this.setEvents(this.options.events);\n        this.events.trigger(\"beforeLoad\");\n\n        // TODO load only when filters are on\n        if (\n            this.options.googleMaps.apiKey &&\n            (this.editMode ||\n                this.options.googleMaps.on ||\n                (this.options.filters.on &&\n                    this.options.filtersSchema &&\n                    this.options.filtersSchema.find((f) => f.type === \"distance\")))\n        ) {\n            this.loadGoogleMapsAPI(\n                () => {\n                    return 1;\n                },\n                () => {\n                    return 1;\n                }\n            );\n        }\n\n        this.containers.map.classList.add(\"mapsvg\");\n\n        this.setCss();\n\n        if (this.options.colors && this.options.colors.background) {\n            this.containers.map.style.background = this.options.colors.background;\n        }\n\n        this.setContainers(this.options.containers);\n        this.setColors();\n\n        this.addLoadingMessage();\n\n        this.addLayer(\"markers\");\n        this.addLayer(\"labels\");\n        this.addLayer(\"bubbles\");\n        this.addLayer(\"popovers\");\n        this.addLayer(\"scrollpane\");\n\n        this.loadExtensions();\n\n        // GET the map by ajax request\n        $.ajax({ url: this.options.source + \"?v=\" + this.svgFileLastChanged })\n            .fail((resp) => {\n                this.svgLoadingFailed(resp);\n            })\n            .done((xmlData) => {\n                this.renderSvgData(xmlData);\n            });\n\n        return this;\n    }\n\n    getContainer(name: string): HTMLElement {\n        return this.containers[name];\n    }\n\n    private renderSvgData(xmlData) {\n        // Default width/height/viewBox from SVG\n        const svgTag = $(xmlData).find(\"svg\");\n        this.containers.svg = svgTag[0];\n\n        if (svgTag.attr(\"width\") && svgTag.attr(\"height\")) {\n            this.svgDefault.width = parseFloat(svgTag.attr(\"width\").replace(/px/g, \"\"));\n            this.svgDefault.height = parseFloat(svgTag.attr(\"height\").replace(/px/g, \"\"));\n            this.svgDefault.viewBox = svgTag.attr(\"viewBox\")\n                ? new ViewBox(svgTag.attr(\"viewBox\").split(\" \"))\n                : new ViewBox(0, 0, this.svgDefault.width, this.svgDefault.height);\n        } else if (svgTag.attr(\"viewBox\")) {\n            this.svgDefault.viewBox = new ViewBox(svgTag.attr(\"viewBox\").split(\" \"));\n            this.svgDefault.width = this.svgDefault.viewBox.width;\n            this.svgDefault.height = this.svgDefault.viewBox.height;\n        } else {\n            const msg =\n                \"MapSVG: width/height and viewBox are missing in the SVG file. Can't parse the file because of that.\";\n            if (this.editMode) {\n                alert(msg);\n            } else {\n                console.error(msg);\n            }\n            return false;\n        }\n\n        this.geoViewBox = this.getGeoViewBoxFromSvgTag(this.containers.svg);\n\n        if (this.options.viewBox && this.options.viewBox.length == 4) {\n            this._viewBox = new ViewBox(this.options.viewBox);\n        } else {\n            this._viewBox = new ViewBox(this.svgDefault.viewBox);\n        }\n\n        svgTag.attr(\"preserveAspectRatio\", \"xMidYMid meet\");\n        svgTag.removeAttr(\"width\");\n        svgTag.removeAttr(\"height\");\n        $(this.containers.scrollpane).append(svgTag);\n        this.setStrokes();\n\n        this.reloadRegions();\n\n        this.setSize(this.options.width, this.options.height, this.options.responsive);\n\n        if (this.options.disableAll) {\n            this.setDisableAll(true);\n        }\n\n        this.setViewBox(this._viewBox);\n\n        // Create Converter instance\n        this.converter = new Converter(this.containers.map, this.svgDefault.viewBox, this.viewBox);\n        if (this.geoViewBox) {\n            this.converter.setGeoViewBox(this.geoViewBox);\n        }\n\n        this.setResponsive(this.options.responsive);\n        this.setScroll(this.options.scroll, true);\n        this.setZoom(this.options.zoom);\n        this.setControls(this.options.controls);\n        this.setGoogleMaps();\n        this.setTooltips(this.options.tooltips);\n        this.setPopovers(this.options.popovers);\n        if (this.options.cursor) this.setCursor(this.options.cursor);\n        this.setTemplates(this.options.templates);\n        this.loadExtensions();\n\n        this.filtersSchema = new Schema({ fields: this.options.filtersSchema });\n\n        this.objectsRepository.events.on(\"load\", () => {\n            this.showLoadingMessage();\n        });\n        this.objectsRepository.events.on(\"loaded\", () => {\n            this.setGlobalDistanceFilter();\n            this.fitOnDataLoadDone = false;\n            this.addLocations();\n            this.fixMarkersWorldScreen();\n            // this.addDataObjectsAsMarkers();\n            this.attachDataToRegions();\n            this.loadDirectory();\n            if (this.options.labelsMarkers.on) {\n                this.setLabelsMarkers();\n            }\n            // Check if there's a call to \"{{objects}}\" inside of the labelRegion template\n            // and if it's found then reload Region Labels\n            if (this.options.templates.labelRegion.indexOf(\"{{objects\") !== -1) {\n                this.setLabelsRegions();\n            }\n            if (\n                this.options.filters.on &&\n                this.options.filters.source === \"database\" &&\n                this.controllers.filters &&\n                this.controllers.filters.hideFilters\n            ) {\n                this.controllers.filters.setFiltersCounter();\n            }\n            this.hideLoadingMessage();\n            this.events.trigger(\"databaseLoaded\");\n\n            this.updateFiltersState();\n            this.setChoropleth();\n        });\n        this.objectsRepository.events.on(\"schemaChanged\", () => {\n            this.objectsRepository.reload();\n        });\n        this.objectsRepository.events.on(\"updated\", (obj) => {\n            this.attachDataToRegions(obj);\n            this.reloadRegionsFull();\n        });\n        this.objectsRepository.events.on(\"created\", (obj: CustomObject) => {\n            this.attachDataToRegions(obj);\n            this.reloadRegionsFull();\n        });\n        this.objectsRepository.events.on(\"deleted\", (id: number) => {\n            this.attachDataToRegions();\n            this.reloadRegionsFull();\n        });\n\n        this.regionsRepository.events.on(\"load\", () => {\n            this.showLoadingMessage();\n        });\n        this.regionsRepository.events.on(\"loaded\", () => {\n            this.hideLoadingMessage();\n\n            this.reloadRegionsFull();\n            if (\n                this.options.filters.on &&\n                this.options.filters.source === \"regions\" &&\n                this.controllers.filters &&\n                this.controllers.filters.hideFilters\n            ) {\n                this.controllers.filters.setFiltersCounter();\n            }\n            this.events.trigger(\"regionsLoaded\");\n        });\n        this.regionsRepository.events.on(\"updated\", (regionData) => {\n            this.reloadRegionsFull();\n        });\n        this.regionsRepository.events.on(\"created\", (regionData) => {\n            this.reloadRegionsFull();\n        });\n        this.regionsRepository.events.on(\"deleted\", (regionData) => {\n            this.reloadRegionsFull();\n        });\n\n        this.setMenu();\n        this.setFilters();\n        this.setFilterOut();\n\n        this.setEventHandlers();\n\n        // The initial map loading process is finished, remove the first afterLoad blocker\n        this.afterLoadBlockers--;\n\n        if (!this.id) {\n            this.finalizeMapLoading();\n            return;\n        }\n\n        if (!this.options.data_regions) {\n            this.regionsRepository.find().done((data) => {\n                this.afterLoadBlockers--;\n                this.finalizeMapLoading();\n            });\n        } else {\n            this.regionsRepository.loadDataFromResponse(this.options.data_regions);\n            this.afterLoadBlockers--;\n        }\n\n        if (!this.options.data_objects) {\n            if (this.options.database.loadOnStart || this.editMode) {\n                this.objectsRepository.find().done((data) => {\n                    this.afterLoadBlockers--;\n                    this.finalizeMapLoading();\n                });\n            } else {\n                this.afterLoadBlockers--;\n                this.finalizeMapLoading();\n            }\n        } else {\n            if (this.editMode || this.options.database.loadOnStart) {\n                this.objectsRepository.loadDataFromResponse(this.options.data_objects);\n                this.afterLoadBlockers--;\n            } else {\n                this.afterLoadBlockers--;\n            }\n            delete this.options.data_regions;\n            delete this.options.data_objects;\n            this.finalizeMapLoading();\n        }\n    }\n\n    private setFilterOut() {\n        if (this.options.menu.filterout.field) {\n            const f = {};\n            f[this.options.menu.filterout.field] = this.options.menu.filterout.val;\n            if (this.options.menu.source == \"regions\") {\n                // this.regionsRepository.query.setFilterOut(f);\n            } else {\n                this.objectsRepository.query.setFilterOut(f);\n            }\n        } else {\n            this.objectsRepository.query.setFilterOut(null);\n        }\n    }\n\n    private getGeoViewBoxFromSvgTag(svgTag: SVGSVGElement): GeoViewBox | null {\n        const geo = $(svgTag).attr(\"mapsvg:geoViewBox\") || $(svgTag).attr(\"mapsvg:geoviewbox\");\n        if (geo) {\n            const geoParts = geo.split(\" \").map((p) => parseFloat(p));\n            if (geoParts.length == 4) {\n                this.mapIsGeo = true;\n                this.geoCoordinates = true;\n\n                const sw = new GeoPoint(geoParts[3], geoParts[0]);\n                const ne = new GeoPoint(geoParts[1], geoParts[2]);\n                return new GeoViewBox(sw, ne);\n            }\n        } else {\n            return null;\n        }\n    }\n\n    private svgLoadingFailed(resp: JQueryXHR) {\n        if (resp.status == 404) {\n            let msg =\n                \"MapSVG: file not found - \" +\n                this.options.source +\n                \"\\n\\nIf you moved MapSVG from another server please read the following docs page: https://mapsvg.com/docs/installation/moving\";\n            if (this.editMode) {\n                msg +=\n                    \"\\n\\nIf you know the correct path for the SVG file, please write it and press OK:\";\n                const oldSvgPath = this.options.source;\n                const userSvgPath = prompt(msg, oldSvgPath);\n                if (userSvgPath !== null) {\n                    $.ajax({ url: userSvgPath + \"?v=\" + this.svgFileLastChanged })\n                        .fail(function () {\n                            location.reload();\n                        })\n                        .done((xmlData) => {\n                            this.options.source = userSvgPath;\n                            this.renderSvgData(xmlData);\n                            const mapsRepo = new MapsRepository();\n                            mapsRepo.update(this);\n                        });\n                } else {\n                    location.reload();\n                }\n            } else {\n                console.error(msg);\n            }\n        } else {\n            const msg =\n                \"MapSVG: can't load SVG file for unknown reason. Please contact support: https://mapsvg.ticksy.com\";\n            if (this.editMode) {\n                alert(msg);\n            } else {\n                console.error(msg);\n            }\n        }\n    }\n\n    private addLoadingMessage() {\n        this.containers.loading = document.createElement(\"div\");\n        this.containers.loading.className = \"mapsvg-loading\";\n\n        const loadingTextBlock = document.createElement(\"div\");\n        loadingTextBlock.className = \"mapsvg-loading-text\";\n        loadingTextBlock.innerHTML = this.options.loadingText;\n\n        const spinner = document.createElement(\"div\");\n        spinner.className = \"spinner-border spinner-border-sm\";\n\n        this.containers.loading.appendChild(spinner);\n        this.containers.loading.appendChild(loadingTextBlock);\n\n        this.containers.map.appendChild(this.containers.loading);\n\n        if (this.options.googleMaps.on) {\n            $(this.containers.map).addClass(\"mapsvg-google-map-loading\");\n        }\n    }\n    private hideLoadingMessage() {\n        $(this.containers.loading).hide();\n    }\n    private showLoadingMessage() {\n        $(this.containers.loading).show();\n    }\n\n    private disableAnimation() {\n        this.containers.map.classList.add(\"no-transitions\");\n    }\n    private enableAnimation() {\n        $(this.containers.map).removeClass(\"no-transitions\");\n    }\n\n    private loadExtensions() {\n        // Load extension (common things)\n        // @ts-ignore\n        if (\n            this.options.extension &&\n            // @ts-ignore\n            $().mapSvg.extensions &&\n            // @ts-ignore\n            $().mapSvg.extensions[_this.options.extension]\n        ) {\n            // @ts-ignore\n            const ext = $().mapSvg.extensions[_this.options.extension];\n            ext && ext.common(this);\n        }\n    }\n\n    /**\n     * Final stage of initialization.\n     * Initialization is split into 2 steps because the 1st step contains async ajax request.\n     * When the ajax requires is done, the final initialization step is called.\n     * @private\n     */\n    finalizeMapLoading(): void {\n        if (this.afterLoadBlockers > 0 || this.loaded) {\n            return;\n        }\n\n        this.selectRegionByIdFromUrl();\n\n        setTimeout(() => {\n            this.movingItemsAdjustScreenPosition();\n            this.adjustStrokes();\n            setTimeout(() => {\n                this.hideLoadingMessage();\n                $(this.containers.loading).find(\".mapsvg-loading-text\").hide();\n                this.enableAnimation();\n            }, 200);\n        }, 100);\n\n        this.loaded = true;\n        this.events.trigger(\"afterLoad\");\n    }\n\n    private selectRegionByIdFromUrl() {\n        const match = RegExp(\"[?&]mapsvg_select=([^&]*)\").exec(window.location.search);\n        if (match) {\n            const select = decodeURIComponent(match[1].replace(/\\+/g, \" \"));\n            this.selectRegion(select);\n        }\n        if (window.location.hash) {\n            const query = window.location.hash.replace(\"#/m/\", \"\");\n            const region = this.getRegion(query);\n            if (region && this.options.actions.map.afterLoad.selectRegion) {\n                this.regionClickHandler(null, region);\n            }\n        }\n    }\n\n    createForm(options): FormBuilder {\n        return new FormBuilder(options);\n    }\n    getApiUrl(path: string): string {\n        const server = new Server();\n        return server.getUrl(path);\n    }\n    getConverter(): Converter {\n        return this.converter;\n    }\n\n    /**\n     * Old choropleth methods\n     */\n\n    /**\n     * Sets choropleth map options\n     * @param {object} options\n     *\n     * @example\n     * mapsvg.setGauge({\n     *   on: true,\n     *   colors: {\n     *     high: \"#FF0000\",\n     *     low: \"#00FF00\"\n     *   }\n     *   labels: {\n     *     high: \"high\",\n     *     low: \"low\"\n     *   }\n     * });\n     */\n    setChoropleth(options?: any) {\n        const _this = this;\n\n        options = options || _this.options.choropleth;\n        options.on != undefined && (options.on = MapSVG.parseBoolean(options.on));\n        $.extend(true, _this.options, { choropleth: options });\n\n        let needsRedraw = false;\n\n        if (!_this.$gauge) {\n            _this.$gauge = {};\n            _this.$gauge.gradient = $(\"<td>&nbsp;</td>\").addClass(\"mapsvg-gauge-gradient\");\n            _this.setGaugeGradientCSS();\n            _this.$gauge.container = $(\"<div />\").addClass(\"mapsvg-gauge\").hide();\n            _this.$gauge.table = $(\"<table />\");\n            const tr = $(\"<tr />\");\n            _this.$gauge.labelLow = $(\"<td>\" + _this.options.choropleth.labels.low + \"</td>\");\n            _this.$gauge.labelHigh = $(\"<td>\" + _this.options.choropleth.labels.high + \"</td>\");\n            tr.append(_this.$gauge.labelLow);\n            tr.append(_this.$gauge.gradient);\n            tr.append(_this.$gauge.labelHigh);\n            _this.$gauge.table.append(tr);\n            _this.$gauge.container.append(_this.$gauge.table);\n            $(_this.containers.map).append(_this.$gauge.container);\n        }\n\n        if (!_this.options.choropleth.on && _this.$gauge.container.is(\":visible\")) {\n            _this.$gauge.container.hide();\n            needsRedraw = true;\n        } else if (_this.options.choropleth.on && !_this.$gauge.container.is(\":visible\")) {\n            _this.$gauge.container.show();\n            needsRedraw = true;\n            _this.regionsRepository.events.on(\"change\", function () {\n                _this.redrawGauge();\n            });\n        }\n\n        if (options.colors) {\n            _this.options.choropleth.colors.lowRGB = tinycolor(\n                _this.options.choropleth.colors.low\n            ).toRgb();\n            _this.options.choropleth.colors.highRGB = tinycolor(\n                _this.options.choropleth.colors.high\n            ).toRgb();\n            _this.options.choropleth.colors.diffRGB = {\n                r:\n                    _this.options.choropleth.colors.highRGB.r -\n                    _this.options.choropleth.colors.lowRGB.r,\n                g:\n                    _this.options.choropleth.colors.highRGB.g -\n                    _this.options.choropleth.colors.lowRGB.g,\n                b:\n                    _this.options.choropleth.colors.highRGB.b -\n                    _this.options.choropleth.colors.lowRGB.b,\n                a:\n                    _this.options.choropleth.colors.highRGB.a -\n                    _this.options.choropleth.colors.lowRGB.a,\n            };\n            needsRedraw = true;\n            _this.$gauge && _this.setGaugeGradientCSS();\n        }\n\n        if (options.labels) {\n            _this.$gauge.labelLow.html(_this.options.choropleth.labels.low);\n            _this.$gauge.labelHigh.html(_this.options.choropleth.labels.high);\n        }\n\n        needsRedraw && _this.redrawGauge();\n    }\n\n    /**\n     * Redraws choropleth map colors\n     * @private\n     */\n    redrawGauge() {\n        const _this = this;\n\n        _this.updateGaugeMinMax();\n        _this.regionsRedrawColors();\n    }\n\n    /**\n     * Updates min/max values of Region choropleth fields\n     * @private\n     */\n    updateGaugeMinMax() {\n        const _this = this;\n\n        _this.options.choropleth.min = 0;\n        _this.options.choropleth.max = false;\n        const values = [];\n        _this.regions.forEach(function (r) {\n            const gauge = r.data && r.data[_this.options.regionChoroplethField];\n            gauge != undefined && values.push(gauge);\n        });\n        if (values.length > 0) {\n            _this.options.choropleth.min = values.length == 1 ? 0 : Math.min.apply(null, values);\n            _this.options.choropleth.max = Math.max.apply(null, values);\n            _this.options.choropleth.maxAdjusted =\n                _this.options.choropleth.max - _this.options.choropleth.min;\n        }\n    }\n    /**\n     * Sets gradient for choropleth map\n     * @private\n     */\n    setGaugeGradientCSS() {\n        const _this = this;\n\n        _this.$gauge.gradient.css({\n            background:\n                \"linear-gradient(to right,\" +\n                _this.options.choropleth.colors.low +\n                \" 1%,\" +\n                _this.options.choropleth.colors.high +\n                \" 100%)\",\n            filter:\n                'progid:DXImageTransform.Microsoft.gradient( startColorstr=\"' +\n                _this.options.choropleth.colors.low +\n                '\", endColorstr=\"' +\n                _this.options.choropleth.colors.high +\n                '\",GradientType=1 )',\n        });\n    }\n\n    /**\n     * Below is a set of getters and methods for backward compatibility\n     */\n\n    get $map() {\n        return $(this.getContainer(\"map\"));\n    }\n\n    get $svg() {\n        return $(this.getContainer(\"svg\"));\n    }\n\n    get $popover() {\n        return $(this.getContainer(\"popover\"));\n    }\n\n    get $details() {\n        return $(this.getContainer(\"detailsView\"));\n    }\n\n    get $directory() {\n        return $(this.getContainer(\"directory\"));\n    }\n\n    get database() {\n        return this.objectsRepository;\n    }\n\n    get regionsDatabase() {\n        return this.regionsRepository;\n    }\n}\n\nexport {\n    MapSVGMap as map,\n    MapSVGMap as MapSVGMap,\n    MapsRepository as mapsRepository,\n    MapsV2Repository as mapsV2Repository,\n    Repository as repository,\n    SchemaRepository as schemaRepository,\n    MapSVG as globals,\n    Marker as marker,\n    Location as location,\n    Server as server,\n    ArrayIndexed as arrayIndexed,\n    Schema as schema,\n    Query as query,\n    ScreenPoint as screenPoint,\n    SVGPoint as svgPoint,\n    GeoPoint as geoPoint,\n    FormBuilder as formBuilder,\n    CustomObject as customObject,\n};\n"],"names":["$","Sortable","CodeMirror.fromTextArea","FormElementTypes.CheckboxFormElement","FormElementTypes.CheckboxesFormElement","FormElementTypes.DateFormElement","FormElementTypes.DistanceFormElement","FormElementTypes.EmptyFormElement","FormElementTypes.IdFormElement","FormElementTypes.ImagesFormElement","FormElementTypes.LocationFormElement","FormElementTypes.ModalFormElement","FormElementTypes.PostFormElement","FormElementTypes.RadioFormElement","FormElementTypes.RegionsFormElement","FormElementTypes.SaveFormElement","FormElementTypes.SearchFormElement","FormElementTypes.SelectFormElement","FormElementTypes.StatusFormElement","FormElementTypes.TextFormElement","FormElementTypes.TextareaFormElement","FormElementTypes.TitleFormElement","FormElementTypes.ColorPickerFormElement"],"mappings":"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"}