{"version":3,"file":"blockpage_main-5abd44f30df8564aa9dc.js","mappings":"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","sources":["webpack://emmet/webpack/runtime/chunk loaded","webpack://emmet/webpack/runtime/create fake namespace object","webpack://emmet/./moderna_meteogrid/statix/js/base.mjs","webpack://emmet/./simmer/statix/simmer/js/simmerlayer.mjs","webpack://emmet/./simmer/statix/simmer/js/ol_control_searchES.js","webpack://emmet/./simmer/statix/simmer/js/simulaciones.mjs","webpack://emmet/./saver/statix/js/mapa_elementos.mjs","webpack://emmet/./simmer/statix/simmer/js/mapa.mjs","webpack://emmet/./saver/statix/js/saver_layers.mjs","webpack://emmet/./simmer/statix/simmer/js/timeline.mjs","webpack://emmet/./simmer/statix/simmer/js/measurer.js","webpack://emmet/./simmer/statix/simmer/js/GraphControl.mjs","webpack://emmet/./simmer/statix/simmer/js/informes.mjs","webpack://emmet/./simmer/statix/simmer/js/graphic_page.mjs","webpack://emmet/./simmer/statix/simmer/js/blockpage_main.mjs","webpack://emmet/webpack/bootstrap","webpack://emmet/webpack/runtime/define property getters","webpack://emmet/webpack/runtime/ensure chunk","webpack://emmet/webpack/runtime/global","webpack://emmet/webpack/runtime/hasOwnProperty shorthand","webpack://emmet/webpack/runtime/make namespace object","webpack://emmet/webpack/runtime/node module decorator","webpack://emmet/webpack/runtime/runtimeId","webpack://emmet/webpack/runtime/jsonp chunk loading","webpack://emmet/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","/*eslint no-implicit-globals: \"error\"*/\nimport { jQuery } from 'jquery';\nimport(\"multiselect\");\njQuery.isFunction = function (func) {\n  return typeof func === \"function\";\n}\njQuery.trim = String.prototype.trim;\nimport(\"jquery.quicksearch\");\nimport 'multiselect/css/multi-select.css';\n// export for others scripts to use\nconst $ = window.$ = jQuery;\nwindow.jQuery = jQuery;\nimport proj4 from 'proj4';\nimport flatpickr from 'flatpickr';\nimport dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\ndayjs.extend(customParseFormat)\n\nimport utc from 'dayjs/plugin/utc'\nimport duration from 'dayjs/plugin/duration'\nimport pluralGetSet from 'dayjs/plugin/pluralGetSet'\nimport 'dayjs/locale/es'\nimport 'dayjs/locale/de'\nimport 'dayjs/locale/es'\nimport 'dayjs/locale/en'\n\nimport langMap_en from 'flatpickr/dist/l10n/default';\nimport langMap_es from 'flatpickr/dist/l10n/es';\nimport langMap_fr from 'flatpickr/dist/l10n/fr';\nimport langMap_cat from 'flatpickr/dist/l10n/cat';\n\nimport dt_es from 'datatables.net-plugins/i18n/es-ES';\nimport dt_pt from 'datatables.net-plugins/i18n/pt-PT';\nimport dt_fr from 'datatables.net-plugins/i18n/fr-FR';\nimport dt_ca from 'datatables.net-plugins/i18n/ca';\n\nimport \"select2/dist/js/select2.min.js\"\nimport \"select2/dist/css/select2.min.css\"\n\nimport \"bootstrap\"\nimport \"bootstrap/dist/css/bootstrap.css\"\nimport 'flatpickr/dist/flatpickr.css';\n\nimport \"jquery-ui/ui/widgets/draggable\";\nimport \"jquery-ui/ui/widgets/resizable\";\nimport \"jquery-ui/ui/widgets/dialog\";\nimport \"jquery-ui/ui/widgets/tabs\";\nimport \"jquery-ui/ui/widgets/button\";\nimport \"jquery-ui/ui/widgets/spinner\";\nimport \"jquery-ui/ui/position\";\nimport \"jquery-ui/ui/widgets/menu\";\n\nimport \"jquery-ui/themes/base/all.css\";\nimport \"datatables.net-buttons-bs/css/buttons.bootstrap.css\"\n\nimport \"datatables.net/js/jquery.dataTables.mjs\"\nimport \"datatables.net-bs/js/dataTables.bootstrap.mjs\"\nimport \"datatables.net-buttons/js/dataTables.buttons.mjs\"\nimport \"datatables.net-buttons-bs/js/buttons.bootstrap.mjs\"\nimport \"datatables.net-buttons/js/buttons.html5.mjs\"\nimport \"datatables.net-buttons/js/buttons.colVis.mjs\"\nimport 'datatables.net-jqui/js/dataTables.jqueryui.js';\nimport 'datatables.net-scroller/js/dataTables.scroller.js';\nimport 'inspire-tree-dom/dist/inspire-tree-dark.min.css';\n\nimport(\"jquery-ui-touch-punch/jquery.ui.touch-punch.js\")\nimport \"../css/mezzanine.css\";\nimport '../css/datatables.css';\nimport '../css/checkbox.css';\nimport \"../css/style.css\";\nimport \"../css/meteogrid.css\";\n\nimport '../css/mapas.css';\nimport '../css/datatables2.css';\n\nimport '@fortawesome/fontawesome-pro/css/all.min.css'\n\nimport Cookies from 'js-cookie';\n\ndayjs.extend(utc);\ndayjs.extend(duration);\ndayjs.extend(pluralGetSet);\n\nconst _ = window.gettext;\n\nlet initialized = false;\n\nimport process from 'process';\nwindow.process = process;\n\nfunction global_init() {\n  if (initialized)\n    return;\n  initialized = true;\n  const csrftoken = Cookies.get('csrftoken');\n  function csrfSafeMethod(method) {\n    // these HTTP methods do not require CSRF protection\n    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));\n  }\n  $.ajaxSetup({\n    beforeSend: function (xhr, settings) {\n      if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n        xhr.setRequestHeader(\"X-CSRFToken\", csrftoken);\n      }\n    }\n  });\n  $(document).ajaxStart(function () {\n    $('body').addClass('wait');\n  }).ajaxComplete(function () {\n    $('body').removeClass('wait');\n  });\n  $('.draggable-panel').draggable();\n  $(\".draggable-panel\").click(function (e) { e.stopPropagation(); });\n  $('.resizable-panel').resizable({ handles: \"n, e, s, w\" });\n  $(\".resizable-panel\").click(function (e) { e.stopPropagation(); });\n  $(\".alert-dismissable.alert-info\").delay(2500).slideUp();\n  $(\".alert-dismissable.alert-success\").delay(2500).slideUp();\n  if (window.self != window.top) {\n    $(document.body).addClass(\"in-iframe\");\n  }\n  // /static/bootstrap-extras.js\n  // Form css tweaks.\n  $('.middle input:text, .middle input:password, textarea').not('[class]').addClass('input-xlarge');\n  $('.control-group label').addClass('control-label');\n  const $dropdowns = $('li.dropdown'); // Specifying the element is faster for older browsers\n  /**\n   * Mouse events\n   *\n   * @description Mimic hoverIntent plugin by waiting for the mouse to 'settle' within the target before triggering\n   */\n  $dropdowns\n    .on('mouseover', function () // Mouseenter (used with .hover()) does not trigger when user enters from outside document window\n    {\n      const $this = $(this);\n      if ($this.prop('hoverTimeout')) {\n        $this.prop('hoverTimeout', clearTimeout($this.prop('hoverTimeout')));\n      }\n      $this.prop('hoverIntent', setTimeout(function () {\n        $this.addClass('open');\n      }, 250));\n    })\n    .on('mouseleave', function () {\n      const $this = $(this);\n      if ($this.prop('hoverIntent')) {\n        $this.prop('hoverIntent', clearTimeout($this.prop('hoverIntent')));\n      }\n      $this.prop('hoverTimeout', setTimeout(function () {\n        $this.removeClass('open');\n      }, 250));\n    });\n  /**\n   * Touch events\n   *\n   * @description Support click to open if we're dealing with a touchscreen\n   */\n  if ('ontouchstart' in document.documentElement) {\n    $dropdowns.each(function () {\n      const $this = $(this);\n      this.addEventListener('touchstart', function (e) {\n        if (e.touches.length === 1) {\n          // Prevent touch events within dropdown bubbling down to document\n          e.stopPropagation();\n          // Toggle hover\n          if (!$this.hasClass('open')) {\n            // Prevent link on first touch\n            if (e.target === this || e.target.parentNode === this) {\n              e.preventDefault();\n            }\n            // Hide other open dropdowns\n            $dropdowns.removeClass('open');\n            $this.addClass('open');\n\n            // Hide dropdown on touch outside\n            const closeDropdown = function (e) {\n              e.stopPropagation();\n\n              $this.removeClass('open');\n              document.removeEventListener('touchstart', closeDropdown);\n            }\n            document.addEventListener('touchstart', closeDropdown);\n          }\n        }\n      }, false);\n    });\n  }\n  if (window.namespaces)\n    for (const ns of window.namespaces) {\n      ns.page = $(`#page-${ns.page_id}`);\n      ns.mapas = [];\n    }\n  const csrfmiddlewaretoken = Cookies.get('csrftoken');\n  document.getElementById('fileuploader').addEventListener(\"change\", function () {\n    const fileuploader = $(\"#fileuploader\")\n    const form = fileuploader.closest('form');\n    form.find('input[name=csrfmiddlewaretoken]').val(csrfmiddlewaretoken);\n    $.ajax({\n      type: \"POST\",\n      url: fileuploader.data('url'),\n      processData: false,\n      contentType: false,\n      data: new FormData(form[0]),\n      success: function (result) {\n        let text = 'Fichero subido correctamente';\n        let class_ = 'alert-success';\n        if (result.error) {\n          text = result.error;\n          class_ = 'alert-warning'\n        }\n        const ok = $(`\n            <div class=\"alert alert-dismissable ${class_}\" data-alert=\"alert\">\n            <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button> \n            ${_(text)}\n          </div>`);\n        const elem = ok.appendTo('#inner-headline');\n        elem.fadeIn(500).fadeOut(500).fadeIn(1000);\n        if (!result.error) elem.fadeOut(5000);\n        fileuploader.val('');\n      }\n    })\n  }, false);\n  $('.fileupload-link').on('click', function () {\n    const url = window.Urls.uploadFile($(this).data('page_id'))\n    const fileuploader = $(\"#fileuploader\")\n    fileuploader.data('url', url);\n    fileuploader.trigger('click');\n    return false;\n  })\n  setup_layer_tree_filter();\n}\n\nfunction setup_layer_tree_filter() {\n  const layerTree = $('#LAYER');\n  layerTree.on('search', 'input[name=filtrar-arbol]',\n    ev => {\n      const search = ev.currentTarget.value.toUpperCase();\n      if (search === '') {\n        layerTree.removeClass('filtered');\n        layerTree.find('.mostrar-capa.selector')\n          .removeClass('shown')\n          .removeClass('hidden');\n        return;\n      } else {\n        layerTree.addClass('filtered');\n      }\n      layerTree.find('.mostrar-capa.selector')\n        .each((idx, el) => {\n          const visible = el.textContent.toUpperCase()\n            .includes(search);\n          if (visible) {\n            el.classList.add('shown');\n            el.classList.remove('hidden');\n          } else {\n            el.classList.add('hidden');\n            el.classList.remove('shown');\n          }\n        })\n    }\n  )\n  layerTree.on('click', '.layers-collapse',\n    () => layerTree.find('.folder-toggler').removeClass('open')\n  )\n  layerTree.on('click', '.layers-expand',\n    () => layerTree.find('.folder-toggler').addClass('open')\n  )\n}\n\nfunction cargarCSS() {\n  const fileref = document.createElement(\"link\");\n  fileref.setAttribute(\"rel\", \"stylesheet\");\n  fileref.setAttribute(\"type\", \"text/css\");\n  fileref.setAttribute(\"href\", window.Urls.iconos_css());\n  document.getElementsByTagName(\"head\")[0].appendChild(fileref)\n}\nfunction getDTMessages() {\n  return selLangMapDT;\n}\n\n/**\n* @param String name\n* @return String\n*/\nfunction getParameterByName(name) {\n  const url = new URL(window.location);\n  return url.searchParams.get(name) || '';\n}\nlet locale = null;\n\nconst langMap = {\n  en: langMap_en.default.en,\n  es: langMap_es.default.es,\n  fr: langMap_fr.default.fr,\n  ca: langMap_cat.default.ca,\n};\n\nconst langMapDT = {\n  en: null,\n  es: dt_es,\n  fr: dt_fr,\n  ca: dt_ca,\n  pt: dt_pt,\n};\n\nlet selLangMapDT = undefined;\n\nconst langs = [document.documentElement.lang, ...navigator.languages];\n\nfor (const lang of langs) {\n  const l = lang.split('-')[0];\n  if (l in langMap) {\n    locale = l;\n    dayjs.locale(l);\n    flatpickr.localize(langMap[l]);\n    break;\n  }\n}\nfor (const l of langs) {\n  if (l in langMapDT) {\n    selLangMapDT = langMapDT[l];\n    break;\n  }\n}\nexport function multiselectOptions(headerLeft = '', headerRight = '') {\n  return {\n    selectableHeader: `${headerLeft}<div class=\"multiselect-botones\"><a href=\"#\" >\\u00BB</a></div><input type='text' class='search-input' autocomplete='off' placeholder='${_('Buscar')}...'>`,\n    selectionHeader: `${headerRight}<div class=\"multiselect-botones\"><a href=\"#\" >\\u00AB</a></div><input type='text' class='search-input' autocomplete='off' placeholder='${_('Buscar')}...'>`,\n    afterInit: function () {\n      const that = this,\n        $selectableSearch = that.$selectableUl.prev(),\n        $selectionSearch = that.$selectionUl.prev(),\n        selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)',\n        selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected';\n      const select_all = $selectableSearch.prev().find('a');\n      const select_none = $selectionSearch.prev().find('a');\n      select_all.click(function () {\n        const lis_visible_selectable = that.$selectableContainer.find(that.elemsSelector)\n        lis_visible_selectable.click();\n        return false;\n      })\n      select_none.click(function () {\n        const lis_visible_selection = that.$selectionContainer.find(that.elemsSelector)\n        lis_visible_selection.click();\n        return false;\n      })\n      that.qs1 = $selectableSearch.quicksearch(selectableSearchString)\n        .on('keydown', function (e) {\n          that.qs1.cache();\n          if (e.which === 40) {\n            that.$selectableUl.focus();\n            return false;\n          }\n        });\n      that.qs2 = $selectionSearch.quicksearch(selectionSearchString)\n        .on('keydown', function (e) {\n          that.qs2.cache();\n          if (e.which == 40) {\n            that.$selectionUl.focus();\n            return false;\n          }\n        });\n    },\n    afterSelect: function () {\n      this.qs1.cache();\n      this.qs2.cache();\n    },\n    afterDeselect: function () {\n      this.qs1.cache();\n      this.qs2.cache();\n    }\n  }\n}\n// https://stackoverflow.com/questions/27936772/how-to-deep-merge-instead-of-shallow-merge\n/**\n * Simple object check.\n * @param item\n * @returns {boolean}\n */\nfunction isObject(item) {\n  return (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n * Deep merge two objects.\n * @param target\n * @param ...sources\n */\nexport function mergeDeep(target, ...sources) {\n  if (!sources.length) return target;\n  const source = sources.shift();\n\n  if (isObject(target) && isObject(source)) {\n    for (const key in source) {\n      if (isObject(source[key])) {\n        if (!target[key]) Object.assign(target, { [key]: {} });\n        mergeDeep(target[key], source[key]);\n      } else {\n        Object.assign(target, { [key]: source[key] });\n      }\n    }\n  }\n\n  return mergeDeep(target, ...sources);\n}\n\nexport function transform_point(xy) {\n  const sourceProj = proj4('EPSG:4326');\n  const destProj = proj4(window.epsg);\n  return proj4(sourceProj, destProj, xy);\n}\n\n\n// on window resize run function\n$(window).on('resize', () => fluidDialog());\n\n// catch dialog if opened within a viewport smaller than the dialog width\n$(document).on(\"dialogopen\", \".ui-dialog\", () => fluidDialog());\n\nfunction fluidDialog() {\n  const $visible = $(\".ui-dialog:visible\");\n  // each open dialog\n  $visible.each(function () {\n    const $this = $(this);\n    const dialog = $this.find(\".ui-dialog-content\").data(\"ui-dialog\");\n    if (!dialog)\n      return;\n    const wWidth = $(window).width();\n    // check window width against dialog width\n    if (wWidth < (parseInt(dialog.options.maxWidth || 1000) + 50)) {\n      // keep dialog from filling entire screen\n      $this.css(\"max-width\", \"90%\");\n    } else {\n      // fix maxWidth bug\n      $this.css(\"max-width\", dialog.options.maxWidth + \"px\");\n    }\n    const wHeight = $(window).height();\n    // check window width against dialog width\n    if (wHeight < (parseInt(dialog.options.maxHeight || 1000) + 50)) {\n      // keep dialog from filling entire screen\n      $this.css(\"max-height\", \"90%\");\n    } else {\n      // fix maxWidth bug\n      $this.css(\"max-height\", dialog.options.maxHeight + \"px\");\n    }\n    //reposition dialog\n    // dialog.option(\"width\", $this.width());\n    dialog.option(\"position\", dialog.options.position);\n    $(dialog).closest('.ui-dialog').draggable('option', dialog.option('appendTo'))\n  });\n\n}\nexport function get_horizon(dims) {\n  for (const v of Object.values(dims))\n    if (v.startsWith('HOR') || v.includes('HORIZON') || v.includes('YEAR_PERIOD ')) return v;\n}\nexport function getFormCoords(element) {\n  if (element.find('div#projection input').val() != ''\n    && element.find('input#xlong').val() != ''\n    && element.find('input#ylat').val() != '') return {\n      srcproj: element.find('div#projection input').attr(\"value\"),\n      xlong: Number(element.find('input#xlong').val()),\n      ylat: Number(element.find('input#ylat').val())\n    }\n  const lat_degrees = Number(element.find('div#lat input#degrees').val());\n  const lat_mins = Number(element.find('div#lat input#mins').val());\n  const lat_segs = Number(element.find('div#lat input#segs').val());\n  const lat_dir = element.find('div#lat div#direction input').val();\n  const long_degrees = Number(element.find('div#long input#degrees').val());\n  const long_mins = Number(element.find('div#long input#mins').val());\n  const long_segs = Number(element.find('div#long input#segs').val());\n  const long_dir = element.find('div#long div#direction input').val();\n  if (lat_degrees && long_degrees)\n    return {\n      ylat: ConvertDMSToDD(lat_degrees, lat_mins, lat_segs, lat_dir),\n      xlong: ConvertDMSToDD(long_degrees, long_mins, long_segs, long_dir),\n      srcproj: proj4('EPSG:4326')\n    }\n  return {\n    ylat: null,\n    xlong: null,\n    srcproj: null\n  }\n}\n\nfunction ConvertDMSToDD(degrees, minutes, seconds, direction) {\n  const dd = degrees + minutes / 60 + seconds / (60 * 60);\n  if (direction == \"S\" || direction == \"W\")\n    return -dd;\n  // Don't do anything for N or E\n  return dd;\n}\n\nexport function updateUnselectedHorizons(idx_hor_notsel) {\n  idx_hor_notsel = [...new Set(idx_hor_notsel)].sort()\n  if (idx_hor_notsel[0] === '')\n    idx_hor_notsel.splice(0, 1)\n  const oldUrl = window.location.href;\n  let newUrl = oldUrl;\n  if (oldUrl.includes('idx_hor_notsel')) {\n    newUrl = oldUrl.replace(/(idx_hor_notsel=)[^&]*(.*)/, '$1' + idx_hor_notsel + '$2');\n  } else {\n    const sep = oldUrl.includes('?') ? '&' : '?';\n    newUrl += sep + 'idx_hor_notsel=' + idx_hor_notsel;\n  }\n  if (oldUrl != newUrl)\n    window.history.replaceState(null, null, newUrl);\n}\nexport const LAYERTYPES = {};\n\nexport { $, dayjs, locale, flatpickr, global_init, cargarCSS, getDTMessages, getParameterByName, proj4 };\n","import { $, dayjs, getParameterByName, mergeDeep } from '../../../../moderna_meteogrid/statix/js/base.mjs';\n\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { optionsFromCapabilities } from 'ol/source/WMTS';\nimport WMTSCapabilities from 'ol/format/WMTSCapabilities';\nimport { WMTS, ImageWMS, OSM, Vector as VectorSource, BingMaps, TileWMS, XYZ } from 'ol/source';\nimport { Tile as TileLayer, Image as ImageLayer, Vector as VectorLayer } from 'ol/layer';\nimport { createForProjection } from 'ol/tilegrid';\nimport Flow from 'ol/layer/Flow.js';\nimport { get as getProjection } from 'ol/proj.js';\nimport DataTileSource from 'ol/source/DataTile.js';\nimport { createXYZ, wrapX } from 'ol/tilegrid.js';\n\nexport const sigym2 = 'https://sigym3.com/';\nconst tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nlet dimension_controls = [];\nfunction getBigTileGrid(projectionObj) {\n  return createForProjection(projectionObj, undefined, [512, 512])\n}\nfunction repositionTooltips() {\n  $('button.layer-info').each(function (_, btn) {\n    $('#tt' + btn.id).position({\n      my: 'left top',\n      at: 'right top',\n      of: btn,\n      collision: 'flipfit',\n    });\n  });\n}\nconst uniqId = (function () {\n  let i = 0;\n  return function () {\n    return i++;\n  }\n})();\n\nlet id_counter = 0;\nclass Layer {\n  constructor(ns, pageLayer, time_delta, interactive_map) {\n    this.ns = ns;\n    this.id = 'simmer_layer_' + id_counter++;\n    this._pageLayer = pageLayer;\n    this._layer = pageLayer.layer;\n    this._layerTypeLocator = this._layer.layertype?.locator;\n    this._baseLayer = this._layerTypeLocator == \"BASELAYER\";\n    this._refLayer = this._layerTypeLocator == \"REFERENCE\";\n    this._varLayer = this._layerTypeLocator == \"LAYER\";\n    let extra = this._layer.extra;\n    extra.pageLayer = pageLayer.id;\n    if (pageLayer.extra)\n      mergeDeep(extra, pageLayer.extra)\n    if (pageLayer.extra_dim) {\n      extra = { ...extra, ...pageLayer.extra_dim }\n    }\n    this._extra = extra;\n    const title = extra.title;\n    this._title = title ? title : this._layer.name_and_unit;\n    if (this._layer.service) {\n      this._layer.service.url = this._layer.service.url\n        ? this._layer.service.url.replace('http://localhost/', '/')\n        : null;\n      this._url = this._layer.service.url;\n    }\n    if (this._layer.source_type)\n      this._serviceLayer = this._layer.source_type.locator;\n    else\n      this._serviceLayer = this._layer.servicelayer;\n    this._legend = this._layer.legend;\n    this._information = this._layer.information;\n    this._time_delta = time_delta;\n    this._interactive_map = interactive_map;\n    this._dynDate = null;\n    this._dynInfo = '';\n\n  }\n  get legend() {\n    return this._legend;\n  }\n  getTooltip() {\n    return `${this._information}${this._dynInfo}`;\n  }\n  get ol_factory() {\n    return TileLayer;\n  }\n  get zIndex() {\n    return 30000000 - this._pageLayer.weight * 1000 + this._pageLayer.order;\n  }\n  getLayerInfo(target, checkbox) {\n    const pageLayer = this._pageLayer;\n    const tooltipBtn = $(`<button class=\"layer-info fa fa-info\" type=\"button\" ></button>`);\n    const id = uniqId();\n    tooltipBtn.attr('id', 'layer-info' + id);\n    const tooltip = $('<div class=\"layer tooltip\"></div>').hide();\n    tooltip.attr('id', 'ttlayer-info' + id);\n    if (this._information) {\n      const self = this;\n      target.append(tooltipBtn);\n      this.ns.page.find('.map').append(tooltip);\n      tooltipBtn.on('click', function () {\n        const ishidden = tooltip.is(\":hidden\");\n        $('.layer.tooltip').hide();\n        const info = self.getTooltip();\n        tooltip.empty();\n        tooltip.append(info);\n        tooltip.toggle(ishidden);\n        repositionTooltips();\n      });\n      this.ns.page.find('.map').on('click', function (e) {\n        if (tooltipBtn[0] != e.target)\n          tooltip.hide();\n      });\n    }\n    tooltipBtn.toggle(pageLayer.shown);\n    checkbox.on('change', function () {\n      tooltipBtn.toggle(this.checked);\n      tooltip.toggle(false);\n    })\n  }\n  setSliderLayer(target, checkbox) {\n    const ol_layer = this._ol_layer;\n    const pageLayer = this._pageLayer;\n    const sliderCnt = $(`<div class=\"slidecontainer\">\n    <div class=\"etiqueta\" hidden=\"true\"></div>\n    <input type=\"range\" min=\"0\" max=\"1\" \n    step=\"0.1\" value=\"${ol_layer.getOpacity() || 1}\" class=\"slider\">\n    </div>`);\n    target.append(sliderCnt);\n    const inpt = sliderCnt.find('input')[0];\n    const etq = sliderCnt.find('div.etiqueta')[0];\n    inpt.onmouseover = function () {\n      const w = sliderCnt.width();\n      etq.innerHTML = parseFloat(this.value) * 100 + \"%\";\n      etq.style.left = String((parseFloat(this.value) * w)) + 'px';\n      etq.hidden = false;\n    }\n    inpt.onmouseout = function () {\n      etq.hidden = true;\n    }\n\n    inpt.oninput = function () {\n      ol_layer.setOpacity(parseFloat(this.value))\n      const newURL = new URL(window.location);\n      if (this.value == '1')\n        newURL.searchParams.delete(`layerOpacity${ol_layer.get('simmer_id')}`);\n      else\n        newURL.searchParams.set(`layerOpacity${ol_layer.get('simmer_id')}`, this.value);\n      window.history.replaceState(null, null, newURL);\n      const w = sliderCnt.width();\n      etq.innerHTML = parseFloat(this.value) * 100 + \"%\";\n      etq.style.left = String((parseFloat(this.value) * w)) + 'px';\n\n    }\n    sliderCnt.toggle(pageLayer.shown);\n    checkbox.on('change', function () {\n      sliderCnt.toggle(this.checked);\n    })\n  }\n  setCalculatedDate(props) {\n    const STATIC_LAYER = 'static layer';\n    if (props)\n      try {\n        const propsTime = props.base_time || props.time;\n        if (!propsTime)\n          throw new Error(\"Sin fecha\");\n        const dt = dayjs(propsTime);\n        if (dt.year() === 9999)\n          throw new Error(STATIC_LAYER)\n        this._dynDate = dt;\n        this._dynInfo = `<br><b>${window.gettext('Cálculo')}</b>: ${dt.utc().format('DD-MM-YYYY HH[h UTC]')}`;\n      } catch (error) {\n        this._dynDate = null;\n        this._dynInfo = '';\n        if (error.message != STATIC_LAYER)\n          console.info(error);\n      }\n    else {\n      this._dynDate = null;\n      this._dynInfo = '';\n    }\n  }\n  registerInTree() {\n    const pageLayer = this._pageLayer;\n    const ol_layer = this._ol_layer;\n    const ol_map = this._ol_map;\n    const closedTree = ol_map.get('closed_tree');\n    const visible_layers = getParameterByName('visible_layers').split(',');\n    if (visible_layers[0] != '') {\n      pageLayer.shown = visible_layers.some((l) => l == pageLayer.id);\n      ol_layer.setVisible(pageLayer.shown);\n    }\n    const raiz = this.ns.page.find('div.sidebar-pane.arbol');\n    const arbol = raiz.find('#' + this._layerTypeLocator);\n    const existing_selector = arbol.find('#pageLayerSelector_' + pageLayer.id);\n    if (existing_selector.length) {\n      // reutilizamos checkbox para todas las capas en el caso de mosaico\n      const checkbox = existing_selector.find('input');\n      checkbox.on('change', function () {\n        ol_layer.setVisible(this.checked);\n        return false;\n      });\n      return;\n    }\n    const selector = raiz.find('div.model_selector').clone();\n    selector.attr('id', 'pageLayerSelector_' + pageLayer.id);\n    selector.attr('id_layer', pageLayer.id);\n    const leyenda = raiz.find('div.model_leyenda').clone();\n\n    selector.removeClass('model_selector');\n    leyenda.removeClass('model_leyenda');\n    selector.show();\n    let target = arbol;\n    if (pageLayer.folder) {\n      const orig_path = pageLayer.folder.split('/');\n      const path = [];\n      for (const component of orig_path) {\n        path.push(component);\n        const folder = path.join('/');\n        const carpeta_existente = arbol.find(`div.folder[folder=\"${folder}\"]`);\n        const carpetaDestino = carpeta_existente.length ? carpeta_existente : raiz.find('div.model_carpeta').clone();\n        target = carpetaDestino;\n        if (carpeta_existente.length == 0) {\n          carpetaDestino\n            .removeClass('model_carpeta')\n            .text(null)\n            .attr('folder', folder)\n            .show();\n          const thisPath = [...path];\n          const folderTitle = thisPath.pop();\n          const title = $(`<div class=\"folder-toggler${closedTree ? '' : ' open'}\">${folderTitle}</div>`);\n          title.on('click', () => title.toggleClass('open'));\n          carpetaDestino.append(title)\n          if (thisPath.length) {\n            const parentCarpet = raiz.find(`div.folder[folder=\"${thisPath.join('/')}\"]`);\n            parentCarpet.append(carpetaDestino);\n          }\n          else\n            arbol.append(carpetaDestino);\n        }\n      }\n    }\n    const checkbox = selector.find('input');\n    checkbox.prop('checked', pageLayer.shown && !pageLayer.disabled);\n    checkbox.prop('disabled', pageLayer.disabled);\n    if (pageLayer.disabled) {\n      selector.addClass('disabled');\n      selector.attr('title', 'Simulación pendiente de ejecución')\n    }\n    const layerTitle = selector.find('a').text(this._title);\n    this.getLayerInfo(layerTitle, checkbox);\n    if (this._interactive_map) {\n      const layers_opacity = ol_map.get('layers_opacity');\n      if (layers_opacity) {\n        const layer_opacity = layers_opacity.find((l) => l.id == String(this._pageLayer.id));\n        if (layer_opacity) ol_layer.set('opacity', parseFloat(layer_opacity.value))\n      }\n      this.setSliderLayer(layerTitle, checkbox);\n    }\n    target.append(selector);\n    let legend = this.legend;\n    if (this._interactive_map && legend) {\n      const elem_leyenda = leyenda.find('img');\n      elem_leyenda.attr('src', legend);\n      leyenda.attr('id', pageLayer.id)\n      leyenda.toggle(pageLayer.shown);\n      target.append(leyenda);\n      if (ol_map.get('floating_legend')) {\n        const legendDialog = showLegend(null, ol_map, this);\n        leyenda.addClass('hidden');\n        checkbox.on('change', function () {\n          legendDialog.dialog(this.checked ? 'open' : 'close');\n        })\n        if (!pageLayer.shown)\n          legendDialog.dialog('close');\n      }\n    }\n    const self = this;\n    checkbox.on('change', function () {\n      ol_layer.setVisible(this.checked);\n      for (const control of self.controls)\n        if (this.checked)\n          control.use();\n        else\n          control.unuse();\n      const info = ol_map ? ol_map.get('info') : null;\n      if (info) {\n        ol_map.unset('info', true);\n        ol_map.set('info', info);\n      }\n      setVisibleLayers_url(self.ns.page, ol_map, pageLayer.id, this.checked);\n      if ($('.mosaics').length) {\n        const value = $('input#iteration').val();\n        if (value)\n          $(`ul#iteration-list li[value=${value}]`).trigger('click');\n        else\n          // FIXME\n          window.location.reload();\n      }\n      if (legend) {\n        leyenda.toggle(this.checked);\n        repositionTooltips();\n        const legendDialog = $(`.legend-dialog img.legend[src=\"${legend}\"]`);\n        if (legendDialog.length)\n          if (this.checked) {\n            legendDialog.dialog('option', 'position', getPosDefault(ol_map.getTargetElement()));\n            legendDialog.dialog('open');\n          }\n          else legendDialog.dialog('close');\n      }\n      return false;\n    });\n    this.controls = [];\n    if (this._layer.source_type) {\n      dimension_controls = (this._ol_map) ? this._ol_map.get('dimension_controls') : dimension_controls;\n      for (const dim of this._layer.source_type.dimensions) {\n        if (dim.value_type == 'PERIODIC')\n          // De momento es especial; no hacemos nada\n          continue\n        if (pageLayer?.extra?.dimensions && dim.locator in pageLayer.extra.dimensions)\n          continue\n        if (this._layer?.extra?.dimensions && dim.locator in this._layer.extra.dimensions)\n          continue\n        const control = dimension_controls[dim.locator];\n        let dim_value = getParameterByName(dim.locator);\n        let control_empty = false;\n        if (dim_value.split(',').length > 1)\n          control_empty = true;\n        if (this._ol_map && this._ol_map.get(\"reloaded_dims\")) {\n          const reloaded_dims = this._ol_map.get(\"reloaded_dims\")\n          dim_value = (reloaded_dims[dim.locator]) ? reloaded_dims[dim.locator] : dim_value\n        }\n        if (!control_empty)\n          control.value = (dim_value) ? dim_value : dim.values[0][0];\n        this.source.updateParams({ [dim.locator]: control.value });\n        control.on('change:value',\n          () => this.source.updateParams({ [dim.locator]: control.value })\n        )\n        if (ol_layer.getVisible())\n          control.use();\n        this.controls.push(control);\n      }\n      this._layer.source_type._dimension_controls = dimension_controls;\n    }\n  }\n  async crearCapaOL(ol_map, extent_local, interactive) {\n    let source = this.source;\n    if (source == null)\n      source = await this.get_async_source();\n    if (source == null)\n      return;\n    const extraOpts = await this.getExtraOpts();\n    const setOpacity = getParameterByName(`layerOpacity${this._pageLayer.id}`);\n    const opacity = setOpacity ? parseFloat(setOpacity) : 1;\n    const ret = new this.ol_factory({\n      source,\n      title: this._title,\n      opacity,\n      visible: this._pageLayer.shown && !this._pageLayer.disabled,\n      baseLayer: this._baseLayer,\n      displayInLayerSwitcher: this._baseLayer,\n      time_management: this._varLayer,\n      extra: this._extra,\n      simmer_id: this._pageLayer.id, // FIXME: está en extra\n      zIndex: this.zIndex,\n      ...extraOpts\n    });\n    const unit = this._pageLayer.layer.effective_unit;\n    ret.set('unit', unit ? unit : '-');\n    if (this._varLayer && !this._extra.unbound)\n      ret.setExtent(extent_local);\n    if (this._baseLayer)\n      ret.set('information', this._pageLayer.layer.information);\n    if (this._pageLayer.folder)\n      ret.set('folder', this._pageLayer.folder);\n    this._ol_layer = ret;\n\n    // Refresco periódico de la capa: extra.refresh_time en segundos\n    const refreshTime = this._extra?.refresh_time;\n    if (refreshTime && typeof source.updateParams === 'function') {\n      const start = () => {\n        window.clearInterval(ret.get('refreshInterval'));\n        ret.set('refreshInterval', window.setInterval(\n          () => source.updateParams({ refresh: Date.now() }),\n          refreshTime * 1000));\n      };\n      const stop = () => window.clearInterval(ret.get('refreshInterval'));\n      ret.on('change:visible', () => (ret.getVisible() ? start() : stop()));\n      if (ret.getVisible())\n        start();\n    }\n\n    this._ol_map = ol_map;\n    if (ol_map)\n      ol_map.addLayer(ret);\n    if (this._varLayer || this._refLayer)\n      this.registerInTree();\n    return ret;\n  }\n  async getExtraOpts() {\n    return {};\n  }\n  get layerCaption() {\n    const dims = [];\n    if (this._layer.source_type?.dimensions)\n      for (const dim of this._layer.source_type.dimensions) {\n        if (dim.locator in dimension_controls) {\n          const control = dimension_controls[dim.locator];\n          dims.push(`${control.name}: ${control._caption}`)\n        }\n      }\n    let name = this._pageLayer.folder ?\n      this._pageLayer.folder + ' - ' + this._title :\n      this._title;\n    if (this._ol_map.get('graph_show_run_time') && this._dynDate)\n      name += ` ⏲ ${this._dynDate.utc().format('DD-MM-YYYY HH[h UTC]')}`\n    return `${name}${dims.length ? ' | ' + dims.join(' | ') : ''}`;\n  }\n}\nclass OSMLayer extends Layer {\n  get source() {\n    return new OSM();\n  }\n}\nclass BingLayer extends Layer {\n  get source() {\n    return new BingMaps({\n      key: this._url.split('#').pop(),\n      imagerySet: this._serviceLayer\n    });\n  }\n}\n\nclass WMTSLayer extends Layer {\n  get source() {\n    if (this._src)\n      return this._src;\n    return null;\n  }\n  async get_async_source() {\n    const projection = this._extra.epsg || window.epsg;\n    const matrixSet = this._extra.matrixSet || (projection == 'EPSG:3857' ? 'GoogleMapsCompatible' : projection);\n    const response = await fetch(this._url);\n    const text = await response.text();\n    const parser = new WMTSCapabilities();\n    const result = parser.read(text);\n    const options = optionsFromCapabilities(result, {\n      layer: this._serviceLayer,\n      matrixSet: matrixSet\n    });\n    const ret = new WMTS(options);\n    if (ret.urls[0].includes('http:'))\n      ret.setUrl(ret.urls[0].replace(/http:/, 'https:'))\n    this._src = ret;\n    return ret;\n  }\n\n}\nclass XYZLayer extends Layer {\n  get source() {\n    const src = new XYZ(\n      {\n        url: this._url.replace('{layer}', this._serviceLayer),\n        maxZoom: this._extra.maxZoom\n      }\n    );\n    src.set('time_delta', this._time_delta);\n    src.on('change:time', function () {\n      const time = this.get('time');\n      const effective_time = time.add(this.get('time_delta') || 0, 'hours');\n      this.set('effective_time', effective_time);\n      // const ISOstart = effective_time.format();\n      // FIXME casuística según servidor\n      //this.updateParams({TIME:ISOstart});\n    });\n    return src;\n  }\n}\n\nclass WMSLayer extends Layer {\n  async updateDynInfo() {\n    if (this._ol_map.get('animation'))\n      return;\n    const url = window.Urls.dyn_info(this._pageLayer.id)\n    $.ajax({\n      url: url,\n      dataType: 'json',\n      contentType: 'application/json',\n      data: { TIME: this.source.getParams().TIME }\n    })\n      .done(resp => {\n        try {\n          this.setCalculatedDate(resp);\n        }\n        catch {\n          console.debug(url);\n          this.setCalculatedDate(null);\n        }\n      })\n      .fail(() => this.setCalculatedDate(null));\n  }\n  get source() {\n    if (this._src)\n      return this._src;\n    let params = {\n      LAYERS: this._serviceLayer,\n      STYLES: ','.repeat(this._serviceLayer.split(',').length - 1)\n    };\n    if (this._extra.dimensions) {\n      params = {\n        ...params,\n        ...this._extra.dimensions\n      }\n    }\n    params = {\n      __tz: tz,\n      ...params,\n      ...this._extra\n    };\n    let tileGrid = null;\n    const projection = this._extra.epsg || window.epsg;\n    let url = this._url;\n    if (url.includes(sigym2)) {\n      url = url.replace(sigym2, '');\n      url = window.Urls.proxy_meteo2(url);\n      params.VERSION = '1.1.1';\n      params.AUTH_TYPE = 'basic';\n      tileGrid = getBigTileGrid(projection);\n    }\n    if (this._layer.source_type) {\n      tileGrid = getBigTileGrid(projection);\n    }\n    const [src_factory, ratio] = this._interactive_map && !this._extra.singleTile\n      ? [TileWMS, null]\n      : [ImageWMS, 1];\n    const src = new src_factory({\n      url,\n      params,\n      projection,\n      tileGrid,\n      ratio\n    });\n    const self = this;\n    let finalTime;\n    src.set('time_delta', this._time_delta);\n    const timeFormat = this._extra?.timeFormat;\n    const firstTime = this._extra?.firstTime;\n    const secondTime = this._extra?.secondTime;\n    src.on('change:time', function () {\n      const time = this.get('time');\n      const time_delta = this.get('time_delta') || 0;\n      const effective_time = typeof time_delta == 'number' ? time.add(time_delta, 'hours') : time_delta;\n      this.set('effective_time', effective_time);\n      if (firstTime && secondTime) {\n        const ISOstart = effective_time.add(...firstTime).format(timeFormat);\n        const ISOend = effective_time.add(...secondTime).format(timeFormat);\n        finalTime = ISOstart + '/' + ISOend;\n      } else if (firstTime) {\n        const ISOstart = effective_time.add(...firstTime).format(timeFormat);\n        const ISOend = effective_time.format(timeFormat);\n        finalTime = ISOstart + '/' + ISOend;\n      } else if (secondTime) {\n        const ISOstart = effective_time.format(timeFormat);\n        const ISOend = effective_time.add(...secondTime).format(timeFormat);\n        finalTime = ISOstart + '/' + ISOend;\n      } else {\n        const ISOstart = effective_time.format(timeFormat);\n        finalTime = ISOstart;\n      }\n      this.updateParams({ TIME: finalTime });\n      if ((self._interactive_map || self._time_delta === 0) &&\n        self._information &&\n        !self._pageLayer.disabled &&\n        !window.time_type?.locator.startsWith('ENUM'))\n        window.setTimeout(() => self.updateDynInfo(), self._ol_layer?.getVisible() ? 2000 : 5000 + Math.random() * 2000);\n    });\n    this._src = src;\n    return src;\n  }\n  get ol_factory() {\n    return this._interactive_map && !this._extra.singleTile ? TileLayer : ImageLayer;\n  }\n  get legend() {\n    let legend = this._legend;\n    if (!legend)\n      return legend;\n    if (legend.includes(sigym2)) {\n      legend = legend.replace(sigym2, '');\n      return window.Urls.proxy_meteo2(legend);\n    }\n    if (legend !== 'auto')\n      return legend;\n    const params = {\n      pageLayerId: this._pageLayer.id,\n      TRANSPARENT: 'TRUE'\n    };\n    return this.source.getLegendUrl(null, params);\n  }\n}\n\nclass WMSFlowLayer extends WMSLayer {\n  async getColorStops() {\n    const params = {\n      SERVICE: 'WMS',\n      VERSION: '1.3.0',\n      REQUEST: 'GetLegendGraphic',\n      FORMAT: 'application/json',\n      PAGELAYERID: this._pageLayer.id,\n      LAYERS: this._serviceLayer,\n      WIDTH: 256,\n      HEIGHT: 256,\n    };\n    const resp = await fetch(`${this._url}?${new URLSearchParams(params)}`);\n    const colorStops = await resp.json();\n    colorStops[0] = [0, 0, 0, 0];\n    return colorStops;\n  }\n  get legend() {\n    let legend = this._legend;\n    if (!legend || legend !== 'auto')\n      return legend;\n    const params = {\n      SERVICE: 'WMS',\n      VERSION: '1.3.0',\n      REQUEST: 'GetLegendGraphic',\n      FORMAT: 'image/png',\n      PAGELAYERID: this._pageLayer.id,\n      LAYERS: this._serviceLayer,\n      WIDTH: 150,\n      TRANSPARENT: 'TRUE'\n    };\n    return `${this._url}?${new URLSearchParams(params)}`;\n  }\n\n\n  async getExtraOpts() {\n    const jsonColors = await this.getColorStops();\n    const colorStops = [];\n    for (const [k, v] of Object.entries(jsonColors)) {\n      colorStops.push(parseFloat(k));\n      colorStops.push(v);\n    }\n    return {\n      maxSpeed: colorStops.at(-2),\n      style: {\n        color: [\n          'interpolate',\n          ['linear'],\n          ['get', 'speed'],\n          ...colorStops],\n      },\n    };\n  }\n\n  get ol_factory() {\n    return Flow;\n  }\n\n  get source() {\n    if (this._src)\n      return this._src;\n    const self = this;\n    const dataTileSize = 256;\n    const dataBands = 3;\n    const projection = this._extra.epsg || window.epsg;\n    const params = {\n      LAYERS: this._serviceLayer,\n      STYLES: ','.repeat(this._serviceLayer.split(',').length - 1)\n    };\n    if (this._extra.dimensions) {\n      Object.assign(params, this._extra.dimensions);\n    }\n    this.params = {\n      __tz: tz,\n      REQUEST: 'GetMap',\n      SERVICE: 'WMS',\n      VERSION: '1.3.0',\n      FORMAT: 'application/uv_particles',\n      STYLES: '',\n      TRANSPARENT: 'TRUE',\n      WIDTH: dataTileSize,\n      HEIGHT: dataTileSize,\n      CRS: projection,\n      ...params,\n      ...this._extra,\n    };\n    const dataTileGrid = createXYZ();\n    const dataTileProjection = getProjection('EPSG:3857');\n    const wind = new DataTileSource({\n      // transition must be 0, see https://github.com/openlayers/openlayers/issues/16119\n      transition: 0,\n      wrapX: true,\n      async loader(z, x, y) {\n        const tileCoord = wrapX(dataTileGrid, [z, x, y], dataTileProjection);\n        const params = { ...self.params, BBOX: dataTileGrid.getTileCoordExtent(tileCoord) };\n        const resp = await fetch(`${self._url}?${new URLSearchParams(params)}`);\n        if (!resp.ok) {\n          throw new Error(`tile ${z}/${x}/${y} failed`);\n        }\n        const { width, height, u, v } = await resp.json();\n        if (width != dataTileSize) {\n          console.warn('width != dataTileSize')\n        }\n        if (height != dataTileSize) {\n          console.warn('height != dataTileSize')\n        }\n        const data = new Float32Array(dataTileSize * dataTileSize * dataBands);\n        for (let row = 0; row < dataTileSize; ++row) {\n          let offset = row * dataTileSize * dataBands;\n          for (let col = 0; col < dataTileSize; ++col) {\n            data[offset] = u[row][col];\n            data[offset + 1] = v[row][col];\n            offset += dataBands;\n          }\n        }\n        return data;\n      },\n    });\n    wind.on('change:time', function () {\n      const time = this.get('time');\n      const effective_time = time.add(this.get('time_delta') || 0, 'hours');\n      this.set('effective_time', effective_time);\n      const ISOstart = effective_time.format();\n      self.params.TIME = ISOstart;\n      self._ol_layer.setSource(null);\n      self._ol_layer.setSource(this);\n    });\n    this._src = wind;\n    return wind;\n  }\n}\n\n\n\nfunction setVisibleLayers_url(page, ol_map, l_id, isVisible) {\n  let visible_layers = getParameterByName('visible_layers').split(',');\n  if (visible_layers[0] == '') {\n    const fondo = [];\n    for (const l of ol_map.getLayers().getArray()) {\n      if (l.get('baseLayer') && l.get('visible')) {\n        fondo.push(l.get('simmer_id'));\n        break;\n      }\n    }\n    const arbol = page.find('div.arbol');\n    const capas = arbol.find('#LAYER').find('div.mostrar-capa.selector:not(.cambios)').map((i, l) =>\n      ($(l).find('input.mostrar').prop('checked')) ? '' + $(l).attr('id_layer') : null).toArray();\n    const references = arbol.find('#REFERENCE').find('div.mostrar-capa.selector').map((i, l) =>\n      ($(l).find('input.mostrar').prop('checked')) ? '' + $(l).attr('id_layer') : null).toArray();\n    visible_layers = [...fondo, ...references, ...capas];\n  }\n  else {\n    visible_layers = visible_layers.filter(x => x != String(l_id));\n    if (isVisible)\n      visible_layers.push('' + l_id);\n  }\n  const newURL = new URL(window.location);\n  newURL.searchParams.set('visible_layers', visible_layers);\n  window.history.replaceState(null, null, newURL);\n}\nfunction showLegend(e, mapa, pl) {\n  let pageLayer;\n  pageLayer = pl;\n  if (!pageLayer)\n    return;\n  const lyr_name = pageLayer._layer.name_and_unit;\n  const target = mapa.getTargetElement();\n  const legendUrl = target.classList.contains('map') ?\n    $(`div#${pageLayer._pageLayer.id}.leyenda`).find('img').attr('src') :\n    $(`#${pageLayer._pageLayer.id}_legend`).attr('src');\n  if (!legendUrl) {\n    mapa.set('notification', window.gettext('No existe leyenda para la capa seleccionada'));\n    window.setTimeout(() => mapa.set('notification', null), 2500);\n    return;\n  }\n  const legend_element = $(`<img class=\"legend\" src =\"${legendUrl}\" />`);\n  let new_pos = getPosDefault(target);\n  if (e) {\n    const pixel = mapa.getPixelFromCoordinate(e.coordinate);\n    new_pos = {\n      my: 'left top',\n      at: 'left+' + pixel[0] + ' top+' + pixel[1],\n      of: target,\n      collision: 'fit'\n    };\n  }\n  else {\n    mapa.once('postrender', () => {\n      if (mapa.get(\"pos_legs\")) {\n        const pos = mapa.get(\"pos_legs\").find((l) => l.id == legend_element.attr('id'));\n        if (pos) {\n          new_pos = {\n            my: pos.my,\n            at: pos.at,\n            of: pos.mytarget ? target : window,\n            collision: 'fit'\n          };\n          legend_element.dialog('option', 'position', new_pos);\n        }\n        else legend_element.dialog('close')\n      }\n    })\n  }\n  const existing_legend_element = $(`.legend-dialog img.legend[src=\"${legendUrl}\"]`);\n  if (existing_legend_element.length) {\n    existing_legend_element.dialog('option', 'position', new_pos);\n    existing_legend_element.dialog('open');\n    return existing_legend_element;\n  }\n\n  legend_element.dialog({\n    appendTo: target,\n    classes: {\n      \"ui-dialog\": \"ui-corner-all legend-dialog\",\n      \"ui-dialog-titlebar\": \"ui-corner-all\",\n    },\n    position: new_pos,\n    width: \"auto\",\n    height: \"auto\",\n    title: lyr_name,\n    autoOpen: true,\n    resizable: false,\n    zIndex: 10000,\n    minHeight: 'none',\n    open: function () {\n      $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n      legend_element.closest('div[role=dialog]').prop('title', lyr_name);\n    }\n  });\n  if (!mapa.get(\"pos_legs\"))\n    legend_element.one('load', () =>\n      legend_element.dialog('option', 'position', getPosDefault(target))\n    )\n  return legend_element;\n}\nfunction getPosDefault(target) {\n  let pixel = [-35, -35]\n  return {\n    my: 'right bottom',\n    at: 'right+' + pixel[0] + ' bottom+' + pixel[1],\n    of: target,\n    collision: 'fit'\n  };\n}\nfunction handleError(err) {\n  console.log(err);\n}\n\nexport { Layer, BingLayer, XYZLayer, WMSLayer, WMSFlowLayer, WMTSLayer, OSMLayer, repositionTooltips, setVisibleLayers_url, showLegend };\n","import { $ } from '../../../../moderna_meteogrid/statix/js/base.mjs';\n\nimport { transform as ol_proj_transform } from 'ol/proj'\nimport ol_control_SearchJSON from 'ol-ext/control/SearchJSON';\nimport Feature from 'ol/Feature';\nimport Point from 'ol/geom/Point'\nimport { Style, Icon } from 'ol/style';\nimport { Vector as VectorLayer } from 'ol/layer';\nimport { Vector as VectorSource } from 'ol/source';\nimport { containsCoordinate } from 'ol/extent';\n\n\n/**\n * Search places using the Nominatim geocoder from the OpenStreetmap project.\n *\n * @constructor\n * @extends {ol-ext.control.SearchNominatim}\n * @fires select\n * @param {Object=} Control options.\n *  @param {string} options.className control class name\n *  @param {boolean | undefined} options.polygon To get output geometry of results (in geojson format), default false.\n *  @param {Array<Number> | undefined} options.viewbox The preferred area to find search results. Any two corner points of the box are accepted in any order as long as they span a real box, default none.\n *  @param {boolean | undefined} options.bounded Restrict the results to only items contained with the bounding box. Restricting the results to the bounding box also enables searching by amenity only. default false\n *  @param {Element | string | undefined} options.target Specify a target if you want the control to be rendered outside of the map's viewport.\n *  @param {string | undefined} options.label Text label to use for the search button, default \"search\"\n *  @param {string | undefined} options.placeholder placeholder, default \"Search...\"\n *  @param {number | undefined} options.typing a delay on each typing to start searching (ms), default 500.\n *  @param {integer | undefined} options.minLength minimum length to start searching, default 3\n *  @param {integer | undefined} options.maxItems maximum number of items to display in the autocomplete list, default 10\n *\n *  @param {string|undefined} options.url URL to Nominatim API, default \"https://nominatim.openstreetmap.org/search\"\n * @see {@link https://wiki.openstreetmap.org/wiki/Nominatim}\n */\n\n\nclass ol_control_SearchES extends ol_control_SearchJSON {\n\n\n  constructor(options) {\n\n    options = options || {};\n    options.className = options.className || 'nominatim';\n    options.typing = options.typing || 500;\n    options.url = options.url || 'https://nominatim.openstreetmap.org/search';\n    super(options);\n    this.set('polygon', options.polygon);\n    this.set('viewbox', options.viewbox);\n    this.set('bounded', options.bounded);\n    this.set('alertmsg', options.alertmsg);\n  }\n\n  /** Returns the text to be displayed in the menu\n   *\t@param {ol.Feature} f the feature\n  *\t@return {string} the text to be displayed in the index\n  *\t@api\n  */\n  getTitle(f) {\n    return f.id.search('IGN') != -1 ?\n      f.title + ', ' + f.type :\n      f.address;\n  }\n\n  /** \n   * @param {string} s the search string\n   * @return {Object} request data (as key:value)\n   * @api\n   */\n  requestData_idee(s) {\n    var data = {\n      format: 'jsonp',\n      name_equals: s,\n      maxresults: 20,\n      polygon_geojson: this.get('polygon') ? 1 : 0,\n      bounded: this.get('bounded') ? 1 : 0,\n    };\n\n    if (this.get('viewbox')) data.viewbox = this.get('viewbox');\n    return data;\n  }\n  requestData_cc(s) {\n    var data = {\n      format: \"json\",\n      addressdetails: 1,\n      q: s,\n      polygon_geojson: this.get('polygon') ? 1 : 0,\n      bounded: this.get('bounded') ? 1 : 0,\n      limit: this.get('maxItems')\n    };\n\n    if (this.get('viewbox')) data.viewbox = this.get('viewbox');\n    return data;\n  }\n\n  /** A ligne has been clicked in the menu > dispatch event\n   *\t@param {any} f the feature, as passed in the autocomplete\n  *\t@api\n  */\n  select(f) {\n    var mapa = this.getMap();\n    var viewbox = this.get('viewbox');\n    var alertmsg = this.get('alertmsg');\n\n\n    if (f.id.search('IGN') != -1) {\n      $.ajax({\n        \"url\": 'https://www.idee.es/communicationsPoolServlet/Dispatcher',\n        \"dataType\": 'jsonp',\n        \"crossDomain\": true,\n        data: {\n          \"request\": 'OpenQuerySource',\n          \"query\": '<ogc:Filter><ogc:FeatureId fid=\"' + f.id + '\"/></ogc:Filter>',\n          \"sourcename\": 'http://www.idee.es/communicationsPoolServlet/sourceAccessWFS-INSPIRE-NGBE.rdf',\n          \"outputformat\": 'application/json'\n        },\n        success: function (cord) {\n          processData(cord.results[0].location, mapa, viewbox, alertmsg);\n        },\n        error: function (err) {\n          alert(err);\n        }\n      })\n\n    }\n    else {\n      var url = encodeURI('https://www.cartociudad.es/geocoder/api/geocoder/findJsonp');\n      var opt = {};\n      opt.dataType = 'jsonp';\n      var data = {\n        id: f.id,\n        type: f.type,\n        portal: f.portalNumber\n      }\n\n      this.ajax(url, data, function (resp) {\n        const response = JSON.parse(resp.slice(9, -1))\n        processData(response, mapa, viewbox, alertmsg);\n      }, opt);\n    }\n  }\n}\nfunction processData(result, mapa, viewbox, alertmsg) {\n  let lat = Number(result.lat);\n  let lng = Number(result.lng);\n  if (isNaN(lat) || isNaN(lng)) {\n    const cords = result.split(' ');\n    lat = parseFloat(cords[0]);\n    lng = parseFloat(cords[1]);\n\n  }\n  const olproj = mapa.getView().getProjection();\n  var c = ol_proj_transform([lng, lat], 'EPSG:4326', olproj);\n  if (containsCoordinate(viewbox, c)) {\n    mapa.getView().animate({\n      center: c,\n      zoom: Math.max(mapa.getView().getZoom(), 14)\n    }); mapa.addLayer(getMarkerVectorLayer(c));\n  }\n  else {\n    alertmsg.show('<div><p>' + window.gettext('La dirección seleccionada no se encuentra en la extensión del mapa...') + '</p></div>');\n    setTimeout(() => {\n      alertmsg.hide();\n    }, 5000)\n  }\n}\n\nfunction getMarkerVectorLayer(xy) {\n  var marker = new Feature({\n    geometry: new Point(xy),\n  });\n  const styles = getComputedStyle(document.body);\n  const color_marker = styles.getPropertyValue('--main-color').trim();\n  var iconStyle = new Style({\n    image: new Icon({\n      color: color_marker,\n      crossOrigin: 'anonymous',\n      anchorOrigin: 'bottom-left',\n      anchor: [0.5, 0],\n      anchorXUnits: 'fraction',\n      anchorYUnits: 'fraction',\n      src: '/media/uploads/site/location_pin.png',\n      scale: 0.5\n    })\n  });\n  marker.setStyle(iconStyle);\n  var vectorSource = new VectorSource({\n    features: [marker]\n  });\n  const markerVectorLayer = new VectorLayer({\n    source: vectorSource,\n    title: 'Marker',\n    displayInLayerSwitcher: false\n\n  });\n  markerVectorLayer.setZIndex(Infinity);\n  return markerVectorLayer;\n}\n\n\nol_control_SearchES.prototype.autocomplete = function (s, cback) {\n  this.cont = -1;\n  const url = window.location.protocol == 'https:'?\n     this.get('url').split(','):\n   this.get('url');\n\n  for (var i = 0; i < 2; i++) {\n    if (url[i].search('idee') != -1) {\n      const data = this.requestData_idee(s);\n      const opt = {};\n      opt.dataType = 'jsonp';\n      opt.data = data;\n      opt.url = url[i];\n      json(opt).then(function (res) {\n        ++this.cont;\n        cback(res.results)\n      }.bind(this))\n    }\n    else {\n      const data = this.requestData_cc(s);\n      const opt = {};\n      opt.dataType = 'jsonp';\n      opt.data = data;\n      opt.url = url[i];\n      this.ajax(opt.url, data, function (resp) {\n        ++this.cont;\n        if (typeof (cback) === 'function') cback(this.handleResponse(resp));\n      }, opt);\n    }\n  }\n}\n\n/** Draw the list\n* @param {Array} auto an array of search result\n* @private\n*/\nol_control_SearchES.prototype.drawList_ = function (auto) {\n  var self = this;\n  var ul = this.element.querySelector(\"ul.autocomplete\");\n  if (!auto) {\n    this.cont = -1;\n    var input = this.element.querySelector(\"input.search\");\n    var value = input.value;\n    auto = [];\n    if (!value) {\n      auto = this.get('history');\n    } else {\n      return;\n    }\n    ul.setAttribute('class', 'autocomplete history');\n  } else {\n    ul.setAttribute('class', 'autocomplete');\n  }\n  if (this.cont < 1) {\n    ul.innerHTML = '';\n    this._list = [];\n  }\n  var li, max = Math.min(self.get(\"maxItems\"), auto.length);\n  for (var i = 0; i < max; i++) {\n    if (auto[i]) {\n      if (!i || !self.equalFeatures(auto[i], auto[i - 1])) {\n        li = document.createElement(\"LI\");\n        li.setAttribute(\"data-search\", this._list.length);\n        this._list.push(auto[i]);\n        li.addEventListener(\"click\", function (e) {\n          self._handleSelect(self._list[e.currentTarget.getAttribute(\"data-search\")]);\n        });\n        var title = self.getTitle(auto[i]);\n        if (title instanceof Element) li.appendChild(title);\n        else li.innerHTML = title;\n        ul.appendChild(li);\n      }\n    }\n  }\n};\nfunction json(obj) {\n  return new Promise(function (resolve, reject) {\n    const url = encodeUrlXhr(obj.url, obj.data);\n    const config = {\n      method: 'GET',\n      mode: 'cors',\n\n    };\n\n    if (obj.dataType == 'jsonp') {\n      jsonp(url, 'callback', resolve);\n    } else {\n      fetch(url, config)\n        .then(function (r) { return r }).then(resolve)\n        .catch(reject);\n    }\n\n  });\n}\nfunction encodeUrlXhr(url, data) {\n  if (data && typeof data === 'object') {\n    url += (/\\?/.test(url) ? '&' : '?') + toQueryString(data);\n  }\n  return url;\n}\nfunction toQueryString(obj) {\n  return Object.keys(obj).reduce(function (a, k) {\n    a.push(\n      typeof obj[k] === 'object'\n        ? toQueryString(obj[k])\n        : ((encodeURIComponent(k)) + \"=\" + (encodeURIComponent(obj[k])))\n    );\n    return a;\n  }, []).join('&');\n}\n\nfunction jsonp(url, key, callback) {\n  // https://github.com/Fresheyeball/micro-jsonp/blob/master/src/jsonp.js\n  let head = document.head,\n    script = document.createElement('script'),\n    // generate minimally unique name for callback function\n    callbackName = 'f' + Math.round(Math.random() * Date.now());\n\n  // set request url\n  script.setAttribute('src',\n    /*  add callback parameter to the url\n          where key is the parameter key supplied\n          and callbackName is the parameter value */\n    (url + (url.indexOf('?') > 0 ? '&' : '?') + key + '=' + callbackName));\n\n  /*  place jsonp callback on window,\n      the script sent by the server should call this\n      function as it was passed as a url parameter */\n  window[callbackName] = function (data) {\n    window[callbackName] = undefined;\n\n    // clean up script tag created for request\n    setTimeout(function () { return head.removeChild(script); }, 0);\n\n    // hand data back to the user\n    callback(data);\n  };\n\n  // actually make the request\n  head.appendChild(script);\n}\nexport default ol_control_SearchES;\n","import { $, getParameterByName, flatpickr, dayjs, multiselectOptions, LAYERTYPES } from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport \"jquery-ui/ui/widgets/menu\";\nimport { Control } from 'ol/control';\nimport { Vector as VectorLayer } from 'ol/layer';\nimport { Vector as VectorSource } from 'ol/source';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport WKT from 'ol/format/WKT';\nimport { cargarMapa } from './mapa.mjs';\n\nimport { Layer } from './simmerlayer.mjs';\n\nconst dateInputFormat = 'YYYY-MM-DD HH:mm';\n\nlet datatable;\n\nfunction createSimulation(from_datatable) {\n    if (from_datatable)\n        datatable = $(from_datatable).DataTable();\n    $('#simulation-element-type-dialog table tbody').empty()\n    $('#simulation-element-type-dialog').dialog({\n        title: window.gettext('Seleccione tipo...'),\n        width: 180,\n        height: 'auto',\n        maxHeight: window.innerHeight,\n    });\n    $.ajax({\n        url: window.Urls.simulation_types(),\n        success: function (json) {\n            for (const elem_type of json) {\n                const row = $(`<tr element_type=\"${elem_type.id}\"><td>${elem_type.name}</td></tr>`);\n                $('#simulation-element-type-dialog table tbody').append(row);\n            }\n            $('#simulation-element-type-dialog').on('click', 'tr', 'create', function (evt) {\n                const element_type_id = $(evt.currentTarget).closest('tr').attr('element_type');\n                evt.element_type_id = element_type_id;\n                actOnElement.bind(this)(evt);\n                $('#simulation-element-type-dialog').dialog(\"close\");\n            });\n            if (json.length == 1)\n                $('#simulation-element-type-dialog tr').click();\n        }\n    });\n}\n\nfunction actOnElement(evt) {\n    let buttons, tableId;\n    const datatableId = this.getAttribute('table_id');\n    const activeControl = this.id;\n    if (datatableId)\n        datatable = $('#' + datatableId).DataTable();\n    evt.preventDefault()\n    const new_pos = {\n        my: 'center',\n        at: 'center',\n        collision: \"fit\"\n    };\n    let op = evt.data;\n    if (evt.data.action) {\n        op = evt.data.action;\n    }\n    const mapa = evt.data.mapa;\n    const element_id = this.id ? this.id.split('_')[1] : null;\n    const alertOverlay = evt.data.alertOverlay;\n    if (op === 'info') {\n        tableId = '#simulation-element-info';\n        const element = $(tableId);\n        buttons = [\n        ];\n        element.show().dialog({\n            title: window.gettext('Información'),\n            width: 'auto',\n            buttons: buttons,\n            position: new_pos,\n            autoOpen: false,\n        });\n        fillElementInfo(element, element_id, true);\n    }\n    else if (op === 'delete') {\n        tableId = '#simulation-element-info';\n        const element = $(tableId);\n        buttons = [\n            {\n                text: window.gettext('Cancelar'),\n                click: function () {\n                    $(this).dialog(\"close\");\n                },\n            },\n            {\n                text: window.gettext('Eliminar'),\n                click: function () {\n                    const dialog = this;\n                    $.ajax({\n                        url: window.Urls.simulation_delete(element_id),\n                        type: 'POST',\n                        success: function () {\n                            $(dialog).dialog(\"close\");\n                            if (datatable)\n                                datatable.ajax.reload();\n                        }\n                    });\n                },\n            },\n        ];\n        element.show().dialog({\n            title: window.gettext('Confirmar eliminación'),\n            width: 'auto',\n            buttons: buttons,\n            position: new_pos,\n            autoOpen: false,\n        });\n        fillElementInfo(element, element_id, true);\n    }\n    else if (op === 'share') {\n        tableId = '#simulation-share-dialog';\n        const share_window = $(tableId).clone().prop(\"id\", \"simulation-share-dialog_\" + element_id)\n        buttons = [\n            {\n                text: window.gettext('Guardar'),\n                click: function () {\n                    const dialog = this;\n                    const form = share_window.find('form');\n                    const formData = new FormData(form[0]);\n                    const edit_users = formData.getAll('edit_users');\n                    const ro_users = formData.getAll('readonly_users');\n                    if (edit_users.filter(element => ro_users.includes(element)).length) {\n                        const tableId = '#simulation-users-alert-dialog';\n                        const alert_window = $(tableId).clone().prop(\"id\", \"simulation-users-alert-dialog_\" + element_id)\n                        buttons = [\n                            {\n                                text: window.gettext('Aceptar'),\n                                click: () => alert_window.dialog(\"close\"),\n                            },\n                        ];\n                        alert_window.show().dialog({\n                            title: window.gettext('Error de permisos'),\n                            width: 'auto',\n                            height: 'auto',\n                            buttons: buttons,\n                            position: new_pos,\n                            autoOpen: true,\n                        });\n                    }\n                    else\n                        $.ajax({\n                            url: window.Urls.simulation_share(element_id),\n                            data: formData,\n                            cache: false,\n                            contentType: false,\n                            processData: false,\n                            method: 'POST',\n                            success: function (json) {\n                                if (json.result == 'OK') {\n                                    $(dialog).dialog(\"close\");\n                                    if (activeControl)\n                                        $('#' + activeControl).parent().fadeToggle(400).fadeToggle(400);\n                                }\n                                else {\n                                    alert(json.message);\n                                }\n                            }\n                        });\n                },\n            },\n        ];\n        $.ajax({\n            url: window.Urls.simulation_users(element_id),\n            success: function (json) {\n                const sel_edit = share_window.find('select#edit');\n                const sel_ro = share_window.find('select#readonly');\n                const rellena_sel = function (sel, json) {\n                    const rel = sel.attr('relation');\n                    for (const u of json) {\n                        sel.append($(`<option ${u.relation == rel ? 'selected' : ''} value=\"${u.id}\">${u.name}</option>`));\n                    }\n                    sel.multiSelect(multiselectOptions(\n                        '<div class=\"multiselect-header\">Sin permiso</div>',\n                        '<div class=\"multiselect-header\">Con permiso</div>'\n                    ));\n                    sel.on('change', function () {\n                        const form = sel.closest('form');\n                        form.find('.ms-selection li').attr('title', window.gettext('Deseleccionar'))\n                        form.find('.ms-selectable li').attr('title', window.gettext('Seleccionar'))\n                    });\n                    sel.trigger('change');\n                }\n                if (json.filter(c => c.self)[0].relation != 'EDIT')\n                    buttons = [];\n                rellena_sel(sel_edit, json);\n                rellena_sel(sel_ro, json);\n                share_window.show();\n                share_window.dialog({\n                    title: window.gettext('Seleccione personas con acceso'),\n                    width: 'auto',\n                    height: 'auto',\n                    buttons: buttons,\n                    position: new_pos,\n                    autoOpen: true,\n                });\n            },\n        })\n    }\n    else if (op === 'lock') {\n        tableId = '#simulation-lock-dialog';\n        const lock_window = $(tableId).clone().prop(\"id\", \"simulation-lock-dialog_\" + element_id)\n        buttons = [\n            {\n                text: window.gettext('Aceptar'),\n                click: function () {\n                    const dialog = this;\n                    $.ajax({\n                        url: window.Urls.simulation_lock(element_id),\n                        method: 'POST',\n                        success: function () {\n                            if (mapa.get('simulation_id') == element_id)\n                                window.reload();\n                            else {\n                                $(dialog).dialog(\"close\");\n                                if (activeControl)\n                                    $('#' + activeControl).parent().fadeToggle(400).fadeToggle(400);\n                            }\n                        }\n                    });\n\n                },\n            },\n        ];\n        lock_window.show().dialog({\n            title: window.gettext('Bloqueo de simulación'),\n            width: 'auto',\n            height: 'auto',\n            buttons: buttons,\n            position: new_pos,\n            autoOpen: true,\n        });\n    }\n    else if (op === 'de/sel-elem') {\n        if (mapa.get('geom_feature')) {\n\n            let element_layer;\n            mapa.getLayers().getArray().forEach(el => {\n                if (el.get('title') == 'elementsLayerGroup') {\n                    el.getLayersArray().forEach(element => {\n                        if (element.get('name') == 'elements') {\n                            element_layer = element;\n                        }\n                    })\n                }\n            })\n            tableId = '#simulation-elements-dialog';\n            buttons = [\n                {\n                    text: window.gettext('Guardar'),\n                    click: function () {\n                        const dialog = this;\n                        const form = $(tableId + ' form');\n                        const formData = new FormData(form[0]);\n\n                        $.ajax({\n                            url: window.Urls.element_update(element_id),\n                            data: formData,\n                            cache: false,\n                            contentType: false,\n                            processData: false,\n                            method: 'POST',\n                            success: function () {\n                                $(dialog).dialog(\"close\");\n                                mapa.set('update_elements', true);\n                            }\n                        });\n                    },\n                },\n                {\n                    text: window.gettext('Cancelar'),\n                    click: function () {\n                        const dialog = this;\n                        $(dialog).dialog(\"close\");\n                    }\n                }\n            ];\n            const view = mapa.getView();\n            const viewResolution = view.getResolution();\n            const viewProjection = view.getProjection();\n            const src = element_layer.getSource();\n            if (src.getParams().TYPES == ',')\n                src.getParams().TYPES = null;\n\n            const url = src.getFeatureInfoUrl(\n                view.getCenter(),\n                viewResolution,\n                viewProjection,\n                {\n                    INFO_FORMAT: 'application/vnd.meteogrid.emmet+json',\n                    geom_from_simulation: true,\n                    simulation_num: element_id\n                }\n            );\n            $.ajax({\n                url: url.replace(/&I=/, '&II='),\n                success: function (json) {\n                    const sel = $(tableId + ' select');\n                    sel.empty();\n                    for (const u of json.features) {\n                        const props = u.properties;\n                        sel.append($(`<option ${props.selected ? 'selected' : ''} value=\"${props.id}\">\n                            ${props.name ? props.name : props.element_type__name}\n                            </option>`));\n                    }\n                    sel.multiSelect(multiselectOptions());\n                    sel.on('change', function () {\n                        const form = sel.closest('form');\n                        form.find('.ms-selection li').attr('title', window.gettext('Deseleccionar'))\n                        form.find('.ms-selectable li').attr('title', window.gettext('Seleccionar'))\n\n                    });\n                    sel.trigger('change');\n                    $(tableId).show();\n                    $(tableId).dialog({\n                        title: window.gettext('Seleccione elementos asociados:'),\n                        width: 'auto',\n                        height: 'auto',\n                        buttons: buttons,\n                        position: new_pos,\n                        autoOpen: true,\n                    });\n                },\n            })\n        }\n        else {\n            alertOverlay.show(`<div><p>\n                ${window.gettext('Por favor, seleccione el área de simulación afectada antes de continuar...')}\n                </p></div>`);\n            setTimeout(() => {\n                alertOverlay.hide();\n            }, 10000)\n        }\n    }\n    else if (op === 'report') {\n        window.open(window.Urls.simulation_report(element_id))\n    }\n    else if (op === 'clone') {\n        tableId = '#simulation-edit-dialog';\n        const element = $(tableId);\n        buttons = [\n            {\n                text: window.gettext('Cancelar'),\n                click: function () {\n                    $(this).dialog(\"close\");\n                },\n            },\n            {\n                text: window.gettext('Clonar'),\n                click: function () {\n                    const popup = window.open();\n                    const self = this;\n                    popup.document.write(window.gettext('Cargando copia de propagación...'));\n                    const form = element.find('form');\n                    const formData = new FormData(form[0]);\n                    const x = new Date(formData.get('element_initdate'))\n                    formData.set('element_initdate_iso', x.toISOString())\n                    $.ajax({\n                        url: window.Urls.simulation_clone(element_id),\n                        type: 'POST',\n                        data: formData,\n                        contentType: false,\n                        processData: false,\n                    })\n                        .done(function (json) {\n                            popup.location = window.Urls.simulation_page(json.id);\n                            $(self).dialog(\"close\");\n                            if (datatable)\n                                datatable.ajax.reload();\n                        });\n                },\n            },\n        ];\n        element.show().dialog({\n            title: window.gettext('Confirmar clonado'),\n            width: 'auto',\n            buttons: buttons,\n            position: new_pos,\n            autoOpen: false,\n        });\n        fillElementInfo(element, element_id, false, null, true);\n    }\n    else if (op === 'FIRE_VIEW_ERA5LAND_FORECAST_BEHAVE') {\n        window.open(window.Urls.fire_view_era5land_forecast_behave(element_id));\n    }\n    else if (op === 'GEN_ERA5LAND_FORECAST_BEHAVE') {\n        window.open(window.Urls.gen_era5land_forecast_behave(element_id));\n    }\n    else if (op === 'edit' || op === 'create') {\n        tableId = '#simulation-edit-dialog';\n        buttons = [\n            {\n                text: window.gettext('Cancelar'),\n                click: function () {\n                    $(this).dialog(\"close\");\n                },\n            },\n        ];\n        buttons.unshift({\n            text: op === 'edit' ? window.gettext('Modificar') : window.gettext('Crear'),\n            click: function () {\n                const dialog = this;\n                const form = $(tableId + ' form');\n                const formData = new FormData(form[0]);\n                let datetime = formData.get('element_initdate');\n                datetime = dayjs(datetime);\n                formData.set('element_initdate', datetime.toISOString());\n                const popup = op === 'edit' ? null : window.open();\n                if (popup)\n                    popup.document.write(window.gettext('Cargando nueva propagación...'));\n                $.ajax({\n                    url: (op === 'edit' ? window.Urls.simulation_edit(element_id) : window.Urls.simulation_edit_new()),\n                    data: formData,\n                    cache: false,\n                    contentType: false,\n                    processData: false,\n                    method: 'POST',\n                    success: function (json) {\n                        $(dialog).dialog(\"close\");\n                        if (datatable)\n                            datatable.ajax.reload(\n                                () => activeControl && $('#' + activeControl).parent().fadeToggle(400).fadeToggle(400),\n                                false\n                            );\n                        if (popup)\n                            popup.location = window.Urls.simulation_page(json.id);\n                    },\n                    error: function () {\n                        if (popup)\n                            popup.close();\n                    }\n                });\n\n            },\n        });\n        const propDialog = createProp_dialog(tableId, buttons, op, new_pos);\n        fillElementInfo(propDialog, element_id, false, evt.element_type_id);\n    }\n    else {\n        console.debug('Modificar - ' + op + ' ' + element_id);\n    }\n    return false;\n}\nfunction createProp_dialog(tableId, buttons, op, new_pos) {\n    const createProp_element = $(tableId);\n    createProp_element.find('td.group_share').parent().remove()\n    if (op === 'create')\n        $.ajax({\n            url: window.Urls.simulation_user_groups(),\n            success: function (json) {\n                json.map(group => {\n                    createProp_element.find('form tbody').append(`\n                        <tr>\n                            <td class=\"group_share\"><label>\n                                <input name=\"group_${group.id}\" class=\"group_share\" type=\"checkbox\" checked>\n                                <a>${window.gettext('Compartir con el grupo')} \"${group.name}\"</a>\n                            </label></td>\n                        </tr>`)\n                })\n            }\n        })\n    createProp_element.dialog({\n        width: 'auto',\n        position: new_pos,\n        title: op === 'edit' ? window.gettext('Modificar') : window.gettext('Crear'),\n        zIndex: 10000,\n        autoOpen: false,\n        buttons: buttons,\n        open: function () {\n            $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n            if ($(this).parent().height() > $(window).height()) {\n                $(this).height($(window).height() * 0.7);\n                $(this).dialog({ position: \"center\" });\n            }\n        },\n    });\n    return createProp_element;\n}\nfunction fillElementInfo(propDialog, element_id, read_only, simulationtype_id, prevent_new_data) {\n    let elems, v;\n    const urlFunction = element_id ? window.Urls.simulation_info(element_id) : window.Urls.simulation_info_new(simulationtype_id);\n    $.getJSON(\n        urlFunction,\n        function (json) {\n            propDialog.find('ul.add-data').remove();\n            propDialog.find('.vardata').remove();\n            const old_data = json.data;\n            delete json.data;\n            json.initdate = dayjs(json.initdate).format(dateInputFormat);\n            const events = json.events;\n            delete json.events;\n            for (const k in json) {\n                const vdat = json[k];\n                v = elementValue(vdat);\n                elems = propDialog.find('.data_old.element_' + k);\n\n                elems.text(v);\n                const casilla = crearCasilla(vdat);\n                const elem = propDialog.find('.data_new.element_' + k);\n                if (elem.length && casilla) {\n                    casilla.attr('name', elem.attr('name'));\n                    for (let cls of elem.attr('class').split(' '))\n                        casilla.addClass(cls);\n                    elem.replaceWith(casilla);\n                }\n                else if (elem.length && elem[0].name === 'element_initdate') {\n                    elem[0].type = 'text';\n                    const appendTo = document.getElementsByClassName('map');\n                    flatpickr(elem,\n                        {\n                            defaultDate: json.initdate,\n                            enableTime: true,\n                            dateFormat: \"Y-m-dTH:i\",\n                            altInput: true,\n                            altFormat: \"d-m-Y H:i\",\n                            time_24hr: true,\n                            minuteIncrement: 1,\n                            appendTo: appendTo.length && appendTo[0],\n                        }\n                    );\n\n                }\n                else {\n                    elem.val(v);\n                }\n            }\n            const new_data = read_only ? [] : old_data;\n            if (old_data.length)\n                crearFilaData(propDialog, old_data.concat(read_only ? events : []), new_data, read_only);\n            if (propDialog.find('.data_new').length > 1) {\n                // Montamos lista de opciones para crear datos nuevos\n                const available_data = json.simulationtype.data;\n                const data_menu = $('<ul class=\"add-data\"></ul>');\n                let show_button = false;\n                for (let i = 0; i < available_data.length; i++) {\n                    const dat = available_data[i];\n                    if (dat.type.name.startsWith('_'))\n                        continue\n                    if (dat.type.calculation_id)\n                        continue\n                    delete dat.id;\n                    const it = $('<li idx_available_data=\"' + i + '\">Añadir ' + dat.type.name + '</li>');\n                    data_menu.append(it);\n                    show_button = true;\n                }\n                const buttons = propDialog.dialog('option', 'buttons');\n                if (!json.__edit)\n                    buttons.shift();\n                const button = {\n                    text: window.gettext('Añadir dato'),\n                    classes: 'add-data',\n                    click: function () {\n                        $(this).append(data_menu);\n                        data_menu.menu({\n                            select: function (event, ui) {\n                                const idx = ui.item[0].attributes.idx_available_data.value;\n                                const dat = available_data[idx];\n                                crearFilaData(propDialog, [], [dat], read_only);\n                            },\n                        });\n                    },\n                };\n                if (show_button && !prevent_new_data)\n                    buttons.push(button);\n                propDialog.dialog('option', 'buttons', buttons);\n            }\n            propDialog.dialog('open');\n            /*\n            propDialog.find('table.events').DataTable( {\n                retrieve: true,\n                paging: false,\n                searching: false,\n                info: false,\n                dom: 't',\n                ordering: false,\n            } );\n            propDialog.find('table.files').DataTable( {\n                retrieve: true,\n                paging: false,\n                searching: false,\n                ordering:  false,\n                info: false,\n                dom: 't',\n            } );\n            */\n        }\n    );\n}\nfunction elementValue(value) {\n    if (value == null)\n        return '';\n    if (typeof value == 'object' && value.type && ['date', 'event'].includes(value.type.klass)) {\n        if (value.value == null)\n            return null\n        return dayjs(value.value).format(dateInputFormat);\n    }\n    if (typeof value == 'object' && value.type && value.type.klass === 'str')\n        return value.value;\n    if (typeof value == 'object' && value.type && value.type.klass === 'parameter')\n        return value.value && value.value.name;\n    if (typeof value == 'object' && value.name !== undefined)\n        return value.name;\n    if (typeof value == 'object' && value.url)\n        return value.url;\n    if (typeof value == 'object')\n        return value.toString();\n    return value;\n}\nfunction crearFilaData(propDialog, old_data, new_data) {\n    const old_vars = Object.groupBy(old_data, function (x) { return x.type.name; });\n    const new_vars = Object.groupBy(new_data, function (x) { return x.type.name; });\n    const all_vars = [...new Set(Object.keys(old_vars).concat(Object.keys(new_vars)))];\n    let order = propDialog.find('.data_new').length + 1;\n    for (let itype = 0; itype < all_vars.length; itype++) {\n        const type = all_vars[itype];\n        let rowspan = 1;\n        if (old_vars[type])\n            rowspan = old_vars[type].length;\n        if (new_vars.type && new_vars[type].length > rowspan)\n            rowspan = new_vars[type].length;\n        for (let i = 0; i < rowspan; i++) {\n            const vdat_old = type in old_vars && old_vars[type][i];\n            const vdat_new = type in new_vars && new_vars[type][i];\n            const vdat = vdat_new ? vdat_new : vdat_old;\n            const which_table = '.data';\n            const modelTR = propDialog.find(which_table).find('tr.model-row');\n            const tr = modelTR.clone();\n            tr.addClass('vardata');\n            tr.removeClass('model-row');\n            tr.find('.caption').text(type);\n            const existentes = propDialog.find('.data_new_' + vdat.type.id);\n            if (i == 0 && existentes.length && !vdat.multiple) {\n                existentes.fadeToggle(40).fadeToggle(40);\n                continue;\n            }\n            const suffix = (vdat.id ? vdat.id : '') + '_' + vdat.type.id + '_' + order;\n            order++;\n            const casilla = crearCasilla(vdat);\n            if (casilla) {\n                casilla.addClass('data_new')\n                tr.find('.data_new').replaceWith(casilla);\n            } else {\n                tr.find('.data_new').val(elementValue(vdat));\n            }\n            if (vdat.id)\n                tr.find('input.delete').attr('name', 'delete_' + suffix);\n            else\n                tr.find('input.delete').parent().remove();\n            tr.find('.data_new').addClass('data_new_' + vdat.type.id);\n            tr.find('.data_new').attr('name', 'data_' + suffix);\n\n            if (vdat_old) {\n                if (vdat_old.type.klass == 'file') {\n                    tr.find('span.data_old').replaceWith($(`<a target=\"_blank\" href=\"${vdat_old.value.url}\"><i class=\"enlace-icono fa fa-book\" ></i>${vdat_old.value.url.split(/[\\\\/]/).pop()}\n                    </a>`));\n                }\n                else\n                    tr.find('span.data_old').text(elementValue(vdat_old));\n            }\n            modelTR.before(tr);\n        }\n    }\n}\nfunction crearCasilla(vdat) {\n    if (vdat == null)\n        return null;\n    let url;\n    if (typeof vdat !== 'object')\n        return null;\n    if (Array.isArray(vdat))\n        return null;\n    const klass = vdat.type.klass;\n    if (klass === 'parameter' || klass == 'table') {\n        if (klass === 'parameter')\n            url = window.Urls.parameter_options(vdat.type.parameter_type.locator);\n        if (vdat.type.locator == \"SIMULATION_TYPE\")\n            url = window.Urls.simulation_types();\n        else if (klass == 'table')\n            url = window.Urls.table_options(vdat.type.name);\n        let casilla = $('<select></select>');\n        $.getJSON(\n            url,\n            function (json) {\n                // if (!vdat.fixed)\n                //     $('<option ' + (selected ? 'selected=\"selected\"' : '') + '/>').val(null).html('-').appendTo(casilla);\n                for (const k in json) {\n                    const opt = json[k];\n                    const selected = vdat.value ? vdat.value.name == opt.name : false;\n                    $('<option ' + (selected ? 'selected=\"selected\"' : '') + '/>').val(opt.id).html(opt.name).appendTo(casilla);\n                }\n            }\n        );\n        return casilla;\n    }\n    if (klass === 'date')\n        return $(`<input type=\"datetime-local\" value=\"${dayjs(vdat.value).format(dateInputFormat)}\">`);\n    if (klass === 'file')\n        if (vdat.id)\n            return $('<span/>');\n        else\n            return $('<input type=\"file\" />');\n    if (klass === 'integer')\n        return $(`<input type=\"number\" value=\"${vdat.value}\">`);\n    if (klass === 'float')\n        return $(`<input type=\"number\" value=\"${vdat.value}\">`);\n    if (klass === 'str')\n        return null;\n}\n\nclass NewLaunchControl extends Control {\n    constructor(opt_options) {\n        const options = opt_options || {};\n\n        const button = document.createElement('button');\n        button.innerHTML = `<i class=\"fa fa-${options.fa}\"></i>`;\n        button.title = options.title || options.action;\n        button.id = options.action + '_' + options.id;\n        const element = document.createElement('div');\n        element.className = 'ol-unselectable ol-control';\n        element.appendChild(button);\n        super({\n            element: element,\n            target: options.target\n        });\n        const self = this;\n        $(button).click(function () {\n            const element_id = this.id ? this.id.split('_')[1] : null;\n            $.ajax({\n                url: window.Urls.simulation_launch(element_id),\n                method: 'POST',\n                dataType: 'json',\n                contentType: 'application/json'\n            })\n                .done(function (resp) {\n                    console.log(resp);\n                    window.setTimeout(function () { refresco(element_id, self.getMap()); }, 3000);\n                })\n                .fail(function () {\n                    alert('error');\n                });\n        });\n    }\n}\n\nclass ActControl extends Control {\n    constructor(opt_options) {\n        const options = opt_options || {};\n\n        const button = document.createElement('button');\n        if (options.html) {\n            button.innerHTML = options.html\n        }\n        else button.innerHTML = `<i class=\"${options.fa}\"></i>`;\n        button.title = options.title || options.action;\n        button.id = options.action + '_' + options.id;\n\n        $(button).click(options, actOnElement);\n        const element = document.createElement('div');\n        element.className = 'ol-unselectable ol-control';\n        element.appendChild(button);\n        super({\n            element: element,\n            target: options.target\n        });\n    }\n}\nclass SimulationElementsLayer extends Layer {\n    get ol_factory() {\n        return VectorLayer;\n    }\n    get source() {\n        const src = new VectorSource({\n            format: new GeoJSON(),\n            url: this._url\n        });\n        src.on('change:time', function () {\n            const time = this.get('time');\n            const effective_time = time\n                .add(this.get('time_delta') || 0, 'hours');\n            this.set('effective_time', effective_time);\n        });\n        return src;\n    }\n}\nLAYERTYPES.SIMUL = SimulationElementsLayer;\n\nfunction refresco(id, mapa) {\n    $.ajax(window.Urls.simul_json(id))\n        .then(function (ret) {\n            if (ret.sigym_config.state == 'ready') {\n                location.reload();\n            }\n            if (ret.sigym_config.state == 'error') {\n                mapa.set('notification', `${window.gettext('error')}`);\n                console.log(`${window.gettext('error:')} ${ret.sigym_config.cause}`);\n                location.reload();\n            }\n            else if (ret.sigym_config.state == 'busy') {\n                window.setTimeout(function () { refresco(id, mapa); }, 3000);\n                mapa.set('notification', `${window.gettext(ret.sigym_config.progress_status)}`);\n            } else {\n                if (ret.sigym_config.state == 'ready') {\n                    mapa.set('notification', `${window.gettext('cargando resultado...')}`);\n                } else {\n                    mapa.set('notification', ret.sigym_config.state);\n                }\n            }\n            if (ret.sigym_config.extra_info)\n                console.log(`${window.gettext('info extra:')}`);\n            ret.sigym_config.extra_info.forEach(item => console.log(`- ${item}`));\n        });\n}\n\nasync function navigateToElement(mapa, element_id) {\n    const response = await fetch(window.Urls.element_info(element_id));\n    const json = await response.json();\n    const geom = json.geometry;\n    const wktFormat = new WKT();\n    const map_geom = wktFormat.readGeometry(geom, {\n        dataProjection: 'EPSG:4326',\n        featureProjection: window.epsg\n    });\n    const view = mapa.getView();\n    view.fit(map_geom, {\n        maxZoom: view.getMaxZoom() - 9,\n    });\n    for (const d of json.data)\n        if (d.type.locator == 'START_DATETIME') {\n            window.timelinectl.timeline.moveTo(d.value);\n            window.timelinectl.timeline.setCustomTime(d.value, 'current');\n            window.timelinectl.timeline.emit('click', { time: window.timelinectl.timeline.getCustomTime('current') });\n        }\n\n}\n\nexport function cargaInicialSimulacion(ns) {\n    if (ns.simulation_id)\n        $($.getJSON(window.Urls.simul_json(ns.simulation_id, ns.page_id),\n            async function (cfg) {\n                cfg.simul.relations = cfg.relations;\n                const mapa = await cargarMapa(ns, ns.page.find('.mapa'), cfg.page, cfg.simul);\n                if (cfg.sigym_config.state == 'busy') {\n                    window.setTimeout(function () { refresco(cfg.simul.id, mapa) }, 3000);\n                } else if (cfg.sigym_config.state == 'ready') {\n                    console.debug('cargando resultado...');\n                } else {\n                    $('.titulo_cabecera_izq').text(cfg.sigym_config.state)\n                }\n                if (cfg.sigym_config.state == 'error')\n                    console.log(`${window.gettext('error:')} ${cfg.sigym_config.cause}`);\n                if (cfg.sigym_config.extra_info) {\n                    console.log(`${window.gettext('info extra:')}`);\n                    cfg.sigym_config.extra_info.forEach(item => console.log(`- ${item}`));\n                }\n                const element_id = getParameterByName('element_id');\n                if (element_id)\n                    navigateToElement(mapa, element_id);\n            }\n        ))\n    if (ns.element_id)\n        $.getJSON(window.Urls.page_json(ns.page_id), async function (cfg) {\n            const mapa = await cargarMapa(ns, ns.page.find('.mapa'), cfg);\n            navigateToElement(mapa, ns.element_id);\n        })\n}\n\n\nexport {\n    actOnElement, createSimulation,\n    NewLaunchControl, ActControl, SimulationElementsLayer, fillElementInfo, createProp_dialog\n};\n","import { $, dayjs, flatpickr, transform_point, get_horizon } from '../../../moderna_meteogrid/statix/js/base.mjs';\n\n\nimport WKT from 'ol/format/WKT';\nimport { getArea } from 'ol/sphere';\nimport { Polygon, MultiPolygon } from 'ol/geom';\n\nimport { numeric_lang_format, create_graph_control } from '../../../simmer/statix/simmer/js/mapa.mjs'\n\n\n\nlet mapa;  //  FIXME: objeto global un poco feo\n\nfunction initializeMapa(mapa_) { //  FIXME: objeto global un poco feo\n  mapa = mapa_;\n}\n\n\nfunction configureCalendar(calendar_element, enableTime) {\n  const options = {}\n  if (enableTime && window.timelinectl) {\n    try {\n      options.minDate = window.timelinectl.timeline.getCustomTime('Inicio').toISOString();\n      options.maxDate = window.timelinectl.timeline.getCustomTime('Fin').toISOString();\n    } catch {\n      null;\n    }\n  }\n  return flatpickr(calendar_element, {\n    wrap: true,\n    dateFormat: enableTime ? 'Y-m-dTH:i' : 'Y-m-d',\n    altInput: true,\n    altFormat: enableTime ? 'd-m-Y H:i' : 'd-m-Y',\n    allowInput: true,\n    //static: true,\n    clickOpens: true,\n    enableTime,\n    time_24hr: true,\n    minuteIncrement: 1,\n    appendTo: calendar_element.find('input.form-control')[0],\n    ...options\n  });\n}\n\nfunction elementValue(value) {\n  if (value == null) return '';\n  if (Array.isArray(value)) {\n    let ret = [];\n    for (const x of value)\n      ret.push(elementValue(x));\n    return ret.join(', ');\n  }\n  if (typeof value == 'object' && value.name) return value.name;\n  if (typeof value == 'object') return value.toString();\n  return value;\n}\n\nfunction crearSubCasilla(vdat, value, klass, readOnly) {\n  const format = vdat.type.format;\n  if (klass === 'parameter') {\n    const casilla = $('<select class=\"data_new\"></select>');\n    $.getJSON(window.window.Urls.parameter_options(vdat.type.parameter_type.locator), function (json) {\n      if (!vdat.fixed)\n        $('<option />')\n          .val(null)\n          .html('-')\n          .appendTo(casilla);\n      for (const opt of json) {\n        const selected = value ? value.id == opt.id : false;\n        $('<option ' + (selected ? 'selected=\"selected\"' : '') + '/>')\n          .val(opt.id)\n          .html(opt.name)\n          .appendTo(casilla);\n      }\n    });\n    return casilla;\n  }\n  if (klass === 'multiparameter') {\n    const casilla = $('<select class=\"data_new\" multiple></select>');\n    $.getJSON(window.Urls.parameter_options(vdat.type.parameter_type.locator), function (json) {\n      if (!vdat.fixed)\n        $('<option />')\n          .val(null)\n          .html('-')\n          .appendTo(casilla);\n      for (const k in json) {\n        const opt = json[k];\n        const selected = value && value.some(function (x) { return x.id == opt.id });\n        $('<option ' + (selected ? 'selected=\"selected\"' : '') + '/>')\n          .val(opt.id)\n          .html(opt.name)\n          .appendTo(casilla);\n      }\n    });\n    return casilla;\n  }\n  if (klass === 'date') {\n    const type = /[Hh]/.test(format) ? 'datetime-local' : 'date';\n    let dvalue = '';\n    if (value) {\n      const mvalue = dayjs(value);\n      if (type == 'date')\n        dvalue = mvalue.format('YYYY-MM-DD')\n      else\n        dvalue = mvalue.local().format('YYYY-MM-DD HH:mm');\n    }\n    if (readOnly) {\n      return dvalue;\n    } else {\n      const hasTime = type === 'datetime-local';\n      const placeholder = hasTime ? 'DD-MM-YYYY hh:mm' : 'DD-MM-YYYY';\n      const klass = hasTime ? 'hasTime' : 'hasNoTime';\n      const input_date = $(`\n          <span class=\"calendar-filter ${klass}\">\n          <input type=\"text\" value=\"${dvalue}\" placeholder=\"${placeholder}\" class=\"data_new\" data-input>\n          <a class=\"input-button\" title=\"${window.gettext('Abrir calendario')}\" data-toggle>\n            <i class=\"fa fa-calendar-alt\" id=\"calendar-icon\"></i>\n          </a>\n        </span>\n      `)\n      configureCalendar(input_date, hasTime);\n      return input_date;\n    }\n  }\n  if (klass === 'file') {\n    let ret = `<label name=\"upload\" title=\"${window.gettext(value ? 'Sustituir fichero existente' : 'Subir fichero')}\">\n          <input type=\"file\" class=\"data_new\" />\n          <i class=\"fa fa-cloud-upload\"></i>\n        </label>`\n    if (vdat.type.columns != 'file' && value?.url) // dato simple\n      ret += ` <a target=\"_blank\" href=\"${value.url}\"><i class=\"enlace-icono fa fa-book\" ></i>\n      ${value.url.split(/[\\\\/]/).pop()}</a> `;\n    return $(ret);\n  }\n  if (klass === 'integer')\n    return $('<input class=\"data_new\" type=\"number\">');\n  if (klass === 'float')\n    return $('<input class=\"data_new\" type=\"number\">');\n  if (klass === 'boolean')\n    return $(`<label>\n                  <input class=\"data_new\" value=\"True\" type=\"checkbox\" ${vdat.value ? 'checked=\"checked\"' : ''}>\n                  <a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>\n              </label>`);\n  if (klass === 'geom') {\n    const ret = $(`<span class=\"ui-dialog-buttonpane\">\n      <button class=\"geom-point\" title=\"${window.gettext('ubicación')}\"><i class=\"fa-solid fa-location-pin\"></i></button>\n      <textarea class=\"data_new hidden\"></textarea>\n    </span >`)\n    if (!readOnly) {\n      ret.append($(`<button class=\"geom-delete\" title=\"${window.gettext('eliminar ubicación')}\"><i class=\"fa-solid fa-x\"></i></button>\n      `))\n      ret.find('button.geom-point').on('click', function (evt) {\n        evt.preventDefault();\n        mapa.set('new_feature', 'Point');\n      });\n      ret.find('button.geom-delete').on('click', function (evt) {\n        evt.preventDefault();\n        ret.find('textarea').val('');\n      });\n    }\n    return ret;\n  }\n  return $('<textarea class=\"data_new\"></textarea>');\n}\nfunction crearCasilla(vdat, recuadro, order, readOnly) {\n  const name = `data_${vdat.type.id}_${order}`;\n  const klasses = vdat.type.klass.split(' ');\n  for (const [idx, klass] of klasses.entries()) {\n    const value = klasses.length === 1 ? vdat.value : vdat.value[idx];\n    const casilla = crearSubCasilla(vdat, value, klass, readOnly);\n    const cell = recuadro[idx];\n    cell.append(casilla);\n    if ((value !== null) && !['file', 'date'].includes(klass))\n      casilla.val(elementValue(value));\n    if (klass == 'file') {\n      const file_input = casilla.find('input');\n      new uploadFileReader(file_input, mapa, vdat?.type?.format);\n    }\n    cell.find('.data_new').attr('name', name);\n    cell.find('.form-control.data_new').attr('name', null);\n  }\n}\n\nclass uploadFileReader {\n  constructor(fileInput, mapa, format) {\n    this.input = fileInput[0];\n    this.mapa = mapa;\n    this.maxSize = format ? Number(format.slice(2, -2)) * 1024 : 10000000;\n    this.input.addEventListener('change', () => {\n      this.handleSelected();\n    });\n  }\n  handleEvent(event) {\n    this.mapa.set('notification', window.gettext(`${event.type}: ${Math.floor(event.loaded / event.total * 100)}% transferred\\n`));\n    if (event.type === \"loadend\") {\n      window.setTimeout(() => this.mapa.set('notification', ''), 1000);\n      const buttons = [\n        {\n          text: [window.gettext('Aceptar')],\n          click: function () {\n            $(this).dialog('close');\n          },\n        },\n      ]\n      showAlertDialog(window.gettext(\"Fichero cargado correctamente\"), buttons);\n      this.removeListeners(this.reader);\n    }\n  }\n\n  addListeners(reader) {\n    reader.addEventListener('progress', this.handleEvent.bind(this));\n    reader.addEventListener('loadend', this.handleEvent.bind(this));\n  }\n  removeListeners(reader) {\n    reader.removeEventListener('progress', this.handleEvent.bind(this));\n    reader.removeEventListener('loadend', this.handleEvent.bind(this));\n  }\n  handleSelected() {\n    const self = this;\n    self.reader = new FileReader();\n    $(self.input).parent().find('span').remove();\n    const selectedFile = this.input.files[0];\n    if (selectedFile) {\n      if (selectedFile.size >= self.maxSize) {\n        const buttons = [\n          {\n            text: [window.gettext('Aceptar')],\n            click: function () {\n              $(this).dialog('close');\n            },\n          },\n        ]\n        showAlertDialog(window.gettext(\"El fichero supera el tamaño máximo permitido, por favor, baje el tamaño o seleccione otro fichero\"), buttons)\n      }\n      else {\n        self.addListeners(self.reader);\n        self.reader.readAsDataURL(selectedFile);\n        $(self.input).parent().append($(`<span>${selectedFile.name}</span>`));\n      }\n    }\n  }\n}\n\nfunction showAlertDialog(msg, buttons) {\n  const div_error = $('<div id=\"error\"/>');\n  const error_element = $(`<p>${msg}</p>`);\n  div_error.append(error_element);\n  return div_error.dialog({\n    appendTo: self.ns.page.find('.map'),\n    position: {\n      my: 'center',\n      at: 'center',\n      collision: \"fit\"\n    },\n    width: \"auto\",\n    height: \"auto\",\n    minHeight: \"auto\",\n    autoOpen: true,\n    resizable: false,\n    modal: true,\n    buttons: buttons,\n    close: function () {\n      $(this).dialog('destroy');\n    }\n  })\n}\nfunction crearFilaData(tableId, old_data, new_data, element_id, poi_coords) {\n  const readOnly = tableId == \"#element-info\";\n  const old_vars = Object.groupBy(old_data, function (x) {\n    return x.type.name;\n  });\n  const calc_vars = Object.groupBy(\n    old_data.filter(x => x.dimension_values),\n    x => x.type.name);\n  const new_vars = Object.groupBy(new_data, x => x.type.name);\n  const all_vars = [...new Set(Object.keys(old_vars).concat(Object.keys(new_vars)))];\n  const map_dimensions = mapa.get('dimension_controls');\n  if (Object.keys(calc_vars).length > 0 && readOnly)\n    showCalcVars(tableId, all_vars, calc_vars, element_id, poi_coords);\n  for (const type of all_vars) {\n    //  rowspan y possibleVars difieren en los datos con dims\n    let rowspan = 1;\n    let possibleVars = 1;\n    if (type in old_vars)\n      possibleVars = rowspan = old_vars[type].length;\n    if (type in new_vars && new_vars[type].length > rowspan)\n      possibleVars = rowspan = new_vars[type].length;\n    let edTable;\n    if (old_vars && old_vars[type] && old_vars[type][0].dimension_values)\n      rowspan = 1;\n    for (let i = 0; i < possibleVars; i++) {\n      let cells;\n      const vdat_old = type in old_vars && old_vars[type][i];\n      const vdat_new = type in new_vars && new_vars[type][i];\n      const vdat = vdat_new ? vdat_new : vdat_old;\n      const existentes = $(tableId).find('.data_new_' + vdat.type.id);\n      if (!vdat.id && existentes.length && !vdat.multiple) {\n        existentes.fadeToggle(40).fadeToggle(40);\n        continue;\n      }\n      let order = null;\n      if (vdat_old?.order)\n        order = vdat_old.order;\n      else if (existentes.length == 0)\n        order = vdat.order;\n      if (vdat.type.calculation_id && !readOnly)\n        continue;\n      const dimensions = vdat.dimension_values;\n      if (dimensions && map_dimensions && map_dimensions.HORIZON) {\n        if (window.timelinectl) {\n          const currentYear = window.timelinectl.timeline.getCustomTime('current').getFullYear();\n          map_dimensions.HORIZON.value = currentYear;\n        }\n        let hasMapDimensions = true; //Se usa para filtrar los datos dimensionales que no corresponden con las dimensiones establecidas en el mapa\n        for (let [name, dat] of Object.entries(dimensions)) {\n          if (name.startsWith('HOR') || name.includes('HORIZON')) name = 'HORIZON';\n          if (!(map_dimensions[name] && (map_dimensions[name].value == dat))) {\n            hasMapDimensions = false //Si no coinciden las dimensiones\n            continue;\n          }\n        }\n        if (!hasMapDimensions) //Se filtran los datos dimensionalmente no coincidentes\n          continue;\n      }\n      const columns = vdat.type.columns.split(' ');\n      const simpleData = columns.length === 1;\n      const modelTR = $(tableId).find('.data').find('tr.model-row');\n      let tr;\n      if (simpleData || i === 0) {\n        tr = modelTR.clone();\n        tr.removeClass('model-row');\n        tr.insertBefore(modelTR);\n      } else {\n        tr = modelTR.prev();\n      }\n      const firstTD = tr.find('td').first();\n      if (simpleData && rowspan > 1)\n        if (i === 0)\n          firstTD.attr('rowspan', rowspan);\n        else\n          firstTD.addClass('hidden');\n      if (simpleData) {\n        tr.addClass('vardata simple');\n        const recuadro = tr.find('.data_new').parent();\n        tr.find('.data_new').remove();\n        cells = [recuadro];\n      } else {\n        if (i === 0) {\n          tr.addClass('vardata complex');\n          tr.find('.delete-td').remove();\n          tr.find('.datacomments_new').remove();\n          edTable = $('<table><thead></thead><tbody></tbody></table>');\n          if (tr.find('.data_new').length > 0) {\n            tr.find('.data_new').parent().attr('colspan', 2);\n            tr.find('.data_new').replaceWith(edTable);\n          } else {\n            tr.find('.data_old_').replaceWith(edTable);\n          }\n        }\n        const miscCell = modelTR.find('.delete-td').parent().clone();\n        miscCell.find('.data_new').remove();\n        const edRow = $('<tr class=\"vardata complex\"></tr>');\n        edTable.find('tbody').append(edRow);\n        cells = []\n        for (const col of columns) {\n          const cell = $(`<td class=\"${col}\"></td>`)\n          cells.push(cell);\n          edRow.append(cell);\n        }\n        edRow.append(miscCell);\n      }\n      tr.find('.caption').text(type);\n      crearCasilla(vdat, cells, order, readOnly);\n      const suffix = vdat.type.id + '_' + order;\n      if (vdat.id)\n        tr.find('input.delete').attr('name', 'delete_' + suffix);\n      else\n        tr.find('input.delete').parent().remove();\n      tr.find('.data_new').addClass('data_new_' + vdat.type.id);\n      tr.find('.datacomments_new').attr('name', 'datacomments_' + suffix);\n      tr.find('.datacomments_old').prop(\n        'title',\n        elementValue(vdat_old?.comments)\n      );\n      // Rellenamos datos actuales en sólo lectura\n      if (simpleData && vdat_old) {\n        if (vdat_old.type.klass == 'file') {\n          tr.find('span.data_old').replaceWith($(`<a target=\"_blank\" href=\"${vdat_old.value.url}\">\n          <i class=\"enlace-icono fa fa-book\" ></i>${vdat_old.value.url.split(/[\\\\/]/).pop()\n            }</a>`));\n        } else {\n          if (vdat_old.type.klass === 'str' && vdat.value?.includes('\\r\\n'))\n            tr.find('span.data_old').replaceWith(\n              (vdat.value.split('\\r\\n').join('<br />'))\n            );\n          else if (vdat_old.type.klass === 'date' && vdat.value) {\n            const format = /[Hh]/.test(vdat_old.type.format) ?\n              'DD-MM-YYYY HH:mm' : 'DD-MM-YYYY';\n            tr.find('span.data_old').replaceWith(\n              dayjs(vdat.value).format(format)\n            );\n          }\n          else if (vdat_old.type.klass == 'boolean')\n            tr.find('span.data_old').text(vdat.value ? window.gettext('Sí') : window.gettext('No'));\n          else\n            tr.find('span.data_old').text(elementValue(vdat_old.value));\n        }\n      } else if (tr.find('.data_new').length === 0 && vdat_old) {\n        tr.find('span.data_old').text(elementValue(vdat_old.value));\n      } else {\n        tr.find('td.data_old_').remove();\n        if (readOnly) {\n          // Datos en solo lectura\n          edTable.find('.data_new').removeClass('data_new');\n          edTable.find('label:has(input[type=file])').remove();\n          edTable.find('input').attr('readonly', 'readonly');\n          edTable.find('textarea').attr('readonly', 'readonly');\n        }\n      }\n\n      tr.find('span.datacomments_new').prop(\n        'title',\n        elementValue(vdat.comments)\n      );\n      tr.find('textarea.datacomments_new').val(elementValue(vdat.comments));\n      tr.find('span.datacomments_new').on('click', function (evt) {\n        $(evt.target)\n          .next()\n          .toggle();\n      });\n      tr.find('textarea.datacomments_new').change(function (evt) {\n        const title = $(evt.currentTarget).val();\n        const bocadillo = $(evt.currentTarget).prev();\n        bocadillo.prop('title', title);\n        if (title) {\n          bocadillo.removeClass('fa-commenting');\n          bocadillo.addClass('fa-commenting-o');\n        } else {\n          bocadillo.removeClass('fa-commenting-o');\n          bocadillo.addClass('fa-commenting');\n        }\n      });\n\n      tr.find('.datacomments_new:not([title])').addClass('fa fa-commenting');\n      tr.find('.datacomments_new[title=\"\"]').addClass('fa fa-commenting');\n      tr.find('.datacomments_new[title!=\"\"]').addClass('fa fa-commenting-o');\n      tr.find('.datacomments_old[title!=\"\"]').addClass('fa fa-commenting-o');\n      modelTR.before(tr);\n    }\n  }\n}\nfunction fillElementTypes(tableId, currentTypeId, element_class) {\n  const table = $(tableId);\n  const selectElem = table.find('.data_new.element_element_type_id');\n  selectElem.empty();\n  const types = element_class ? ',' : currentTypeId;\n  element_class = element_class ? element_class : ',';\n  $.ajax({\n    url: window.Urls.element_types(element_class, types),\n    success: function (types) {\n      for (const opt of types) {\n        const selected = currentTypeId == opt.pk;\n        $(`<option ${selected ? 'selected=\"selected\"' : ''}/>`)\n          .val(opt.pk)\n          .html(opt.name)\n          .appendTo(selectElem);\n      }\n    }\n  });\n}\n\nfunction fillElementInfo(tableId, element_id, is_new, element_class) {\n  const table = $(tableId);\n  let elems, v;\n  const urlFunction = is_new ? window.Urls.element_change_info : window.Urls.element_info;\n  fetch(urlFunction(element_id))\n    .then(res => res.json())\n    .then(function (json) {\n      if (is_new) json.pending_changes = json;\n      if (json.centroid && json.centroid.length) {\n        json.center_proj = transform_point(json.centroid)\n          .map(Math.floor)\n          .toString();\n        json.centroid = [\n          json.centroid[1].toFixed(6) + ',' + json.centroid[0].toFixed(6)\n        ];\n      }\n      table.find('.vardata').remove();\n      table.find('.related-row').remove();\n      table.find('.related-table').hide();\n      for (let [k, vv] of Object.entries(json)) {\n        if (k === 'related') {\n          const model_row = table.find('.related-model-row');\n          for (const related of vv) {\n            table.find('.related-table').show();\n            const new_row = model_row.clone();\n            new_row.appendTo(model_row.parent())\n            new_row.find('td.name').text(related.other__name)\n            new_row.removeClass('related-model-row');\n            new_row.addClass('related-row');\n            new_row.find('td.type')\n              .attr('title', related.other__element_type__name)\n              .attr('data-uid', 'et' + related.other__element_type_id)\n            new_row.attr('element_id', related.other__id)\n            new_row.attr('geom', JSON.stringify(related.geomx))\n          }\n        } else {\n          const elems = table.find('.data_old.element_' + k);\n          if (k == 'updated') {\n            json[k] = vv = dayjs(vv).format('DD-MM-YYYY');\n          }\n          elems.text(elementValue(vv));\n        }\n      }\n      const old_data = json.data;\n      let new_data = [];\n      if (json.pending_changes) {\n        new_data = json.pending_changes.data;\n        delete json.pending_changes.data;\n        for (const k in json.pending_changes) {\n          v = json.pending_changes[k];\n          elems = table.find('.data_new.element_' + k);\n          if (k == 'updated') {\n            json.pending_changes[k] = v; // = dayjs(v).format('DD-MM-YYYY');\n            if (json.pending_changes.parameter_change == 'DELETE_ELEMENT') {\n              elems = table.find('.data_old.element_updated.delete_change');\n              elems.text(elementValue(v));\n              continue;\n            }\n          }\n          elems.val(v);\n        }\n        fillElementTypes(tableId, json.pending_changes.element_type.pk, element_class);\n      } else {\n        // copiamos datos elemento existentes\n        for (const k in json) {\n          if (k !== 'element_type') {\n            v = elementValue(json[k]);\n            elems = table.find('.data_new.element_' + k);\n            elems.val(v);\n          }\n        }\n        fillElementTypes(tableId, json.element_type.pk, element_class);\n      }\n      const geom = table.find('.data_new.element_geometry').val();\n      if (tableId == '#element-info') {\n        const old_geom_data = table.find('.data_old.element_geometry');\n        old_geom_data.parent().addClass('hidden');\n        const wkt = old_geom_data.text();\n        if (wkt) {\n          const old_geom = new WKT().readGeometry(wkt, {\n            dataProjection: 'EPSG:4326',\n          });\n          if (old_geom instanceof Polygon || old_geom instanceof MultiPolygon) {\n            const formatArea = function (polygon) {\n              const area = getArea(polygon, { projection: 'EPSG:4326' });\n              if (area > 10000) {\n                old_geom_data.parent().find('td[name=\"title\"]').text(`${window.gettext('Superficie')} (km² - ha)`)\n                return `${numeric_lang_format((area / 1000000).toFixed(2))} - ${numeric_lang_format((area / 10000).toFixed(2))}`;\n              }\n              else {\n                old_geom_data.parent().find('td[name=\"title\"]').text(`${window.gettext('Superficie')} (m²)`)\n                return numeric_lang_format(area.toFixed(2));\n              }\n            };\n            const area_data = formatArea(old_geom);\n            old_geom_data.text(area_data);\n            old_geom_data.parent().removeClass('hidden');\n          }\n        }\n      }\n      crearFilaData(tableId, old_data, new_data, element_id, json.centroid ? json.centroid[0] : null);\n      if ($(tableId).find('.data_new').length > 1) {\n        if (geom && geom != 'POINT EMPTY') {\n          const feat = new WKT().readFeature(geom, {\n            dataProjection: 'EPSG:4326',\n            featureProjection: window.epsg\n          });\n          mapa.set('edit_feature', feat);\n        }\n        // Montamos lista de opciones para crear datos nuevos\n        const available_data = json.element_type.data;\n        $(tableId).find('.add-data').remove();\n        const data_menu = $('<ul class=\"add-data\"></ul>');\n        for (const [i, dat] of Object.entries(available_data)) {\n          if (dat.type.calculation_id)\n            continue;\n          if (!dat.multiple && old_data.some(elem => elem.type.id == dat.type.id))\n            continue;\n          data_menu.append($(\n            `<li idx_available_data=\"${i}\">${window.gettext('Añadir')} ${dat.type.name}</li>`\n          ));\n        }\n        const buttons = $(tableId).dialog('option', 'buttons');\n        const button = createAddDataButton(tableId, data_menu, available_data);\n        if (buttons[0].class == 'fa fa-female') {\n          buttons.splice(1, 0, button);\n        }\n        else {\n          buttons.unshift(button);\n        }\n        $(tableId).dialog('option', 'buttons', buttons);\n      }\n      $(tableId).dialog('open');\n    });\n}\n\nfunction showUserInfo(mapa, tableId, username) {\n  const table = $(tableId);\n  $.getJSON(window.Urls.user_info(username), function (json) {\n    for (const k in json) {\n      const v = elementValue(json[k]);\n      const elems = table.find('.' + k);\n      elems.text(v);\n    }\n  });\n  $(tableId).dialog({ appendTo: mapa.getTargetElement() });\n}\n\nfunction actOnElement(evt) {\n  const mapTarget = mapa.getTargetElement && mapa.getTargetElement();\n  if (mapTarget)\n    $(mapTarget).find('.dialog').dialog('close');\n  const appendTo = evt.appendTo ? evt.appendTo : mapTarget;\n  const op = evt.data;\n  const tr = $(this).closest('tr');\n  const element_id = this.id ? this.id.split('_')[1] : tr[0].attributes.element_id.value;\n\n  const element_class = 'element_class' in tr[0].attributes ? tr[0].attributes.element_class.value : null;\n  const lastElementPixel = mapa ? mapa.get('lastElementPixel') : null;\n  const width_edit = window.innerWidth;\n  const new_pos = evt.new_pos ? evt.new_pos :\n    {\n      my: 'right top',\n      at: 'right-10% top+5',\n      of: appendTo,\n      collision: 'none'\n    };\n  const width = 'auto';\n  const height = 'auto';\n  let minWidth_edit = 212;\n  if (op === 'url') {\n    const url = new URL(window.location);\n    url.searchParams.set('element_id', element_id);\n    navigator.clipboard.writeText(url.href);\n    mapa.set('notification', window.gettext('Enlace copiado al portapapeles'));\n    window.setTimeout(() => mapa.set('notification', ''), 1000);\n  } else if (op === 'info') {\n    const tableId = '#element-info';\n    mapa.set('lastInfoElem', this);\n    $(tableId)\n      .show()\n      .dialog({\n        appendTo: appendTo,\n        title: window.gettext('Información'),\n        width: width,\n        height: height,\n        maxHeight: window.innerHeight * 4 / 6,\n        maxWidth: window.innerWidth * 5 / 6,\n        buttons: [{\n          html: '<i class=\"fas fa-print\"></i>',\n          title: window.gettext('Imprimir información'),\n          click: () => window.open(window.Urls.print_element_info(element_id)),\n        }],\n        position: (lastElementPixel) ?\n          {\n            my: 'left top',\n            at: 'left+' + (lastElementPixel[0] + 50) + ' top+' + lastElementPixel[1],\n            of: appendTo,\n            collision: 'fit'\n          } :\n          new_pos,\n        autoOpen: false,\n        resizable: true,\n        open: function () {\n          $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'));\n          if (lastElementPixel)\n            $(this).parent().css('margin-top', '-25pt');\n          $(this).parent().css('margin-left', '-30pt');\n        },\n        close: function () {\n          $(this).parent().css('margin-left', 'unset');\n          $(this).parent().css('margin-top', 'unset');\n        }\n      });\n    fillElementInfo(tableId, element_id, false, element_class);\n  } else if (op === 'delete' || op === 'commit-delete') {\n    minWidth_edit -= 90;\n    const tableId = '#delete-dialog';\n    const table = $(tableId);\n    const buttons = [\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          $(this).dialog('close');\n        }\n      }\n    ];\n    minWidth_edit += 73;\n    buttons.unshift({\n      text: window.gettext('Eliminar'),\n      click: function () {\n        const dialog = this;\n        $.ajax({\n          url: window.Urls.element_delete(element_id),\n          type: 'POST',\n          success: function (json) {\n            $(dialog).dialog('close');\n            if (json.operation === 'DELETE') {\n              $('#delete-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              $('tr[element_id=\"' + element_id + '\"]').addClass(\n                'pending_delete'\n              );\n            } else if (json.operation === 'COMMIT-DELETE') {\n              mapa.set('update_changes', true);\n              mapa.set('update_elements', true);\n            }\n          }\n        });\n      }\n    });\n    if (op === 'commit-delete') {\n      minWidth_edit += 114;\n      buttons.unshift({\n        text: window.gettext('Confirmar'),\n        click: function () {\n          const dialog = this;\n          $.ajax({\n            url: window.Urls.element_commit_delete(element_id),\n            type: 'POST',\n            class: 'commit-edit',\n            success: function () {\n              $(dialog).dialog('close');\n              $('#commit-edit-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              mapa.set('update_elements', true);\n              $('tr[element_id=\"' + element_id + '\"]').remove();\n            }\n          });\n        }\n      });\n      buttons.unshift({\n        text: '',\n        class: 'fa fa-female',\n        click: function () {\n          showUserInfo(mapa, '#user-info', table.find('.element_user').val());\n        }\n      });\n    }\n    table.dialog({\n      appendTo: appendTo,\n      title: op === 'delete' ? window.gettext('Eliminar') : window.gettext('Confirmar eliminación'),\n      width: width,\n      height: height,\n      position: new_pos,\n      zIndex: 10000,\n      resizable: true,\n      autoOpen: false,\n      buttons: buttons,\n\n      maxHeight: window.innerHeight * 6 / 7,\n      maxWidth: minWidth_edit >= width_edit ? minWidth_edit : width_edit,\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n      },\n      close: function () {\n        mapa.set('edit_feature', null);\n        $(this).hide();\n      },\n    });\n    fillElementInfo(tableId, element_id, false, element_class);\n  } else if (op === 'edit' || op === 'commit-edit') {\n    const tableId = '#edit-dialog';\n    const table = $(tableId);\n\n    const buttons = [\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          $(this).dialog('close');\n        }\n      }\n    ];\n    if (op === 'commit-edit') {\n      minWidth_edit += 114;\n      buttons.unshift({\n        text: window.gettext('Confirmar'),\n        click: function () {\n          const dialog = this;\n          const wkt = new WKT();\n          const feat = mapa.get('edit_feature');\n          const geom = feat ? wkt.writeFeature(feat, {\n            dataProjection: 'EPSG:4326',\n            featureProjection: window.epsg\n          }) : '';\n          table.find('form .element_geometry.data_new').val(geom);\n          $.ajax({\n            url: window.Urls.element_commit_edit(element_id),\n            data: new FormData(table.find('form')[0]),\n            type: 'POST',\n            classes: 'commit-edit',\n            success: function () {\n              $(dialog).dialog('close');\n              $('#commit-edit-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              mapa.set('update_elements', true);\n              $('tr[element_id=\"' + element_id + '\"]').removeClass(\n                'pending_edit'\n              );\n              $('tr[element_id=\"' + element_id + '\"]').removeClass(\n                'pending_delete'\n              );\n            }\n          });\n        }\n      });\n    }\n    minWidth_edit += 78;\n    buttons.unshift({\n      text: window.gettext('Modificar'),\n      click: function () {\n        const dialog = this;\n        const wkt = new WKT();\n        const feat = mapa.get('edit_feature');\n        const geom = feat ? wkt.writeFeature(feat, {\n          dataProjection: 'EPSG:4326',\n          featureProjection: window.epsg\n        }) : '';\n        fixDates(table);\n        table.find('form .element_geometry.data_new').val(geom);\n        const data = new FormData(table.find('form')[0]);\n        for (const ipt of table.find('form input.data_new[type=\"checkbox\"]'))\n          data.set($(ipt).prop('name'), $(ipt).prop('checked') ? 'True' : 'False')\n        $.ajax({\n          url: window.Urls.element_edit(element_id),\n          type: 'POST',\n          data: data,\n          contentType: false,\n          processData: false,\n          success: function (json) {\n            $(dialog).dialog('close');\n            if (json.operation == 'EDIT') {\n              $('#edit-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              $('tr[element_id=\"' + element_id + '\"]').addClass('pending_edit');\n            } else {\n              mapa.set('update_changes', true);\n              mapa.set('update_elements', true);\n            }\n          }\n        });\n      }\n    });\n    if (op === 'commit-edit') {\n      buttons.unshift({\n        text: '',\n        class: 'fa fa-female',\n        click: function () {\n          showUserInfo(mapa, '#user-info', table.find('.element_user').val());\n        }\n      });\n    }\n    $(tableId).dialog({\n      width: width,\n      height: height,\n      appendTo: appendTo,\n      position: new_pos,\n      title: op === 'commit-edit' ? window.gettext('Confirmar modificación') : window.gettext('Modificar'),\n      zIndex: 10000,\n      resizable: true,\n      autoOpen: false,\n      maxHeight: window.innerHeight * 0.7,\n      maxWidth: window.innerWidth * 5 / 6,\n      buttons: buttons,\n      close: function () {\n        mapa.unset('edit_feature', null)\n        mapa.set('edit_feature', null);\n        $(this).hide();\n      },\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n        const ww = $(this).outerWidth();\n        $('#' + this.id + ' td.data_old').css('max-width', (ww) / 2);\n        $('#' + this.id + ' td.data_old_').css('max-width', (ww) / 2);\n        $(this).find('.doble').css('height', 'auto');\n        $(this).parent().css('max-width', (minWidth_edit >= width_edit) ? minWidth_edit : width_edit);\n        $(this).css('max-width', (minWidth_edit >= width_edit) ? minWidth_edit : width_edit);\n        const doble_height = $(this).find('td.element_comments.data_old').height();\n        $(this).find('.doble').height(doble_height);\n        //$(this).find('.vardata .data_new').css('width', 'calc(100% - 45px)');\n      },\n      resize: function () {\n        $(this).css('width', 'auto');\n        const diff = String($(this).width() - $(this).find('table').width() - 2) + 'px';\n        if (diff > 0) {\n          $(this).find('.data_new').css('width', 'calc(100% + ' + diff + ')');\n          //$(this).find('.vardata .data_new').css('width', 'calc(100% - 45px + ' + diff + ')');\n          //$(this).find('input.vardata').css('width', 'calc(100% - 45px + ' + diff + ')');\n        }\n      },\n    });\n    fillElementInfo(tableId, element_id, false, element_class);\n  } else if (op === 'commit-create' || op === 'edit-new') {\n    const tableId = '#create-dialog';\n    const table = $(tableId);\n    const buttons = [\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          $(this).dialog('close');\n        }\n      }\n    ];\n    if (op === 'commit-create') {\n      minWidth_edit += 81;\n      buttons.unshift({\n        text: window.gettext('Confirmar'),\n        click: function () {\n          const dialog = this;\n          const wkt = new WKT();\n          const feat = mapa.get('edit_feature');\n          const geom = feat ? wkt.writeFeature(feat, {\n            dataProjection: 'EPSG:4326',\n            featureProjection: window.epsg\n          }) : '';\n          table.find('form .element_geometry.data_new').val(geom);\n          table.find('input.element_updated').val(dayjs().format('YYYY-MM-DD'));\n\n          $.ajax({\n            url: window.Urls.element_commit_create(element_id),\n            data: new FormData(table.find('form')[0]),\n            type: 'POST',\n            success: function () {\n              $(dialog).dialog('close');\n              $('#commit-edit-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              mapa.set('update_elements', true);\n              $('.cambios tr[element_id=\"' + element_id + '\"]').remove();\n            }\n          });\n        }\n      });\n    }\n    if (op === 'edit-new') {\n      minWidth_edit += 78;\n      buttons.unshift({\n        text: window.gettext('Modificar'),\n        click: function () {\n          const dialog = this;\n          const wkt = new WKT();\n          const feat = mapa.get('edit_feature');\n          const geom = feat ? wkt.writeFeature(feat, {\n            dataProjection: 'EPSG:4326',\n            featureProjection: window.epsg\n          }) : '';\n          table.find('form .element_geometry.data_new').val(geom);\n          table.find('input.element_updated').val(dayjs().format('YYYY-MM-DD'));\n\n          $.ajax({\n            url: window.Urls.element_edit_new(element_id),\n            type: 'POST',\n            data: new FormData(table.find('form')[0]),\n            success: function () {\n              $(dialog).dialog('close');\n              $(dialog).dialog('destroy');\n\n              $('#edit-ok').dialog({\n                appendTo: appendTo,\n                position: new_pos\n              });\n              mapa.set('update_changes', true);\n              $('tr[element_id=\"' + element_id + '\"]').addClass('pending_edit');\n            }\n          });\n        }\n      });\n    }\n    buttons.unshift({\n      text: '',\n      class: 'fa fa-female',\n      click: function () {\n        showUserInfo(mapa, '#user-info', table.find('.element_user').val());\n      }\n    });\n\n    table.dialog({\n      appendTo: appendTo,\n      width: width,\n      height: height,\n      position: new_pos,\n      title: op === 'edit-new' ? window.gettext('Modificar') : window.gettext('Confirmar creación'),\n      zIndex: 10000,\n      resizable: true,\n      autoOpen: false,\n      //maxHeight: window.innerHeight*2/3,\n      //maxWidth: window.innerWidth*2/5,\n      buttons: buttons,\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n        $(this).parent().css('max-width', (minWidth_edit >= width_edit) ? minWidth_edit : width_edit);\n        $(this).css('max-width', (minWidth_edit >= width_edit) ? minWidth_edit : width_edit);\n      },\n      close: function () {\n        mapa.set('edit_feature', null);\n        $(this).hide();\n      },\n    });\n    fillElementInfo(tableId, element_id, true, element_class);\n  } else if (op === 'change-remove') {\n    minWidth_edit -= 90;\n    const tableId = '#change-remove-dialog';\n    const table = $(tableId);\n    const buttons = [\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          $(this).dialog('close');\n        }\n      }\n    ];\n    minWidth_edit += 79;\n    buttons.unshift({\n      text: window.gettext('Aceptar'),\n      click: function () {\n        const dialog = this;\n        const is_pending_create = $('tr[element_id=\"' + element_id + '\"]').hasClass('pending_create')\n        $.ajax({\n          url: (is_pending_create) ? window.Urls.element_cancel_create(element_id) : window.Urls.element_cancel_edit(element_id),\n          type: 'POST',\n          classes: 'cancel-edit',\n          success: function () {\n            $(dialog).dialog('close');\n            $('#cancel-edit-ok').dialog({\n              appendTo: appendTo,\n              position: new_pos\n            });\n            mapa.set('update_changes', true);\n            $('.cambios tr[element_id=\"' + element_id + '\"]').remove();\n          }\n        });\n      }\n    });\n\n    table.dialog({\n      appendTo: appendTo,\n      title: window.gettext('Descartar cambio pendiente'),\n      width: width,\n      height: height,\n      position: new_pos,\n      zIndex: 10000,\n      buttons: buttons,\n      maxHeight: window.innerHeight * 6 / 7,\n      maxWidth: minWidth_edit >= width_edit ? minWidth_edit : width_edit,\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n      },\n      close: function () {\n        $(this).hide();\n      },\n    });\n  } else {\n    console.debug('Modificar - ' + op + ' ' + element_id);\n  }\n  return false;\n}\n\nfunction fixDates(table) {\n  table.find('form .vardata .form-control.input').each(function () {\n    const elem = $(this)\n    const pickr = elem.parent().find('input.flatpickr-input');\n    const datetime = dayjs(elem.val(), pickr.attr('placeholder'));\n    pickr.val(datetime.isValid() ? datetime.toISOString() : '');\n  });\n}\n\n\nfunction createAddDataButton(tableId, data_menu, available_data) {\n  const table = $(tableId);\n  return {\n    text: window.gettext('Añadir dato'),\n    disabled: data_menu.find('li').length == 0,\n    class: 'add-data',\n    click: function () {\n      $(this).append(data_menu);\n      data_menu.menu({\n        select: function (event, ui) {\n          const idx = ui.item[0].attributes.idx_available_data.value;\n          const dat = available_data[idx];\n          crearFilaData(tableId, [], [dat]);\n          if (!dat.multiple)\n            this.removeChild(ui.item[0]);\n          if (!$(this).find('li').length) {\n            table.parent().find('button.add-data').addClass('ui-button-disabled ui-state-disabled');\n          }\n        }\n      });\n    }\n  }\n}\n\nfunction showCalcVars(tableId, all_vars, calc_vars, element_id, poi_coords) {\n  const map_dimensions = mapa.get('dimension_controls');\n  const button = [{\n    html: '<i class=\"fas fa-table\"></i>',\n    class: 'info-dataTable',\n    click: function () {\n      $('#info-dataTable').dialog('destroy')\n      const model_table = $('#calculationData_table');\n      const total_table = $('<div id=\"info-dataTable\" class=\"static\"></div>');\n      total_table.append(`<h4>${$(tableId).find('td.element_element_type').text() + ' - ' + $(tableId).find('td.element_name').text()}</h4>`);\n      const table_one = $('<div ></div>');\n      const table_two = $('<div ></div>');\n      const table_n = $('<div ></div>');\n      const tabs = $('#tabs-Table').clone();\n      tabs.removeClass('hidden');\n      const horizon_opt = map_dimensions['HORIZON'].options;\n      all_vars.map((type) => {\n        if (calc_vars[type]) {\n          let table = model_table.clone();\n          table.removeClass('hidden');\n          const data = calc_vars[type];\n          const data_dim = Object.keys(data[0].dimension_values);\n          horizon_opt.forEach(opt => {\n            table.find('tbody').append(`<tr><td name=\"opt_h\">${opt}</td></tr>`)\n          })\n          const horizon_name = get_horizon(data_dim);\n          data_dim.splice(data_dim.indexOf(horizon_name), 1)\n          if (data_dim.length < 2) {\n            let dim = horizon_name;\n            const div_table = $(`<div id=\"tab\"></div>`);\n            div_table.append(`<h4>${type}</h4>`);\n            if (data_dim.length) {\n              dim = data_dim.pop();\n              table.find('tr[name =\"title_h1\"]').append(`<td width=\"100%\" colspan=\"${map_dimensions[dim].options.length}\">${map_dimensions[dim].name}</td>`)\n              map_dimensions[dim].options.map(dim_opt => {\n                const ordered_values = groupBy(data, function (x) {\n                  if (x.dimension_values[dim] == dim_opt[0])\n                    return x.dimension_values[horizon_name];\n                });\n                if (!(ordered_values[\"undefined\"] && ordered_values[\"undefined\"].length == data.length)) {\n                  table.find('tr[name =\"title_h2\"]').append(`<td>${dim_opt[1]}</td>`)\n                  table.find('tr td[name=\"opt_h\"]').map((i, td) => {\n                    const opt = ordered_values[td.innerText];\n                    if (opt)\n                      $(td.parentElement).append(`<td class=\"info-data\">${new Intl.NumberFormat($(window.document).find('html').attr('lang')\n                        , {\n                          maximumFractionDigits: 20\n                        }).format(opt[0].value)}</td>`)\n                    else\n                      $(td.parentElement).append(`<td class=\"info-data\"> - </td>`)\n                  });\n                }\n              })\n              if (table.find('tr[name =\"title_h2\"] td').length > 1) {\n                div_table.append(table);\n                table_two.append(div_table);\n              }\n            }\n            else {\n              table.find('tr[name =\"title_h2\"]').append(`<td>Valor</td>`)\n              table.find('tr td[name=\"opt_h\"]').map((i, td) => {\n                const ordered_values = groupBy(data, function (x) {\n                  return x.dimension_values[dim];\n                });\n                if (!(ordered_values[\"undefined\"] && ordered_values[\"undefined\"].length == data.length)) {\n                  const opt = ordered_values[td.innerText];\n                  if (opt)\n                    $(td.parentElement).append(`<td class=\"info-data\">${new Intl.NumberFormat($(window.document).find('html').attr('lang')\n                      , {\n                        maximumFractionDigits: 20\n                      }).format(opt[0].value)}</td>`)\n                  else\n                    $(td.parentElement).append(`<td class=\"info-data\"> - </td>`)\n                }\n              });\n              if (table.find('tr[name =\"title_h2\"] td').length > 1) {\n                div_table.append(table);\n                table_one.append(div_table);\n              }\n            }\n          }\n          else {\n            data_dim.map((dim, idx) => {\n              if (tabs.find('li').length < data_dim.length) {\n                tabs.find('ul').append(`<li><a href=\"#tabs_Table-${map_dimensions[dim].id}\"></a>${map_dimensions[dim].name}</li>`);\n                const div_tab = $(`<div id=\"tabs_Table-${map_dimensions[dim].id}\"></div>`);\n                tabs.append(div_tab);\n              }\n              const this_tab = tabs.find(`#tabs_Table-${map_dimensions[dim].id}`);\n              this_tab.append(`<h4>${type}</h4>`);\n              const other_dim = data_dim.slice();\n              other_dim.splice(idx, 1);\n              map_dimensions[dim].options.map(dim_opt => {\n                const tab = table.clone();\n                tab.find('tr[name =\"title_h1\"]').append(`<td width=\"100%\" colspan=\"${map_dimensions[other_dim[0]].options.length}\">${map_dimensions[other_dim[0]].name}</td>`)\n                map_dimensions[other_dim[0]].options.map(dim_opt2 => {\n                  const ordered_values = groupBy(data, function (x) {\n                    if ((x.dimension_values[dim] == dim_opt[0]) && (x.dimension_values[other_dim[0]] == dim_opt2[0]))\n                      return x.dimension_values[horizon_name];\n                  });\n                  if (!(ordered_values[\"undefined\"] && ordered_values[\"undefined\"].length == data.length)) {\n                    tab.find('tr[name =\"title_h2\"]').append(`<td>${dim_opt2[1]}</td>`)\n                    tab.find('tr td[name=\"opt_h\"]').map((i, td) => {\n                      const opt = ordered_values[td.innerText];\n                      if (opt)\n                        $(td.parentElement).append(`<td class=\"info-data\">${new Intl.NumberFormat($(window.document).find('html').attr('lang')\n                          , {\n                            maximumFractionDigits: 20\n                          }).format(opt[0].value)}</td>`)\n                      else\n                        $(td.parentElement).append(`<td class=\"info-data\"> - </td>`)\n                    });\n                  }\n                })\n                if (tab.find('tr[name =\"title_h2\"] td').length > 1) {\n                  this_tab.append(`<span>${map_dimensions[dim].name}: ${dim_opt[0]}</span>`);\n                  this_tab.append(tab);\n                }\n              })\n            })\n          }\n        }\n      })\n      table_n.append(tabs);\n      total_table.append(table_one);\n      total_table.append(table_two);\n      total_table.append(table_n);\n      tabs.tabs();\n      const buttons = [\n        {\n          html: '<i class=\"fas fa-print\"></i>',\n          click: function () {\n            window.open(\n              window.Urls.dimensionalTables2Pdf(element_id)\n            );\n          }\n        }\n      ]\n      total_table.dialog(\n        {\n          appendTo: this.ns.mapa.getTargetElement(),\n          title: window.gettext('Información dimensional'),\n          zIndex: 100000,\n          width: 'auto',\n          buttons: buttons,\n          open: function () {\n            $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n            $(this).scrollTop(0);\n            const hmax = $(this).height();\n            $(this).removeClass('static');\n            $(this).css('height', 'auto');\n            const hauto = $(this).height();\n            (hauto < hmax) ? null : $(this).css('height', String(hmax) + 'px');\n          },\n          close: function () {\n            $(this).dialog('destroy');\n          },\n        }\n      );\n    }\n  },\n  {\n    html: '<i class=\"fas fa-chart-area\"></i>',\n    class: 'info-dataGraph',\n    click: () => create_graph_control(mapa, { centroid: poi_coords.split(',').map(parseFloat), same_srid: false }, [element_id]),\n  }\n  ];\n  $(tableId).dialog('option', 'buttons', button);\n}\nexport {\n  actOnElement, crearFilaData, initializeMapa, configureCalendar,\n  fixDates, createAddDataButton\n};\n","/*eslint no-implicit-globals: \"error\"*/\nimport 'ol/ol.css';\nimport {\n  $, flatpickr, dayjs, getParameterByName, multiselectOptions,\n  transform_point, getFormCoords, proj4, updateUnselectedHorizons,\n  LAYERTYPES\n} from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport { setVisibleLayers_url, showLegend } from './simmerlayer.mjs';\n\nimport * as SunCalc from 'suncalc';\nimport 'ol-ext/control/Bar.css';\nimport ol_control_Bar from 'ol-ext/control/Bar';\nimport 'ol-ext/control/Scale.css';\nimport ol_control_Scale from 'ol-ext/control/Scale';\nimport 'ol-ext/control/LayerPopup.css';\nimport ol_control_LayerPopup from 'ol-ext/control/LayerPopup';\nimport 'ol-ext/control/Notification.css';\nimport ol_control_Notification from 'ol-ext/control/Notification';\nimport 'ol-ext/control/Overlay.css';\nimport '../css/ol_ext_overlay_menu.css';\nimport ol_control_Overlay from 'ol-ext/control/Overlay';\nimport Geolocation from 'ol/Geolocation';\nimport 'ol-ext/control/LayerSwitcher.css';\nimport 'ol-ext/control/LayerSwitcherImage.css';\nimport '../../../../moderna_meteogrid/statix/css/mapas.css';\nimport '../../../../moderna_meteogrid/statix/css/checkbox.css';\n\nimport ol_control_Toggle from 'ol-ext/control/Toggle';\nimport searchNominatim from 'ol-ext/control/SearchNominatim'\nimport ol_control_SearchES from './ol_control_searchES'\nimport Style from 'ol/style/Style';\nimport Fill from 'ol/style/Fill';\nimport Circle from 'ol/style/Circle';\nimport Stroke from 'ol/style/Stroke';\nimport Modify from 'ol/interaction/Modify';\nimport Draw, { createBox } from 'ol/interaction/Draw';\nimport Transform from 'ol-ext/interaction/Transform';\nimport { transformExtent } from 'ol/proj';\n\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer';\nimport { OSM, Vector as VectorSource } from 'ol/source';\nimport { createStringXY, toStringHDMS } from 'ol/coordinate';\nimport { Control } from 'ol/control';\nimport Collection from 'ol/Collection';\nimport MousePosition from 'ol/control/MousePosition';\nimport OverviewMap from 'ol/control/OverviewMap';\nimport ScaleLine from 'ol/control/ScaleLine';\nimport Zoom from 'ol/control/Zoom';\nimport ZoomToExtent from 'ol/control/ZoomToExtent';\nimport FullScreen from 'ol/control/FullScreen';\nimport Rotate from 'ol/control/Rotate';\nimport Button from 'ol-ext/control/Button';\nimport { containsCoordinate, getIntersection } from 'ol/extent';\nimport WKT from 'ol/format/WKT';\nimport { unByKey } from 'ol/Observable';\nimport { getArea, getLength } from 'ol/sphere';\nimport Overlay from 'ol/Overlay';\nimport { LineString, Polygon, Point, MultiPolygon, MultiLineString } from 'ol/geom';\nimport { fromExtent } from 'ol/geom/Polygon';\nimport KML from 'ol/format/KML';\nimport JSZip from 'jszip';\nimport Feature from 'ol/Feature';\nimport Icon from 'ol/style/Icon';\nimport { boundingExtent } from 'ol/extent';\nimport { register } from 'ol/proj/proj4';\nimport { defaults as defaultInteractions } from 'ol/interaction';\nimport { NewLaunchControl, ActControl, fillElementInfo, createProp_dialog } from './simulaciones.mjs';\nimport { BingLayer, XYZLayer, WMSLayer, WMSFlowLayer, WMTSLayer, OSMLayer, repositionTooltips, sigym2 } from './simmerlayer.mjs';\nimport { SaverElementsLayer } from '../../../../saver/statix/js/saver_layers.mjs';\nimport { GraphControl, crearControlesDimensiones } from './GraphControl.mjs';\nimport { TimelineControl, setCurrentValue, getFormatString, roundNextXMin } from './timeline.mjs'\nimport ContextMenu from 'ol-contextmenu'\nimport 'ol-contextmenu/ol-contextmenu.css'\nimport Measurer from './measurer.js'\nimport OLCesium from 'olcs'\n\nwindow.CESIUM_BASE_URL = '/CESIUM_BASE_URL/';\nimport { Cartesian3, createOsmBuildingsAsync, Ion, Math as CesiumMath, Terrain, Viewer } from 'cesium';\nimport \"cesium/Build/Cesium/Widgets/widgets.css\";\nimport * as Cesium from 'cesium'\nimport cartesian from 'cartesian';\nimport Cookies from 'js-cookie';\n\nwindow.Cesium = Cesium;\nIon.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmYTc5NmUyOS0wZDM2LTQ2MzctYWMwNi01NmU3ZmRmNzEyNDYiLCJpZCI6MzEwODQ4LCJpYXQiOjE3NDk1NDYyNTZ9.gt1r2S3TxKIH3QUWL6TO0mDfa672i58DsrwI1IR1zSo';\n\nproj4.defs(\"EPSG:4083\", \"+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\nproj4.defs(\"EPSG:25828\", \"+proj=utm +zone=28 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs\");\nproj4.defs(\"EPSG:25829\", \"+proj=utm +zone=29 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs\");\nproj4.defs(\"EPSG:25830\", \"+proj=utm +zone=30 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs\");\nproj4.defs(\"EPSG:25831\", \"+proj=utm +zone=31 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs\");\nproj4.defs(\"EPSG:32628\", \"+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:32613\", \"+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:32614\", \"+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:32616\", \"+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:32617\", \"+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:3035\", \"+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs\");\nproj4.defs(\"EPSG:32715\", \"+proj=utm +zone=15 +south +datum=WGS84 +units=m +no_defs\");\nproj4.defs(\"EPSG:25833\", \"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\nproj4.defs(\"EPSG:25836\", \"+proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\nproj4.defs(\"EPSG:23030\", \"+proj=utm +zone=30 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs +type=crs\");\n\nregister(proj4);\nfunction handleMouseMove(map, event) {\n  const pixel = map.getEventPixel(event);\n  const coordinate = map.getCoordinateFromPixelInternal(pixel);\n  if (!coordinate)\n    return;\n  const srcproj = map.getView().getProjection().getCode();\n  const [lon, lat] = proj4(srcproj, 'EPSG:4326', coordinate);\n  const times = SunCalc.getTimes(window.timelinectl.timeline.getCustomTime('current'), lat, lon);\n  if (times.sunrise == null)\n    return\n  const sunriseHour = times.sunrise.getHours()\n  const sunsetHour = times.sunset.getHours();\n  for (let i = 0; i < 24; i++)\n    if (sunsetHour > sunriseHour)\n      if (i <= sunriseHour || i > sunsetHour)\n        $(`.vis-minor.vis-h${i}`).css('background', '#00000015');\n      else\n        $(`.vis-minor.vis-h${i}`).css('background', 'inherit');\n    else\n      if (i < sunsetHour || i > sunriseHour)\n        $(`.vis-minor.vis-h${i}`).css('background', 'inherit');\n      else\n        $(`.vis-minor.vis-h${i}`).css('background', '#00000015');\n\n}\n\nconst MAP_ACTIONS = {\n  GET_METEOCIEL_SOUNDING: function (evt) {\n    const coords = evt.coordinate;\n    let now = dayjs(window.timelinectl.timeline.getCurrentTime());\n    now = now.utc();\n    now = now.add(-6, 'hours');\n    now = now.startOf('day')\n    now = now.add(6, 'hours');\n    const selectedTime = dayjs(window.timelinectl.timeline.getCustomTime('current'));\n    selectedTime.utc();\n    const horizon = dayjs.duration(selectedTime.diff(now)).asHours();\n    const [lon, lat] = proj4(window.epsg, 'EPSG:4326', coords);\n    const url = `https://www.meteociel.fr/modeles/sondage2.php?mode=0&lon=${lon}&lat=${lat}&ech=${horizon}&map=10`\n    window.open(url, '_blank');\n  },\n  GET_VER_VAL_REPORT: async function (evt, map) {\n    const layers = map.get('layerObjects');\n    const REPORTS = window.namespaces[0].GET_VER_VAL_REPORT_LIST;\n    let availableReports = [];\n    let obs;\n    for (const obsType of Object.keys(REPORTS)) {\n      const obsLayer = layers.filter(lyr => lyr._pageLayer.extra?.GET_VER_VAL_REPORT == obsType)[0];\n      const url = obsLayer._ol_layer?.getSource().getFeatureInfoUrl(\n        evt.coordinate,\n        map.getView().getResolution(), map.getView().getProjection(), {\n        INFO_FORMAT: 'application/vnd.meteogrid.emmet+json',\n        TOLERANCE: 7,\n      });\n      const response = await fetch(url);\n      const json = await response.json();\n      if (json.features.length) {\n        obs = json.features[0].properties;\n        availableReports = availableReports.concat(REPORTS[obsType]);\n      }\n    }\n    availableReports.sort(opt => opt[2]);\n    if (!obs) {\n      $('#report-list-empty').removeClass('hidden').dialog();\n      return;\n    }\n    const reportList = $('#report-list');\n    reportList.removeClass('hidden');\n    reportList.find('tr').not('.model').remove();\n    const modelRow = reportList.find('tr.model.report');\n    for (const opt of availableReports.toSorted((a, b) => a[2].localeCompare(b[2]))) {\n      const newRow = modelRow.clone();\n      newRow.removeClass('model');\n      const td = newRow.find('td.report-name');\n      const boton = newRow.find('td .boton');\n      boton.on('click', () => window.open(`${window.Urls.ad_hoc_report()}?report=${opt[0]}&pois=${obs.id}`));\n      td.data('report-id', opt[0]);\n      td.text(opt[2]);\n      modelRow.parent().append(newRow);\n    }\n    reportList.dialog({\n      appendTo: map.getTargetElement(),\n      title: window.gettext(obs.name),\n      width: 'auto',\n      height: 'auto',\n      open: () => {\n        reportList.parent().css('width', 'auto');\n        reportList.parent().css('height', 'auto');\n      }\n    })\n  },\n  SPECIES_ANALYSIS: async function (evt, map) {\n    const coords = evt.coordinate;\n    const [x, y] = coords\n    const srs = map.getView().getProjection();\n    const url = new URL(\n      window.Urls.analysis_forestecco(),\n      window.location);\n    url.searchParams.set('x', x);\n    url.searchParams.set('y', y);\n    url.searchParams.set('srs', srs.getCode());\n    url.searchParams.set('visible_srid', window.coordinates_epsg);\n    $('#species-dialog').removeClass('hidden');\n    const sel_species = $('#species');\n    const sel_scenarios = $('#scenarios');\n    const sel_periods = $('#periods');\n\n    if (sel_species.find('option').length == 0) {\n      const urlSpecs = new URL(\n        window.Urls.pois_json_by_st('FOREST_SPECIES_FOR_ANALYSIS'),\n        window.location);\n      urlSpecs.searchParams.set('no_geom', true);\n      const resp = await fetch(urlSpecs);\n      const specs = await resp.json();\n      for (const spec of specs)\n        sel_species.append($(`<option value=${spec.id}>${spec.name}</option>`));\n\n      const scenarios = map.get('dimension_controls').FIC_SCENARIO_FCC.options;\n      for (const scenario of scenarios)\n        if (scenario[0] != 'HISTORICAL')\n          sel_scenarios.append($(`<option selected value=${scenario[0]}>${scenario[1]}</option>`))\n\n      const periods = window.timelinectl.timeline.customTimes;\n      for (const period of periods)\n        if (period.options.id !== 'current' && period.customTime.getFullYear() > 2000)\n          sel_periods.append($(`<option selected value=${period.customTime.getFullYear()}>${period.options.title}</option>`))\n      sel_species.on('change', function () {\n        $('#btn_analysis').prop('disabled',\n          (sel_species.val().length && sel_scenarios.val().length && sel_periods.val().length) == 0);\n      })\n      sel_species.multiSelect(multiselectOptions(\n        '<div class=\"multiselect-header\">No incluir</div>',\n        '<div class=\"multiselect-header\">Incluir</div>')\n      );\n\n      sel_periods.multiSelect(multiselectOptions(\n        '<div class=\"multiselect-header\">No incluir</div>',\n        '<div class=\"multiselect-header\">Incluir</div>')\n      );\n\n      sel_scenarios.multiSelect(multiselectOptions(\n        '<div class=\"multiselect-header\">No incluir</div>',\n        '<div class=\"multiselect-header\">Incluir</div>')\n      );\n\n    }\n    sel_species.val([])\n    sel_species.multiSelect('deselect_all');\n    const downloadbusy = 'downloadbusy';\n    const buttons = [\n      {\n        id: 'btn_analysis',\n        text: window.gettext('Aceptar'),\n        disabled: true,\n        click: function () {\n          const iframe = $('<iframe>', { id: downloadbusy });\n          url.searchParams.set('elements', sel_species.val());\n          url.searchParams.set('periods', sel_periods.val());\n          url.searchParams.set('scenarios', sel_scenarios.val());\n          url.searchParams.set('order', $('input[name=\"order-by\"]:checked').val());\n          $('body').append(iframe);\n          Cookies.set(downloadbusy, true);\n          iframe.attr('src', url);\n          let timer = 0;\n          const timeOut = window.setInterval(\n            function () {\n              if (timer > 100 || !Cookies.get(downloadbusy)) {\n                $('body').remove(iframe);\n                map.set('notification', null)\n                window.clearInterval(timeOut)\n              }\n              else\n                map.set('notification', window.gettext('Generando... %s').replace(/[%]s/, Math.floor(timer++ / 10)));\n            },\n            500\n          )\n          $(this).dialog(\"close\");\n          $(this).dialog(\"destroy\");\n        },\n      },\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          $(this).dialog(\"close\");\n          $(this).dialog(\"destroy\");\n        }\n      }\n    ];\n    $('#species-dialog').dialog({\n      minWidth: 520,\n      buttons\n    })\n  },\n  UME_JIINT_REPORT: async function (evt, map) {\n    console.debug(evt, map);\n    window.open(`${window.Urls.ad_hoc_report()}?report=233&simulation_id=${window.simulation_id}`);\n  },\n};\n\nfunction transform_extent(extent) {\n  const corners = [\n    transform_point([extent[0], extent[1]]),\n    transform_point([extent[2], extent[3]]),\n    transform_point([extent[0], extent[3]]),\n    transform_point([extent[2], extent[1]])\n  ];\n  return boundingExtent(corners);\n}\nasync function cargarMosaico(ns, cfg) {\n  let marks = [];\n  let diffs = [];\n  const string_extent = getParameterByName('extent');\n\n  if (cfg.page_type_locator == 'mappage') {\n    $.getJSON(window.Urls.page_json(ns.page_id), opt => cfg = opt);\n    cfg.extent = new Float64Array(string_extent.split(','));\n  }\n  //cfg.pagelayer_set.forEach(cargarArbol)\n  if (cfg.epsg)\n    ns.epsg = cfg.epsg.locator;\n\n  if (cfg.page_type_locator == 'mappage') {\n    window.document.title += ` - ${window.gettext(\"Mosaico\")}`;\n    $('ul.breadcrumb').find('li.active').parent().append(`<li>${window.gettext(\"Mosaico\")}</li>`);\n    $('ul.breadcrumb').find('li.active').remove();\n  }\n  let iterations = cfg.iterations;\n  if (ns.time_type === undefined)\n    ns.time_type = cfg.time_type;\n  const extent_local_global = transformExtent(cfg.extent, 'EPSG:4326', window.epsg);\n\n  const view = new View({\n    center: extent_local_global,\n    projection: ns.epsg,\n    showFullExtent: true,\n    zoom: 10,\n  });\n  const emul_mapa = new Map({\n    _time_delta: null,\n    view: view,\n  });\n  emul_mapa.set('info', true);\n  const dimension_controls = {};\n  // FIXME: Cambiar activeDimensions por mosaicDimensions para independizar\n  // el concepto de mosaico del de info punto o graphic page\n  // ya que ambos se basan en el mismo concepto pero mejor no confundir\n  const activeDimensions = getParameterByName('activeDimensions');\n  if (!activeDimensions)\n    emul_mapa.set('activeDimensions', {}, true);\n  emul_mapa.set('simulation_id', ns.simulation_id);\n  emul_mapa.set('dimension_controls', dimension_controls, true);\n  emul_mapa.set('layerObjects', []);\n  crearControlesDimensiones(emul_mapa, dimension_controls, cfg.dimensions);\n  var $dim = $('#dimensions');\n  var hiddenDimsSel = (\n    $dim.length === 0 ||\n    $dim.is(':hidden') ||\n    $dim.width() === 0 ||\n    $dim.height() === 0\n  );\n  if (hiddenDimsSel)\n    $('#parameters').removeClass('hidden');\n  ns.mapas = [emul_mapa];\n  const size_field = $('.size-field');\n  const size = size_field.find('input');\n  const iter_field = $('.iteration-field');\n  const iter = iter_field.find('input');\n  const interv_field = $('.interval-field');\n  const interv = interv_field.find('input');\n  const size_list = [\n    [window.gettext('pequeño'), null],\n    [window.gettext('mediano'), 6],\n    [window.gettext('grande'), 12],\n    [window.gettext('muy grande'), 25]\n  ];\n  size_list.forEach(ep => {\n    const li = document.createElement('li')\n    li.innerText = ep[0];\n    li.addEventListener('click', async function () {\n      $(this).parent().find('li').removeClass('select');\n      $(this).addClass('select');\n      size_field.removeClass('listshown');\n      $('.mosaics').empty();\n      size.val(ep[0]);\n      const string_extent = getParameterByName('extent');\n      const extent = string_extent ?\n        new Float64Array(string_extent.split(',')) :\n        cfg.extent;\n      ns.mapas = [emul_mapa];\n      cfg.extra.img_size = ep[1];\n      const mapasM = await crearMosaicos(ns, { ...cfg, extent }, iter.val(), false);\n      crearMapas_mosaico(ns, mapasM);\n    }, false);\n    $('ul#size-list').append(li);\n  })\n  size_field.find('i').on('click', () => size_field.toggleClass('listshown'));\n  if (!cfg.time_type.locator.startsWith(\"ENUM\")) {\n    iter_field.find('i').click(function () {\n      iter_field.toggleClass('listshown');\n    });\n    interv_field.find('i').click(function () {\n      interv_field.toggleClass('listshown');\n    });\n    let iter_list = [];\n    let interv_list = [];\n    let delta = cfg.delta;\n    cfg.time_type.data.forEach((dat) => {\n      if (dat.type.locator == \"MOSAIC_DELTA\")\n        interv_list = JSON.parse(dat.value);\n      else if (dat.type.locator == \"MOSAIC_ITERATIONS\")\n        iter_list = JSON.parse(dat.value);\n      else if (dat.type.locator == \"DEFAULT_MOSAIC_DELTA\" && !delta)\n        delta = dat.value;\n      else if (dat.type.locator == \"DEFAULT_MOSAIC_ITERATIONS\" && !iterations)\n        iterations = dat.value;\n    })\n    if (!iter_list.includes(iterations))\n      iter_list.push(iterations)\n    iter.val(iterations);\n    interv.val(delta);\n\n    iter_list.forEach((ep) => {\n      const li = document.createElement('li')\n      li.innerText = ep;\n      li.value = ep;\n      li.addEventListener('click', async function () {\n        $(this).parent().find('li').removeClass('select');\n        $(this).addClass('select');\n        iter_field.removeClass('listshown');\n        $('.mosaics').empty();\n        iter.val($(this).val());\n        const string_extent = getParameterByName('extent');\n        const extent = string_extent ?\n          new Float64Array(string_extent.split(',')) :\n          cfg.extent;\n        ns.mapas = [emul_mapa];\n        const mapasM = await crearMosaicos(ns, { ...cfg, extent }, $(this).val(), false);\n        crearMapas_mosaico(ns, mapasM);\n      }, false);\n      $('ul#iteration-list').append(li);\n    })\n    interv_list.forEach((ep) => {\n      const li = document.createElement('li')\n      li.innerText = ep;\n      li.value = ep;\n      li.addEventListener('click', function () {\n        $(this).parent().find('li').removeClass('select');\n        $(this).addClass('select');\n        interv_field.removeClass('listshown');\n        interv.val($(this).val());\n        const self = this;\n        let resolution = 1;\n        if (cfg.time_type.locator == '1MO')\n          resolution = 720;\n        for (const [i, mapa] of ns.mapas.entries()) {\n          if (i == 0) continue;\n          const n_map = Number(mapa.getTargetElement().id.split('_')[1]);\n          mapa.getLayers().forEach(function (l) {\n            if (l.get('time_management')) {\n              const src = l.getSource();\n              src.set('time_delta', n_map * resolution * $(self).val());\n            }\n          });\n        }\n        setCurrentValue(dayjs(window.timelinectl.timeline.getCustomTime('current')));\n      }, false);\n      $('ul#interval-list').append(li);\n    });\n  }\n  else {\n    $('.time-selector').hide();\n    $('div.parameters').hide();\n    $('div.calendar').hide();\n    marks = cfg.time_type.locator\n      .split(':')[1]\n      .split('/')\n      .map(x => dayjs(x + '-01-01T00:00:00Z'));\n    diffs = marks;\n  }\n  let createTimeline = true;\n  const extent = string_extent ?\n    new Float64Array(string_extent.split(',')) :\n    cfg.extent;\n  if (!activeDimensions) {\n    const mapasM = await crearMosaicos(ns, { ...cfg, extent },\n      (diffs.length) ? diffs.length : iterations, createTimeline, diffs);\n    await crearMapas_mosaico(ns, mapasM);\n  }\n  else {\n    let newActiveDimensions = {};\n    for (const ctl of Object.values(dimension_controls)) {\n      if (!ctl.id) continue;\n      newActiveDimensions[ctl.id] = [];\n      const dim_values = getParameterByName(ctl.id);\n      for (const v of dim_values.split(',')) {\n        const option = ctl.options.find(o => o[0] == v);\n        if (option)\n          newActiveDimensions[ctl.id].push(option);\n      }\n    }\n    for (const k of Object.keys(newActiveDimensions))\n      if (newActiveDimensions[k].length > 1) {\n        dimension_controls[k].value = null;\n      }\n    emul_mapa.set(\"dimension_controls\", dimension_controls)\n    if (newActiveDimensions)\n      emul_mapa.set('activeDimensions', newActiveDimensions);\n    const combinations = !$.isEmptyObject(newActiveDimensions) ? cartesian(newActiveDimensions) : [{}];\n    const sortByValue = getParameterByName('sortByValue');\n    combinations.sort((a, b) => {\n      const valA = a[sortByValue]?.[0] ?? \"\";\n      const valB = b[sortByValue]?.[0] ?? \"\";\n      return valA.localeCompare(valB);\n    });\n    emul_mapa.set('sortByValue', sortByValue);\n    const mapasM = await crearMosaicos(ns, { ...cfg, extent, combinations, sortByValue },\n      diffs.length ? diffs.length : iterations, createTimeline, diffs);\n\n    await crearMapas_mosaico(ns, mapasM);\n  }\n  setTimeout(() => {\n    const idx_hor_notsel = getParameterByName('idx_hor_notsel').split(',');\n\n    ns.mapas.map(map => {\n      const elem = map.getTargetElement();\n      if (elem) {\n        const map_iter = elem.id.split('_')[1];\n        if (idx_hor_notsel.find(i => i == map_iter))\n          $(elem).parent().hide();\n      }\n    })\n  }, 200)\n  let drawBox;\n  const pagelayer_set = cfg?.pagelayer_set;\n  $('#seleccionar_bbox').on('click', function () {\n    const extentInicial = cfg.extent;\n    const { viewState, extent } = ns.mapas[1].getView().getViewStateAndExtent();\n\n    const extent_local_global = transformExtent(extent, viewState.projection, 'EPSG:3857');\n    const extentInicial3857 = transformExtent(extentInicial, 'EPSG:4326', 'EPSG:3857');\n    $('#selector-bbox').show().animate({ width: '300pt', height: '300pt' },\n      {\n        complete: async function () {\n          if ($('#selector-bbox div.ol-viewport').length > 0)\n            return;\n\n          const source = new VectorSource({ wrapX: false });\n          const feature = new Feature({\n            geometry: fromExtent(extent_local_global),\n          });\n\n          source.addFeature(feature);\n          const vector = new VectorLayer({\n            source: source,\n          });\n          const v = new View({\n            center: [0, 0],\n            showFullExtent: true,\n            extent: extentInicial3857,\n          });\n          v.fit(extent_local_global);\n          const m = new Map({\n            layers: [\n              new TileLayer({\n                opacity: 0.5,\n                source: new OSM(),\n              }),\n              vector,\n            ],\n            target: 'selector-bbox',\n            view: v,\n          });\n          m.set('layerObjects', []);\n          for (const page_layer of cfg.pagelayer_set) {\n            if (page_layer.layer.layertype.locator == 'REFERENCE') {\n              await crearCapa(\n                ns,\n                m,\n                page_layer,\n                transform_extent(extentInicial),\n                false,\n                cfg.time_delta,\n                cfg.extra\n              );\n            }\n          }\n          drawBox = new Draw({\n            source: source,\n            type: 'Circle',\n            geometryFunction: createBox(),\n          });\n          /**\n   * The help tooltip element.\n   * @type {HTMLElement}\n   */\n          let helpTooltipElement;\n          /**\n           * Overlay to show the help messages.\n           * @type {Overlay}\n           */\n          let helpTooltip;\n          if (helpTooltipElement) {\n            helpTooltipElement.parentNode.removeChild(helpTooltipElement);\n          }\n          helpTooltipElement = document.createElement('div');\n          helpTooltipElement.className = 'ol-tooltip hidden';\n          helpTooltip = new Overlay({\n            element: helpTooltipElement,\n            offset: [15, 0],\n            positioning: 'center-left'\n          });\n          helpTooltipElement.innerHTML = window.gettext('Click para comenzar a dibujar');\n          m.addOverlay(helpTooltip);\n          const pointerMoveHandler = function (evt) {\n            if (evt.dragging) {\n              return;\n            }\n            helpTooltip.setPosition(evt.coordinate);\n            helpTooltipElement.classList.remove('hidden');\n          };\n          m.on('pointermove', pointerMoveHandler);\n          m.getViewport().addEventListener('mouseout', function () {\n            helpTooltipElement.classList.add('hidden');\n          });\n          drawBox.on('drawstart',\n            function () {\n              const f = this.source_.getFeatures().pop();\n              if (f)\n                this.source_.removeFeature(f)\n              helpTooltipElement.innerHTML = window.gettext('Click para terminar de dibujar');\n            });\n          drawBox.on('drawend',\n            function (evt) {\n              const feature = evt.feature;\n              if (feature) {\n                const oldUrl = window.location.href;\n                const extent3857 = feature.getGeometry().getExtent();\n                const extent4326 = transformExtent(extent3857, 'EPSG:3857', 'EPSG:4326');\n                let newUrl;\n                if (oldUrl.includes('extent'))\n                  newUrl = oldUrl.replace(/(extent=)[^&]*(.*)/, '$1' + extent4326 + '$2')\n                else {\n                  const sep = oldUrl.includes('?') ? '&' : '?'\n                  newUrl = oldUrl + sep + 'extent=' + extent4326;\n                }\n                window.history.replaceState(null, null, newUrl);\n                const value = $('input#iteration').val();\n                if (value)\n                  $(`ul#iteration-list li[value=${value}]`).trigger('click');\n                else\n                  // FIXME\n                  window.location.reload();\n              }\n              helpTooltipElement.innerHTML = window.gettext('Click para comenzar a dibujar');\n            })\n          m.addInteraction(drawBox);\n          $('#selector-bbox').find('.ol-attribution').addClass('ol');\n          setTimeout(() => {\n            $('#selector-bbox').find('.ol-attribution button').click();\n          }, 100);\n        },\n      })\n    $('#selector-bbox').dialog({\n      title: window.gettext('Seleccione el área a mostrar'),\n      width: 'auto',\n      height: 'auto',\n      open: () => {\n        $('#selector-bbox').parent().css('width', 'auto');\n        $('#selector-bbox').parent().css('height', 'auto');\n      },\n      close: () => {\n        $('#selector-bbox').empty();\n      }\n    });\n  });\n  $('#imprimir_mosaico').click(function () {\n    // FIXME: Es igual que exportar_tif\n    const string_extent = getParameterByName('extent');\n    const extent = string_extent ?\n      new Float64Array(string_extent.split(',')) :\n      cfg.extent;\n    const extent_mosaico = transformExtent(extent, 'EPSG:4326', ns.epsg);\n    const url = new URL(window.Urls.page_pdf(cfg.id), window.location.href);\n    const sp = url.searchParams;\n    for (const lyr of emul_mapa.getAllLayers()) {\n      if (!lyr.getVisible())\n        continue\n      const layerOpacity = lyr.getOpacity();\n      if (layerOpacity !== 1)\n        sp.set(`layerOpacity${lyr.get('simmer_id')}`, layerOpacity)\n    }\n\n    sp.set(\n      'date', window.timelinectl.timeline.getCustomTime('current').toISOString());\n    sp.set(\n      'ITERATIONS', iter ? iter.val() : diffs.length);\n    if (cfg.extra.img_size)\n      sp.set(\n        'IMG_SIZE', cfg.extra.img_size * 1.5);\n    sp.set(\n      'DELTA_TIME', interv ? interv.val() : 0);\n    sp.set(\n      'visible_layers', getParameterByName('visible_layers'));\n    sp.set('bbox', extent_mosaico);\n    if (emul_mapa.get('sortByValue'))\n      sp.set('sortByValue', emul_mapa.get('sortByValue'));\n    const activeDimensions = emul_mapa.get('activeDimensions');\n    let dimensions = {};\n    if (activeDimensions && Object.keys(activeDimensions).length) {\n      for (const [id, vals] of Object.entries(activeDimensions)) {\n        dimensions[id] = vals.map(d => d[0]).join(',');\n      }\n    } else {\n      dimensions = setDims(pagelayer_set);\n    }\n    for (const [k, v] of Object.entries(dimensions || {})) {\n      if (Array.isArray(v)) {\n        v.forEach(val => sp.append(k, val));\n      } else if (v != null) {\n        sp.set(k, v);\n      }\n    }\n    if (diffs && diffs.length) {\n      sp.set(\n        'DIFF_DELTA',\n        typeof diffs[0] === 'number'\n          ? diffs.join(',')\n          : diffs.map(d => d.toISOString()).join(',')\n      );\n    }\n    if (ns.simulation_id)\n      sp.set('simulation_id', ns.simulation_id);\n    const idx_hor_notsel = getParameterByName('idx_hor_notsel');\n    if (idx_hor_notsel.length)\n      sp.set('notsel_idxs', idx_hor_notsel);\n    window.open(url);\n  });\n  $('#exportar_tif').click(function () {\n    const string_extent = getParameterByName('extent');\n    const extent = string_extent ?\n      new Float64Array(string_extent.split(',')) :\n      cfg.extent;\n    const extent_mosaico = transformExtent(extent, 'EPSG:4326', ns.epsg);\n    const url = new URL(window.Urls.page_tif(cfg.id), window.location);\n    const sp = url.searchParams;\n    sp.set(\n      'date', window.timelinectl.timeline.getCustomTime('current').toISOString());\n    sp.set(\n      'ITERATIONS', iter ? iter.val() : marks.length);\n    sp.set(\n      'DELTA_TIME', interv ? interv.val() : 0);\n    sp.set(\n      'visible_layers', getParameterByName('visible_layers'));\n    sp.set('bbox', extent_mosaico);\n    if (ns.epsg)\n      sp.set('srid', ns.epsg);\n    const extra_dim = setDims(pagelayer_set);\n    if (extra_dim) {\n      for (const [k, v] of Object.entries(extra_dim)) {\n        if (Array.isArray(v)) {\n          v.forEach(val => sp.append(k, val));\n        } else if (v != null) {\n          sp.set(k, v);\n        }\n      }\n    }\n    if (ns.simulation_id)\n      sp.set('simulation_id', ns.simulation_id);\n    window.open(url);\n  });\n  $('#seleccionar_horizons').click(function () {\n    if ($('.dialog[name=\"sel_hor_dialog\"].ui-dialog-content').length)\n      $('.dialog[name=\"sel_hor_dialog\"].ui-dialog-content').dialog('destroy');\n    const selector_element = $('<div class=\"dialog\" id=\"select-horizons-dialog\" name=\"sel_hor_dialog\"><form><div class=\"multi flex\"><select multiple name=\"horizons\"></div></select></form></div>');\n    const sel = selector_element.find('select');\n    const { capas } = getVisibleLayers_set(pagelayer_set);\n    const default_layer = capas[0];\n    sel.empty();\n    const format_string = getFormatString(cfg.time_type.locator);\n    if (!cfg.time_type.locator.startsWith(\"ENUM\")) {\n      let init_date = $('div.calendar').find('input').val();\n      init_date = dayjs(init_date).startOf('hour');\n      const iter_value = Number(iter.val());\n      const delta_value = Number(interv.val());\n      const scale = cfg.time_type.locator == '1MO' ? 'months' : 'hours';\n      for (let iteracion = 0; iteracion < iter_value; iteracion++) {\n        const opt_val = dayjs(init_date).add(delta_value * iteracion, scale);\n        const hor_id = `${default_layer.id}_${iteracion}`;\n        const no_selected = $(`div#${hor_id}.mosaic_map`).is(':hidden');\n        sel.append($(`<option ${no_selected ? '' : 'selected=\"selected\"'} value=\"${opt_val.toISOString()}\" n_iter=\"${iteracion}\">${opt_val.format(format_string)}</option>`));\n      }\n    }\n    else {\n      const labelsj = cfg.time_type.data.find(x => x.locator == 'LABELS');\n      const labels = labelsj ? JSON.parse(labelsj.value) : null;\n      marks.map((mark, idx) => {\n        const k = labels ? labels[mark.format(format_string)] : mark.format(format_string);\n        const hor_id = `${default_layer.id}_${idx}`;\n        const no_selected = $(`div#${hor_id}.mosaic_map`).is(':hidden');\n        sel.append($(`<option ${no_selected ? '' : 'selected=\"selected\"'} n_iter=\"${idx}\">${k}</option>`));\n      })\n    }\n    const buttons = [\n      {\n        text: window.gettext('Guardar'),\n        click: function () {\n          const form = sel.closest('form');\n          const idx_hor_notsel = showHorizons(form);\n          updateUnselectedHorizons(idx_hor_notsel);\n          const dialog = this;\n          $(dialog).dialog(\"close\");\n          $(dialog).dialog(\"destroy\");\n        },\n      },\n      {\n        text: window.gettext('Cancelar'),\n        click: function () {\n          const dialog = this;\n          $(dialog).dialog(\"close\");\n          $(dialog).dialog(\"destroy\");\n        }\n      }\n    ];\n    sel.multiSelect(multiselectOptions(\n      '<div class=\"multiselect-header\">No mostrados</div>',\n      '<div class=\"multiselect-header\">Mostrados</div>')\n    );\n    sel.on('change', function () {\n      const form = sel.closest('form');\n      form.find('.ms-selection li').attr('title', window.gettext('Deseleccionar'))\n      form.find('.ms-selectable li').attr('title', window.gettext('Seleccionar'))\n\n    });\n    sel.trigger('change');\n    selector_element.attr('id', `select-horizons-dialog_${sel.attr('id')}`)\n    selector_element.show();\n    selector_element.dialog({\n      title: window.gettext('Seleccione los horizontes a mostrar:'),\n      width: 'auto',\n      height: 'auto',\n      buttons: buttons,\n      position: {\n        my: 'center',\n        at: 'center',\n        collision: \"fit\"\n      },\n      autoOpen: true,\n    });\n  });\n  setDims(pagelayer_set);\n  const hasSeriesComb = emul_mapa.get('layerObjects').some(pl =>\n    pl._ol_layer?.getVisible() &&\n    (pl._pageLayer.layer.source_type.dimensions?? []).some(d => d.value_type != 'PERIODIC')\n  );\n  if (hasSeriesComb) {\n    const $container = $('.right-bar.ol-control');\n    let $btn = $('#show-dim-selector');\n    if (!$btn.length) {\n      $btn = $(`\n        <button id=\"show-dim-selector\"\n                class=\"fas fa-solid fa-cubes\"\n                title=\"${window.gettext('Seleccionar combinaciones de series')}\">\n        </button>\n      `).on('click', () => showDimSelector(emul_mapa));\n    }\n    $container.prepend($btn);\n  } else {\n    $('#show-dim-selector').remove();\n  }\n  emul_mapa.on('change:dimension_controls', function () {\n    if ($('#parameters').is(':hidden') && dimension_controls && Object.values(dimension_controls).length > 1) {\n      const oldUrl = window.location.href;\n      let restart = true;\n      const newUrl = new URL(oldUrl);\n      for (const ctl of Object.values(dimension_controls)) {\n        if (!ctl.id) continue;\n        if (ctl.value === null) {\n          restart = false;\n          continue\n        }\n        newUrl.searchParams.set(ctl.id, ctl.value);\n      }\n      if (restart) {\n        newUrl.searchParams.delete('activeDimensions');\n        newUrl.searchParams.delete('sortByValue');\n      }\n      window.history.replaceState(null, null, newUrl);\n      window.location.reload();\n    }\n  })\n}\n\nfunction showDimSelector(emul_mapa) {\n  const dimControls = emul_mapa.get('dimension_controls');\n  let $dialog = $('#dims-dialog');\n  if ($dialog.length === 0) {\n    $dialog = $('<div id=\"dims-dialog\"></div>').appendTo('body');\n\n    $dialog.dialog({\n      title: window.gettext('Seleccione dimensiones'),\n      autoOpen: false,\n      modal: true,\n      width: 'auto',\n      buttons: [{\n        text: window.gettext('Aceptar'),\n        click: function () {\n          const newActiveDimensions = {};\n          $('#dims-dialog .multi.flex:visible').each((idx, divSel) => {\n            const $divSel = $(divSel);\n            const sel = $divSel.find('select');\n            const val = sel.val() || [];\n\n            const id = sel.attr('id').split(' ')[1];\n            newActiveDimensions[id] = val.map(v => [v, captions[id][v]]);\n          });\n          const oldUrl = window.location.href;\n          const newUrl = new URL(oldUrl);\n          const sortByValue = $('#sortSelect').val();\n          if (Object.keys(newActiveDimensions).length > 0) {\n            emul_mapa.set('sortByValue', sortByValue);\n            emul_mapa.set('activeDimensions', newActiveDimensions);\n            for (const [k, v] of Object.entries(newActiveDimensions)) {\n              if (Array.isArray(v)) {\n                const values = v.map(pair => pair[0]);\n                newUrl.searchParams.set(k, values.join(','));\n              } else if (v != null) {\n                newUrl.searchParams.set(k, v);\n              }\n            }\n            newUrl.searchParams.set(\"activeDimensions\", true);\n            newUrl.searchParams.set(\"sortByValue\", sortByValue);\n            window.history.replaceState(null, null, newUrl);\n            window.location.reload();\n          }\n\n          $dialog.dialog('close');\n        }\n      }\n      ]\n    });\n  } else {\n    $dialog.empty();\n  }\n  const captions = {};\n  const groupContainer = $(`\n    <div id=\"sortSelectContainer\" class=\"dim-control\">\n      <label for=\"sortSelect\">${window.gettext('Ordenar por:')}</label>\n      <select id=\"sortSelect\" class=\"custom-select\"></select>\n    </div>\n  `).appendTo($dialog);\n\n  const sortByValue = emul_mapa.get('sortByValue');\n\n  for (const ctl of Object.values(dimControls)) {\n    if (ctl.usage > 0) {\n      const selected = (ctl.id === sortByValue) ? 'selected' : '';\n      groupContainer.find('select').append(\n        `<option value=\"${ctl.id}\" ${selected}>${ctl.name}</option>`\n      );\n    }\n  }\n  const valid_dims_contol = [\n    ...new Set(\n      emul_mapa.get('layerObjects')\n        .filter(pl => pl._ol_layer?.getVisible())\n        .flatMap(pl => pl._pageLayer.layer.source_type.dimensions?.map(d => d.locator) ?? [])\n    )\n  ];\n  for (const ctl of Object.values(dimControls)) {\n    if (!ctl.id) continue;\n    if (!valid_dims_contol.includes(ctl.id)) continue;\n    captions[ctl.id] = {};\n    const div = $(`<div class=\"multi flex\"></div>`).appendTo($dialog);\n    $(`<h4>${ctl.name}</h4>`).appendTo(div);\n\n    const sel = $(`<select id=\"dimensionSel ${ctl.id}\" multiple=\"multiple\"></select>`)\n      .appendTo(div);\n\n    for (const [value, name] of ctl.options) {\n      sel.append(`<option value=\"${value}\">${name}</option>`);\n      captions[ctl.id][value] = name;\n    }\n\n    sel.multiSelect(multiselectOptions(\n      '<div class=\"multiselect-header\">No mostrados</div>',\n      '<div class=\"multiselect-header\">Mostrados</div>'\n    ));\n  }\n\n  const activeDims = emul_mapa.get('activeDimensions') || {};\n  for (const ctl of Object.values(dimControls)) {\n    if (!ctl.id) continue;\n    const sel = $(`select[id=\"dimensionSel ${ctl.id}\"]`);\n    if (!sel.length) continue;\n    sel.multiSelect('deselect_all');\n    if (activeDims[ctl.id] && activeDims[ctl.id].length > 0) {\n      // usar lo guardado\n      sel.multiSelect('select', activeDims[ctl.id].map(v => '' + v[0]));\n    } else if (ctl.value) {\n      // si no había nada, usar el valor por defecto\n      sel.multiSelect('select', [ctl.value]);\n    }\n  }\n  $dialog.dialog('open');\n}\n\nfunction showHorizons(form) {\n  const lis_notsel = form.find('.ms-selectable li:not(.ms-selected)');\n  const lis_sel = form.find('.ms-selectable li.ms-selected');\n  const idx_hor_notsel = []\n  const maps = $('tr.fila_mapas .mosaic_map');\n  lis_notsel.map((idx_li, li) => {\n    idx_hor_notsel.push(li.getAttribute('n_iter'));\n    maps.map((i, map) => {\n      const map_iter = map.id.split('_')[1];\n      if (map_iter == li.getAttribute('n_iter'))\n        $('#' + map.id).parent().hide();\n    })\n  })\n  lis_sel.map((idx_li, li) => {\n    maps.map((i, map) => {\n      const map_iter = map.id.split('_')[1];\n      if (map_iter == li.getAttribute('n_iter'))\n        $('#' + map.id).parent().show();\n    })\n  })\n  return idx_hor_notsel;\n}\nasync function crearMapas_mosaico(ns, mapasM) {\n  const cfg = ns.simulation_id ?\n    await $.getJSON(window.Urls.simul_json(ns.simulation_id, ns.page_id)) :\n    null;\n  let dyn = null\n  if (cfg) {\n    dyn = cfg.simul;\n    dyn.relations = cfg.relations;\n  }\n  Promise.allSettled(Object.entries(mapasM).map(\n    kv => cargarMapa(ns, ns.page.find(`#${kv[0]}`), kv[1], dyn))).then(\n      () => {\n        const dims = ns.mapas[0].get('dimension_controls');\n        const activeDimensions = getParameterByName('activeDimensions');\n        if (dims && !activeDimensions) {\n          for (const [i, mapa] of ns.mapas.entries()) {\n            if (i == 0) continue;\n            for (const dim_control of Object.values(dims)) {\n              for (const lyr of mapa.get('layerObjects')) {\n                const lyr_dims = lyr._layer?.source_type?.dimensions;\n                if (!lyr_dims || lyr_dims.length == 0)\n                  continue;\n                if (!lyr_dims.find(d => d.locator == dim_control.id))\n                  continue;\n                const l = lyr._ol_layer;\n                const src = l.getSource();\n                dim_control.on('change:value',\n                  () => src.updateParams({ [dim_control.id]: dim_control.value })\n                );\n                src.updateParams({ [dim_control.id]: dim_control.value });\n              }\n            }\n          }\n        }\n        if (window.timelinectl)\n          setCurrentValue(dayjs(window.timelinectl.timeline.getCustomTime('current')))\n      });\n}\nfunction getVisibleLayers_set(pagelayer_set) {\n  let visible_layers = getParameterByName('visible_layers').split(',');\n  let baselayer = false;\n  if (visible_layers[0] == '') {\n    visible_layers = [];\n    pagelayer_set.forEach(l => {\n      if (l.shown)\n        if (l.layer.layertype.locator == 'BASELAYER' && !baselayer) {\n          baselayer = true;\n          visible_layers.push(String(l.id))\n        }\n        else if (l.layer.layertype.locator != 'BASELAYER')\n          visible_layers.push(String(l.id))\n    });\n  }\n  const referencias = [];\n  const fondos = [];\n  const capas = [];\n\n  let default_background = null;\n  for (const page_layer of pagelayer_set) {\n    if (!default_background && page_layer.layer.layertype.locator == 'BASELAYER' && page_layer.shown)\n      default_background = page_layer;\n    page_layer.shown = visible_layers.includes(String(page_layer.id));\n    if (page_layer.layer.layertype.locator == 'REFERENCE') referencias.push(page_layer);\n    if (page_layer.layer.layertype.locator == 'LAYER') capas.push(page_layer);\n    if (page_layer.layer.layertype.locator == 'BASELAYER') fondos.push(page_layer);\n  }\n  if (default_background && fondos.every(f => !f.shown))\n    window.setTimeout(() => { default_background.shown = true; })\n  return { referencias, fondos, capas };\n}\n\nasync function crearMosaicos(ns, cfg, iterations, createTimeline, diffs) {\n  const combinations = cfg.combinations || [{}];\n  const sortByValue = cfg.sortByValue || [{}];\n\n  setDims(cfg.pagelayer_set);\n  const mask_id = getParameterByName('trim_mask_id');\n  const { referencias, fondos, capas } = getVisibleLayers_set(cfg.pagelayer_set);\n  const capas_with = Object.groupBy(capas, (pl) => {\n    return pl.extra ? pl.extra.with : \"without\";\n  });\n  const mapasM = {};\n  for (const page_layer of capas.concat(referencias)) {\n    if (page_layer.extra && page_layer.extra.with)\n      continue;\n    if (mask_id) {\n      page_layer.extra.mask_id = mask_id;\n    }\n    page_layer.extra.readonly = true;\n    const layerObject = await crearCapa(ns, ns.mapas[0], page_layer, undefined, false, cfg.time_delta ?? 0, cfg.extra);\n    if (!page_layer.shown)\n      continue;\n    if(page_layer.layer.layertype.locator != 'LAYER')\n      continue;\n    const order = page_layer.order;\n    const capas_pl = capas_with[order] ? capas_with[order] : [];\n    let height, width;\n    const max_side = 170;\n    const extent_local = transform_extent(cfg.extent);\n    const aspect = (extent_local[3] - extent_local[1]) / (extent_local[2] - extent_local[0]);\n    if (aspect > 1) {\n      height = max_side;\n      width = max_side / aspect;\n    } else {\n      height = max_side * aspect;\n      width = max_side;\n    }\n\n    if (cfg.extra?.img_size) {\n      width = cfg.extra?.img_size * 40;\n      height = width * aspect;\n    }\n    if (page_layer.extra?.img_size) {\n      width = page_layer.extra.img_size * 40;\n      height = width * aspect;\n    }\n\n    if (layerObject.legend == 'auto') {\n      const params = { width: 150, pageLayerId: page_layer.id };\n      if (layerObject._layer.service.url.includes(sigym2))\n        params.height = 250;\n      layerObject._legend = layerObject.source.getLegendUrl(null, params);\n      layerObject._legend += '&TRANSPARENT=TRUE';\n    }\n\n    let titulo = getTitlePageLayer(page_layer);\n    for (const c of capas_pl) {\n      titulo += ' / ' + getTitlePageLayer(c);\n    }\n    let comb_layer = [];\n    const dims_layer = page_layer.layer?.source_type?.dimensions || {};\n    for (const comb of combinations) {\n      const valid_dims = Object.entries(comb).every(([k]) =>\n        Object.values(dims_layer).some(d => d?.locator === k)\n      );\n      if (valid_dims) {\n        comb_layer.push(comb);\n      }\n    }\n    if (comb_layer.length === 0) comb_layer = [{}];\n    const total_columnas = comb_layer.length * iterations + 1; // +1 por la celda de la leyenda\n    const fila_titulo = $(\n      `<tr class=\"fila_titulo\"><td class=\"titulo\" colspan=\"${total_columnas}\">${titulo}</td></tr>`\n    );\n    let fila = $('<tr class=\"fila_mapas\"/>');\n    let celda = $(\n      `<td><img \n        id=\"${page_layer.id}_legend\"\n        class=\"${layerObject.legend ? \"legend\" : \"no-legend\"}\"\n        src =\"${layerObject.legend || ''}\" />\n      </td>`\n    );\n    fila.append(celda);\n\n    for (const dimension_values of comb_layer) {\n      const dims_para_source = {};\n      for (const v of Object.entries(dimension_values))\n        dims_para_source[v[0]] = v[1][0];\n      const dims_para_id = Object.entries(dims_para_source).map(v => `${v[0]}-${v[1]}`).join('_');\n      for (let iteracion = 0; iteracion < iterations; iteracion++) {\n        const element_id = `${page_layer.id}_${iteracion}_${dims_para_id}`;\n        const sortedEntries = Object.entries(dimension_values)\n          .sort(([a], [b]) => (a === sortByValue ? -1 : b === sortByValue ? 1 : 0));\n        const dims_html = sortedEntries\n          .map(([k, v]) => `<div class=\"dim_label\">${v[1]}</div>`)\n          .join('');\n        let celda = $(`\n          <td>\n            <div class=\"time_info\" id=\"${element_id}_info\">...</div>\n            ${dims_html}\n            <div class=\"mosaic_map\" style=\"width:${width}pt; height:${height}pt;\" id=\"${element_id}\" class=\"celda\"></div>\n          </td>\n        `);\n        fila.append(celda);\n\n        let resolution = 1;\n        if (cfg.time_type.locator == '1MO') {\n          resolution = 720;\n          $('div.interval-field span#title').text(window.gettext('Intervalo (mes)'));\n          $('div.interval-field span#title').val('1MO');\n        }\n        const page_layer_with_dims = { ...page_layer };\n        page_layer_with_dims.extra = { ...page_layer_with_dims.extra, ...dims_para_source };\n        const map_cfg = {\n          pagelayer_set: [...referencias, ...fondos, ...capas_pl, page_layer_with_dims],\n          extent: cfg.extent,\n          time_delta: (diffs && diffs.length)\n            ? diffs[iteracion]\n            : iteracion * resolution * Number($('#interval').val()),\n        };\n        if (createTimeline) { // Sólo el primer mapa\n          createTimeline = false;\n          map_cfg.time_type = cfg.time_type;\n          map_cfg.initial_time = cfg.initial_time;\n        } else {\n          map_cfg.time_type = { locator: '0' };\n        }\n        mapasM[element_id] = map_cfg;\n      }\n    }\n\n    const tabla = $('<table><tbody></tbody></table>');\n    tabla.find('tbody').append(\n      fila_titulo,\n      fila,\n      '<tr class=\"fila_espacio\"><td colspan=\"99\">&nbsp;</td></tr>'\n    );\n    $('.mosaics').append(tabla);\n  }\n  return mapasM;\n}\n\nfunction getTitlePageLayer(page_layer) {\n  return (\n    page_layer.folder ?\n      page_layer.folder + ' - ' :\n      ''\n  ) + page_layer.layer.name_and_unit;\n}\nfunction setUpContextMenu(ns) {\n  const mapa = ns.mapa;\n  const items = [];\n  const hasSimulation = window.site_cfg.sim_type_locators.length;\n  if (hasSimulation && mapa.getTargetElement().classList.contains('interactive')) {\n    items.push({\n      text: `<i class=\"fab fa-gripfire fa-icon\"></i>&nbsp;&nbsp;${window.gettext('Propagación rápida')}`,\n      callback: createSimulation,\n      data: mapa,\n    });\n  }\n  for (const action of ns.parameters) {\n    if (action.type == 'MAP_ACTION')\n      items.push({\n        text: `<i class=\"${action.CLASS}\"></i>&nbsp;&nbsp;${window.gettext(action.name)}`,\n        callback: MAP_ACTIONS[action.parameter],\n      });\n  }\n  const contextMenu = new LegendContextMenu({\n    width: 'auto',\n    defaultItems: false,\n    items,\n  });\n  mapa.set('contextMenu', contextMenu);\n  mapa.addControl(contextMenu);\n}\nasync function cargarMapa(ns, element, cfg, dyn) {\n  if (cfg.epsg)\n    window.epsg = cfg.epsg.locator;\n  if (window.time_type === undefined)\n    window.time_type = cfg.time_type;\n  const destProj = proj4(window.epsg);\n  const oProj = destProj.oProj;\n  const deg = oProj.units == 'degrees';\n  const coordXY = createStringXY(deg ? 4 : 0);\n  const projDesc = `${window.epsg_name}`.toUpperCase();\n  if ('extent' in sessionStorage) {\n    const new_extent = sessionStorage.getItem('extent');\n    sessionStorage.removeItem('extent');\n    cfg.extent = new Float64Array(new_extent.split(','));\n  }\n  let extent = cfg.extent;\n  const extent_global = cfg.extent;\n  if (dyn && dyn.extent) extent = dyn.extent;\n  if (dyn) {\n    // FIXME: Debería ir con el modelo de\n    cfg.title = dyn.name;\n    for (let l of cfg.pagelayer_set) {\n      if (\n        l.layer.service.url &&\n        l.layer.service.url.includes('XXXsimulationXXX') &&\n        !dyn.reference\n      )\n        l.disabled = true;\n      l.layer.service.url = l.layer.service.url\n        ? l.layer.service.url.replace('XXXsimulation_idXXX', dyn.id)\n        : null;\n      l.layer.service.url = l.layer.service.url\n        ? l.layer.service.url.replace('XXXsimulationXXX', dyn.reference)\n        : null;\n      l.layer.extra = l.layer.extra || {};\n      if (dyn.relations.includes('READONLY'))\n        l.layer.extra.readonly = true;\n      if (l.extra?.affection_layer) {\n        l.layer.extra.affected_simulation_id = dyn.id;\n      }\n      for (const [k, extra_k] of Object.entries(l.layer.extra)) {\n        if (typeof extra_k === 'string') {\n          l.layer.extra[k] = l.layer.extra[k].replace(\n            'XXXsimulationXXX',\n            dyn.reference\n          ).replace(\n            'XXXsimulation_idXXX',\n            dyn.id\n          );\n        }\n      }\n    }\n  }\n  const interactive_map = element.hasClass('interactive');\n  const interactions = !interactive_map ? [] : defaultInteractions({ 'keyboard': false });\n  const extent_local = transform_extent(extent);\n  const extent_local_global = transform_extent(extent_global);\n\n  cfg.dyn = dyn;\n  let timeline_config;\n  if (cfg.time_type.locator != '0') {\n    if (cfg.time_type && window.timelinectl === undefined) {\n      if (interactive_map) {\n        $('.time-selector').appendTo(element);\n        $('.calendar').appendTo(element);\n      }\n      $('.time-selector').removeClass('hidden');\n      $('.time-selector-input').removeClass('hidden');\n      if (!cfg.time_type.locator.startsWith('ENUM')) {\n        $('.calendar').removeClass('hidden');\n      }\n      if ('date' in sessionStorage) {\n        const date = sessionStorage.getItem('date');\n        sessionStorage.removeItem('date');\n        cfg.new_initdate = date;\n      } else {\n        if (ns.time_travel)\n          cfg.new_initdate = dayjs(ns.time_travel);\n        else if (cfg.dyn?.initdate)\n          cfg.new_initdate = cfg.dyn.initdate;\n        else\n          cfg.new_initdate = new Date();\n        if (cfg.time_type.locator != '10M') {\n          cfg.new_initdate = dayjs(cfg.new_initdate).startOf('hour').toDate();\n        }\n      }\n    }\n    const timelineControl = window.timelinectl || new TimelineControl(cfg);\n    timeline_config = timelineControl.configure;\n    timeline_config.time_type = cfg.time_type.locator;\n  }\n\n  const geolocation = new Geolocation({\n    tracking: false\n  });\n\n  const mainbar_top = new ol_control_Bar({ className: 'ol-top ol-right' });\n  const infobar_bottom = new ol_control_Bar({ className: 'ol-bottom ol-right' });\n\n  const mousePosition = new MousePosition({\n    coordinateFormat: xy => coordXY(xy) + '<br>' + projDesc,\n    undefinedHTML: '&nbsp;'\n  });\n  const selectProjectionControl = new SelectProjectionControl(mousePosition);\n  const notification = new ol_control_Notification({});\n  let sidebar;\n  let sidebar_toggle;\n  if (interactive_map) {\n    const raiz = ns.page.find('div.arbol');\n    sidebar = new ol_control_Overlay({\n      className: \"slide-left menu\",\n      content: raiz[0]\n    });\n    sidebar_toggle = new ol_control_Toggle({\n      className: \"sb-capas\",\n      title: window.gettext(\"Capas\"),\n      html: `<i class=\"fa-solid fa-layer-group\"></i>`,\n      onToggle: function (value) {\n        sidebar.toggle();\n        mapa.set('sidebar_toggle', value, true);\n      }\n    });\n    raiz.attr('hidden', null);\n  }\n  const visibleLayerControl = new VisibleLayerControl();\n  const controls = !interactive_map\n    ? []\n    : new Collection([\n      sidebar,\n      sidebar_toggle,\n      new ScaleLine({\n        units: deg ? 'degrees' : 'metric'\n      }),\n      new ol_control_Scale(),\n      mousePosition,\n      selectProjectionControl,\n      infobar_bottom,\n      notification,\n      visibleLayerControl\n    ]);\n  const view = new View({\n    projection: window.epsg,\n    extent: extent_local_global,\n    showFullExtent: true,\n    //constrainResolution: true,\n  });\n  const srcElementEdit = new VectorSource();\n\n  const lyrElementEdit = new VectorLayer({\n    source: srcElementEdit,\n    displayInLayerSwitcher: false,\n    zIndex: Infinity,\n    style: new Style({\n      fill: new Fill({\n        color: 'rgba(255, 255, 255, 0.2)'\n      }),\n      stroke: new Stroke({\n        color: '#ffcc33',\n        width: 2\n      }),\n      image: new Circle({\n        radius: 7,\n        fill: new Fill({\n          color: '#ffcc33'\n        })\n      })\n    })\n  });\n  const modify = new Modify({ source: srcElementEdit });\n  const trans = new Transform({\n    source: srcElementEdit,\n    // translateFeature: true,\n    // scale: false,\n    // rotate: false,\n    // translate: true,\n    // stretch:false,\n    hitTolerance: 5,\n  });\n  let draw;\n  /**\n   * Overlay to show the measurement.\n   * @type {Overlay}\n   */\n  let measureTooltip, measureTooltipElement;\n  const mapa = new Map({\n    loadTilesWhileAnimating: true,\n    loadTilesWhileInteracting: true,\n    target: element[0],\n    view: view,\n    controls: controls,\n    interactions: interactions,\n    layers: [lyrElementEdit],\n    pixelRatio: Math.min(window.devicePixelRatio, 2)\n  });\n  if (window.time_type.locator != '0')\n    mapa.getViewport().addEventListener('mousemove', ev => handleMouseMove(mapa, ev));\n  mapa.set('layerObjects', []);\n  mapa.on('postrender', function () {\n    const layers = mapa.get('layerObjects');\n    const showableLegend = [];\n    for (const page_layer of layers) {\n      if (page_layer?._ol_layer?.getVisible() && page_layer._varLayer && page_layer._legend) {\n        showableLegend.push(page_layer);\n      }\n    }\n    this.get('contextMenu').set('showableLegend', showableLegend);\n    if (!cfg.extra?.hide_layers_caption) {\n      const captions = [];\n      for (const lyr of layers)\n        if (lyr._ol_layer?.getVisible()\n          && lyr._varLayer\n          && lyr.layerCaption) {\n          captions.push([lyr._ol_layer?.getZIndex(), lyr.layerCaption]);\n        }\n      visibleLayerControl.texts = captions.sort((a, b) => b[0] - a[0]);\n    }\n  })\n  mapa.set('sidebar_toggle', true, true);\n  mapa.set('dimension_controls', {}, true);\n  if (interactive_map) {\n    const infoContent = new ol_control_Overlay({\n      className: 'attribution',\n      content: infoElement()\n    });\n\n    const tb_controls_bottom = [\n      new OverviewMap({\n        collapseLabel: '\\u00BB',\n        label: '\\u00AB',\n        tipLabel: window.gettext('Vista de situación'),\n        layers: [\n          new TileLayer({\n            source: new OSM()\n          })\n        ],\n        view: new View({\n          projection: window.epsg,\n          //extent: extent_local_global\n        })\n      }),\n      new ol_control_Toggle({\n        className: \"ol-attribution\",\n        html: '<span>i</span>',\n        title: window.gettext('Atribución de fondo'),\n        onToggle: function () {\n          const active = this.getActive();\n          if (active) {\n            this.getMap().getLayers().getArray().forEach(ele => {\n              if (ele.getVisible() && ele.get('baseLayer'))\n                infoContent.element.getElementsByTagName('li')[0].innerHTML = ele.get('information') || 'n/a';\n            })\n          }\n          this.element.appendChild(infoContent.element);\n          infoContent.toggle();\n          this.setHtml(`<span>${active ? '»' : 'i'}</span>`)\n        }\n      }),\n    ]\n\n    const alertOverlay = new ol_control_Overlay({\n      className: 'alertmsg'\n    })\n    mapa.getTargetElement().append(alertOverlay.element);\n\n    const coordInput = new ol_control_Overlay({\n      className: 'coord-input',\n      content: coordInputElement()\n    });\n    const searcherBar = new ol_control_Bar({\n      toggleOne: true,\n      autoDeactivate: true,\n      controls: [\n        geosearch(extent, extent_local, alertOverlay),\n        new Button({\n          className: \"coordSearch\",\n          html: '<i class=\"fas fa-map-marker-alt\"></i>',\n          title: window.gettext('Ir a coordenadas'),\n          handleClick: function () {\n            coordSearchInput(this.coordInput, this.mapa, this.extent_local, this.alertOverlay)\n          }.bind({ coordInput, mapa, extent_local, alertOverlay })\n        }),\n        new ol_control_Toggle({\n          className: \"geolocation\",\n          html: '<i class=\"fa-solid fa-location-crosshairs\"></i>',\n          title: window.gettext('Mostrar posición actual'),\n          onToggle: function () { toggle_track(this, geolocation) }\n        }),\n      ]\n    })\n    searcherBar.getControls()[1].element.appendChild(coordInput.element);\n    const control_layer_popup = new ol_control_LayerPopup();\n    control_layer_popup.on('layer:visible', function (e) {\n      const fondo = e.layer;\n      const isVisible = fondo.get('visible');\n      setVisibleLayers_url(ns.page, mapa, fondo.get('simmer_id'), isVisible);\n    })\n    mapa.set('enableInfoGraph', 0)\n    const tb_controls_top = [\n      new Zoom({\n        zoomInTipLabel: window.gettext('Acercar'),\n        zoomOutTipLabel: window.gettext('Alejar')\n      }),\n      new Rotate({\n        tipLabel: window.gettext('Reiniciar rotación'),\n        label: \"⮝\"\n      }),\n      new ZoomToExtent({\n        extent: extent_local,\n        label: '',\n        tipLabel: window.gettext('Ver todo')\n      }),\n      control_layer_popup,\n      new FullScreen({\n        source: element.parent()[0],\n        tipLabel: window.gettext('Pantalla completa'),\n        label: $('<i class=\"fa fa-expand-alt\"></i>')[0]\n      }),\n      new ol_control_Toggle({\n        className: \"search-toggle\",\n        html: '<i class=\"fas fa-search-location\"></i>',\n        title: window.gettext('Buscar'),\n        bar: searcherBar\n      })\n    ];\n\n    const measurerBar = new ol_control_Bar({\n      toggleOne: true,\n      autoDeactivate: true,\n      controls: [\n        new Button({\n          html: `<i title=\"${window.gettext('Longitud')}\" >/</i>`,\n          handleClick: () => {\n            mapa.getInteractions().getArray().map((elm) => {\n              ((elm.type_ == 'Polygon') || (elm.type_ == 'LineString')) ?\n                mapa.removeInteraction(elm) :\n                null;\n            })\n            mapa.getOverlays().getArray().forEach(el => {\n\n              (el.getElement().getAttribute('class').search('ol-tooltip-static') == -1) ?\n                mapa.removeOverlay(el) : null;\n            })\n            Measurer(mapa, 'LineString')\n\n          }\n        }),\n        new Button({\n          className: 'area',\n          html: `<i title=\"${window.gettext('Superficie')}\">▟</i>`,\n          handleClick: () => {\n            mapa.getInteractions().getArray().map((elm) => {\n              ((elm.type_ == 'Polygon') || (elm.type_ == 'LineString')) ?\n                mapa.removeInteraction(elm) :\n                null;\n            })\n            mapa.getOverlays().getArray().forEach(el => {\n\n              (el.getElement().getAttribute('class').search('ol-tooltip-static') == -1) ?\n                mapa.removeOverlay(el) : null;\n            })\n            Measurer(mapa, 'area')\n          }\n\n        }),\n        new Button({\n          html: `<i title=\"${window.gettext('Eliminar')}\" class=\"fa fa-trash\"></i>`,\n          handleClick: () => {\n            deleteDrawing(mapa);\n          }\n        })\n      ]\n    });\n    tb_controls_top.push(\n      new ol_control_Toggle({\n        html: '<i class=\"fas fa-regular fa-ruler\"></i>',\n        title: window.gettext('Medir'),\n        bar: measurerBar\n      })\n    )\n    tb_controls_top.push(\n      new Button({\n        html: '<i class=\"fa fa-upload\"></i>',\n        title: window.gettext('Cargar KML/KMZ'),\n        handleClick: () => $('#fileElem').click(),\n      })\n    )\n    const handleKmlFiles = async function () {\n      const fileList = this.files;\n      const kml_layers = mapa.getLayers().getArray().filter(l => l.get('type_layer_locator') == 'kml_layer');\n      for (const kml_layer of kml_layers) {\n        mapa.removeLayer(kml_layer);\n      }\n      for (const file of fileList) {\n        let isKml = false;\n        const reader = new FileReader();\n        reader.onloadend = async function (e) {\n          const dataURL = e.target.result;\n          const encode_data = dataURL.split(',')[1];\n          if (file.name.includes('.kml')) {\n            isKml = true;\n            zip.file(file.name, encode_data, { base64: true });\n          }\n          const kmz_format = new KMZ({\n            extractStyles: true,\n            extractAttributes: true\n          });\n          const f = await kmz_format.readFeatures(encode_data, { dataProjection: 'EPSG:4326', featureProjection: window.epsg }, isKml)\n          const vectorSource = new VectorSource({ features: f });\n          const vectorLayer = new VectorLayer({\n            source: vectorSource,\n            zIndex: Infinity,\n            type_layer_locator: 'kml_layer',\n          })\n          mapa.addLayer(vectorLayer);\n        }\n        if (!file)\n          return;\n        reader.readAsDataURL(file);\n      }\n    }\n    $('#fileElem')[0].addEventListener(\"change\", handleKmlFiles, false);\n    if (window.site_cfg.extra?.cutting_mask) {\n      const recortarToggle = new ol_control_Toggle({\n        className: 'recortar-toggle', // clase CSS\n        title: window.gettext('Recortar'),\n        html: `<i class=\"fa-solid fa-scissors\"></i>`,\n        onToggle: value => mapa.set('recortar_activo', value),\n      })\n      tb_controls_top.push(recortarToggle);\n      mapa.on('change:recortar_activo', () => {\n        const { capas } = getVisibleLayers_set(cfg?.pagelayer_set);\n        const capas_id = capas.map(plyr => plyr.id);\n        const layerObjectVisible = mapa.get('layerObjects')\n          .filter(layerObject => capas_id.includes(layerObject._pageLayer.id));\n        const maskId = mapa.get('recortar_activo') ? window.site_cfg.extra.cutting_mask : null;\n        for (const layerObject of layerObjectVisible)\n          layerObject._ol_layer?.getSource().updateParams({ mask_id: maskId });\n      })\n      mapa.set('recortar_activo', false);\n    }\n    if (cfg.time_type.locator !== '0') {\n      tb_controls_top.push(new MapAnimation({\n        fa: 'fa fa-play-circle',\n        config: timeline_config,\n        title: window.gettext('Animación'),\n        cfg: cfg,\n        mapa: mapa,\n      }))\n    }\n    if (dyn && dyn.simulationtype.locator) {\n      mapa.set('simulation_id', dyn.id);\n      const controls = [];\n      const ro = dyn.relations.includes('READONLY');\n      const rw = dyn.relations.includes('EDIT');\n      if (rw) controls.push(\n        new NewLaunchControl({\n          action: 'launch',\n          id: dyn.id,\n          fa: 'play',\n          title: window.gettext('Lanzar simulación')\n        }));\n      if (ro || rw) controls.push(new ActControl({\n        action: 'info',\n        id: dyn.id,\n        fa: 'fa fa-info',\n        title: window.gettext('Información')\n      }));\n      if (rw) controls.push(new ActControl({\n        action: 'edit',\n        id: dyn.id,\n        fa: 'fa fa-edit',\n        title: window.gettext('Editar')\n      }));\n      if (rw) controls.push(new ActControl({\n        action: 'share',\n        id: dyn.id,\n        fa: 'fa fa-user-plus',\n        title: window.gettext('Compartir')\n      }));\n      if (rw) controls.push(new ActControl({\n        action: 'lock',\n        id: dyn.id,\n        fa: 'fa fa-lock',\n        title: window.gettext('Bloquear')\n      }));\n      if ((cfg.extra.report_sim ?? true)\n        && (ro || rw)) controls.push(new ActControl({\n          action: 'report',\n          id: dyn.id,\n          fa: 'fas fa-book',\n          title: window.gettext('Informe')\n        }));\n      if (ro || rw) controls.push(new ActControl({\n        action: 'clone',\n        id: dyn.id,\n        fa: 'fas fa-copy',\n        title: window.gettext('Clonar')\n      }));\n      const sub1 = new ol_control_Bar({\n        toggleOne: true,\n        autoDeactivate: true,\n        controls: controls,\n      });\n      tb_controls_top.push(\n        new ol_control_Toggle({\n          title: window.gettext('Simulación'),\n          html: '<i class=\"fab fa-gripfire\"></i>',\n          bar: sub1\n        })\n      );\n    }\n    if (interactive_map && window.timelinectl) {\n      tb_controls_top.push(\n        new Button({\n          className: \"mosaico\",\n          html: '<i class=\"fas fa-grip-horizontal\"></i>',\n          title: window.gettext('Crear mosaico'),\n          handleClick: function () {\n            const bbox_map = transformExtent(mapa.getView().calculateExtent(), window.epsg, 'EPSG:4326');\n            const intersection = getIntersection(cfg.extent, bbox_map);\n            const page_opt = {\n              pagelayer_set: [],\n              extent: intersection,\n              content_model: cfg.page_type_locator,\n              time_type: cfg.time_type,\n              id: cfg.id\n            }\n            const url = new URL(window.Urls.page_mosaic(cfg.id), window.location);\n            const sp = url.searchParams;\n            const visible_layers = getParameterByName('visible_layers');\n            for (const lyr of mapa.getAllLayers()) {\n              if (!lyr.getVisible())\n                continue\n              const layerOpacity = lyr.getOpacity();\n              if (layerOpacity !== 1)\n                sp.set(`layerOpacity${lyr.get('simmer_id')}`, layerOpacity)\n            }\n            sp.set('extent', page_opt.extent.join(','));\n            sp.set('visible_layers', visible_layers);\n            sp.set('id', cfg.id);\n            if (ns.simulation_id)\n              sp.set('simulation_id', ns.simulation_id);\n            if (mapa.get('recortar_activo')) {\n              const trim_mask_id = window.site_cfg.extra.cutting_mask;\n              sp.set('trim_mask_id', trim_mask_id);\n            }\n            const dimensions = mapa.get('dimension_controls');\n            if (dimensions) {\n              const { ...map_dimensions } = dimensions;\n              delete map_dimensions.HORIZON;\n              for (const [k, dim] of Object.entries(map_dimensions))\n                sp.set(k, dim.value);\n            }\n            const win = window.open(url);\n            win.opt = page_opt;\n          }\n        })\n      )\n    }\n    if (interactive_map) {\n      const sub1 = new ol_control_Bar({\n        toggleOne: true,\n        autoDeactivate: true,\n        controls: [\n          createExportButton(mapa, cfg, { icon: '<i class=\"fas fa-file-image\"></i>', title: 'Exportar a GeoTIFF/Gpkg', type: 'tif' }),\n          createExportButton(mapa, cfg, { icon: '<i class=\"fas fa-file\"></i>', title: 'Exportar a ASCII', toASCII: true, type: 'tif' }),\n          createExportButton(mapa, cfg, { icon: '<i class=\"fa fa-print\"></i>', title: 'Exportar a PDF', type: 'pdf' }),\n          createExportButton(mapa, cfg, { icon: '<i class=\"fa-solid fa-image\"></i>', title: 'Exportar a PNG', type: 'png' }),\n          createExportButton(mapa, cfg, { icon: '<i class=\"fa-solid fa-earth-africa\"></i>', title: 'Exportar a KML', type: 'kml' }),\n        ]\n      }\n      )\n      tb_controls_top.push(\n        new ol_control_Toggle({\n          title: window.gettext('Exportar'),\n          html: '<i class=\"fas fa-download\"></i>',\n          bar: sub1\n        })\n      );\n      tb_controls_top.push(\n        new Button({\n          html: '<i class=\"fa fa-arrows-rotate\"></i>',\n          title: window.gettext('Refrescar mapa'),\n          handleClick: () => {\n            const legs_visible = $(`.legend-dialog img.legend`).filter(\":visible\");\n            const slidecontainers = $('.mostrar-capa.selector .slidecontainer').filter(\":visible\")\n            const pos_legs = [], dims = {}, layers_opacity = []\n            const data = {\n              date: window.timelinectl.timeline.getCustomTime('current').toISOString(),\n              extent: transformExtent(mapa.getView().calculateExtent(), window.epsg, 'EPSG:4326'),\n            }\n            for (const l of legs_visible) {\n              const pos = $(l).dialog('option', 'position')\n              pos_legs.push({\n                id: l.id,\n                at: pos.at,\n                my: pos.my,\n                mytarget: mapa.get('target') == pos.of,\n              })\n            }\n            if (pos_legs.length)\n              data.pos_legs = JSON.stringify(pos_legs)\n            const { ...map_dimensions } = mapa.get('dimension_controls');\n            delete map_dimensions.HORIZON;\n            for (const [k, dim] of Object.entries(map_dimensions))\n              dims[k] = dim.value;\n            if (dims)\n              data.reloaded_dims = JSON.stringify(dims)\n            for (const slideCont of slidecontainers) {\n              layers_opacity.push({\n                id: $(slideCont).closest('.mostrar-capa.selector').attr('id_layer'),\n                value: $(slideCont).find('input').val()\n              })\n            }\n            if (layers_opacity.length)\n              data.layers_opacity = JSON.stringify(layers_opacity);\n            if (data.recortar_activo)\n              data.recortar_activo = JSON.stringify(mapa.get('recortar_activo'));\n            reloadWithParams(data)\n          }\n        })\n      )\n    }\n    tb_controls_top.push(\n      new ol_control_Toggle({\n        className: \"ol-3d\",\n        html: '<i class=\"fa-solid fa-cube\"></i>',\n        title: window.gettext('Vista 3D'),\n        onToggle: function () {\n          let ol3d = mapa.get('ol3d');\n          if (!ol3d) {\n            ol3d = new OLCesium({ map: mapa });\n            const scene = ol3d.getCesiumScene();\n            Cesium.createWorldTerrainAsync().then(tp => scene.terrainProvider = tp);\n            // truqui para que se vean los controles\n            // https://github.com/openlayers/ol-cesium/issues/1016\n            const olContainerDiv = document.querySelector(\".ol-overlaycontainer-stopevent\");\n            olContainerDiv.style.zIndex = 1;\n            mapa.set('ol3d', ol3d);\n          }\n          ol3d.setEnabled(this.getActive());\n        }\n      })\n    );\n    tb_controls_top.forEach(mainbar_top.addControl, mainbar_top);\n    tb_controls_bottom.forEach(infobar_bottom.addControl, infobar_bottom);\n    mapa.addControl(mainbar_top);\n    mapa.addControl(infobar_bottom);\n    tb_controls_top.map((control) => {\n      if (control instanceof ol_control_Toggle)\n        $(control.button_).on('click', () => control_layer_popup.hide())\n    })\n  }\n  ns.mapas.push(mapa);\n  ns.mapa = mapa;\n  view.fit(extent_local, { constrainResolution: interactive_map });\n  if (cfg.extra?.floating_legend)\n    mapa.set('floating_legend', true)\n  if (cfg.extra?.closed_tree)\n    mapa.set('closed_tree', true)\n  if (cfg.extra?.graph_show_run_time)\n    mapa.set('graph_show_run_time', true)\n  for (const attr of ['pos_legs', 'reloaded_dims', 'layers_opacity'])\n    if (attr in sessionStorage) {\n      const value = JSON.parse(sessionStorage.getItem(attr));\n      sessionStorage.removeItem(attr);\n      mapa.set(attr, value);\n    }\n  const map_dimensions = mapa.get('dimension_controls');\n  crearControlesDimensiones(mapa, map_dimensions, cfg.dimensions);\n  setUpContextMenu(ns);\n  for (const pagelayer of cfg.pagelayer_set) {\n    await crearCapa(\n      ns,\n      mapa,\n      pagelayer,\n      extent_local,\n      interactive_map,\n      cfg.time_delta,\n      cfg.extra\n    );\n  }\n\n  const attr = 'recortar_activo';\n  if (attr in sessionStorage) {\n    const jsValue = sessionStorage.getItem(attr);\n    sessionStorage.removeItem(attr);\n    if (jsValue !== 'undefined') {\n      const value = JSON.parse(jsValue);\n      mapa.set(attr, value);\n    }\n  }\n  if (interactive_map) {\n    document.getElementsByClassName('ol-attribution')[0].addEventListener('pointerdown', (e) => { e.preventDefault(); e.stopPropagation() }, false);\n    document.getElementsByClassName('ol-overviewmap')[0].getElementsByTagName('button')[0].addEventListener('pointerdown', function (evt) {\n      evt.preventDefault(); evt.stopPropagation()\n    }, false);\n    mapa.on('change:notification', function () {\n      const txt = this.get('notification');\n      if (txt) notification.show(txt, -1);\n      else notification.hide();\n    });\n\n    mapa.on('change:sidebar_toggle', function () {\n      sidebar_toggle.setActive(this.get('sidebar_toggle'));\n      this.get('sidebar_toggle') ? sidebar.show() : sidebar.hide();\n    });\n\n    mapa.on('singleclick', evt => evt.map.set('info', evt));\n    const info = $('#info');\n    const gc = new GraphControl(\n      info,\n      null,\n      cfg.extra?.groupGraphics,\n      cfg.extra?.print_pluma,\n    )\n    gc.threshold = cfg.extra?.threshold || 40;\n    mousePosition.on('change:coordStringFunction',\n      function () {\n        gc.coordXY = this.get('coordStringFunction');\n      })\n    mapa.on('change:dimension_controls',\n      function () {\n        const evt = this.get('dimension_controls');\n        if (evt === undefined)\n          return;\n        const info = $('#element-info');\n        if (info.is(':visible')) {\n          const this_ = mapa.get('lastInfoElem');\n          $(this_).click();\n        }\n        const newActiveDimensions = {};\n        for (const ctl of Object.values(evt)) {\n          newActiveDimensions[ctl.id] = [[ctl.value, ctl.caption]];\n        }\n        gc.set('activeDimensions', newActiveDimensions);\n      });\n    const buttons = [];\n    if (cfg.extra?.new_tab !== false)\n      buttons.push(\n        {\n          html: '<i class=\"fas fa-external-link-alt\"></i>',\n          title: window.gettext('Abrir en solapa'),\n          click: () => openNewWindow(gc, window.Urls.page_graph(ns.page_id))\n        }\n      )\n    if (cfg.extra?.graphic_pdf !== false)\n      buttons.push(\n        {\n          html: '<i class=\"fas fa-print\"></i>',\n          title: window.gettext('Imprimir informe'),\n          click: () => openNewWindow(gc, window.Urls.info_punto_pdf())\n        }\n      )\n    info.dialog({\n      appendTo: mapa.getTargetElement(),\n      autoOpen: false,\n      buttons: buttons,\n      maxHeight: window.innerHeight * 6 / 7,\n      width: 'auto',\n      close: function (event) {\n        if (event && event.originalEvent) {\n          mapa.unset('info', true);\n          gc.unset('activeDimensions');\n          gc.unset('type', true);\n        }\n      },\n    });\n    const marker_infoPunto = getMarkerVectorLayer([], '/media/uploads/site/map-marker-solid.svg');\n    info.on(\"dialogopen\", function () {\n      $(this).parent().css('width', 'auto');\n      mapa.addLayer(marker_infoPunto);\n    });\n    info.on(\"dialogclose\", function () {\n      mapa.removeLayer(marker_infoPunto);\n    });\n    mapa.addControl(gc);\n    gc.on('change:state', function () {\n      if (gc.get('state') == 'ok' && !info.dialog('isOpen')) {\n        const maxHeight = info.dialog('option', 'maxHeight');\n        const has_table = gc.info_tabla.length ? 1 : 0;\n        info.dialog('option', 'width', 'auto');\n        info.dialog('option', 'height',\n          Math.min(maxHeight,\n            gc.targets.length ? 300 * gc.targets.length + 50 * has_table\n              : 300));\n        info.dialog('open');\n      }\n    })\n\n    gc.on('change:can_be_grouped', function () {\n      const hasButton = $('#group').length > 0;\n      const mustHaveButton = gc.get('can_be_grouped');\n      if (hasButton === mustHaveButton)\n        return;\n      let buttons = info.dialog(\"option\", \"buttons\");\n      if (mustHaveButton) {\n        const groupButton = {\n          id: 'group',\n          html: '<i class=\"fa-kit fa-graph-multi\"></i>',\n          title: window.gettext('Agrupar/Desagrupar gráficas'),\n          click: function () {\n            info.dialog('close');\n            gc.group_by_unit = !gc.group_by_unit;\n            gc.redraw();\n          },\n        };\n        buttons.splice(0, 0, groupButton);\n      } else {\n        buttons = buttons.filter(b => b.id !== 'group');\n      }\n      info.dialog(\"option\", \"buttons\", buttons); // setter\n    })\n\n    gc.on('change:con_pluma', function () {\n      const hasButton = $('#show-dim-selector').length > 0;\n      const mustHaveButton = gc.get('con_pluma');\n      if (hasButton === mustHaveButton)\n        return;\n      let buttons = info.dialog(\"option\", \"buttons\");\n      if (mustHaveButton) {\n        /*\n        const groupButton = {\n          html: '<i id=\"con_pluma\" class=\"fas fa-feather\"></i>',\n          title: window.gettext('Mostrar plumas'),\n          click: () => create_graph_control(mapa, gc.poi),\n        };\n        buttons.splice(0, 0, groupButton);\n        */\n        const dimsButton = {\n          html: '<i id=\"show-dim-selector\" class=\"fas fa-solid fa-cubes\"></i>',\n          title: window.gettext('Seleccionar combinaciones de series'),\n          click: () => this.showDimSelector()\n        };\n        buttons.splice(0, 0, dimsButton);\n        const boxPlotButton = {\n          id: 'boxplot',\n          html: '<i class=\"fa-solid fa-chart-column\"></i>',\n          title: window.gettext('Mostrar boxplot (diagrama de caja)'),\n          click: function () {\n            let active = gc.get('type');\n            if (active) {\n              gc.unset('type');\n            } else {\n              gc.set('type', 'box');\n            }\n            active = gc.get('type');\n            const button = info.parent().find('#boxplot');\n            button.toggleClass('active', active)\n          }\n        };\n        const active = gc.get('type');\n        if (active)\n          boxPlotButton.classes = { \"ui-button\": \"ui-corner-all active\" };\n        buttons.splice(0, 0, boxPlotButton);\n      } else {\n        buttons = buttons.filter(b => !['show-dim-selector', 'boxplot'].includes(b.id));\n      }\n      info.dialog(\"option\", \"buttons\", buttons); // setter\n    })\n    gc.on('change:can_export2Excel', function () {\n      const can_export2Excel = this.get('can_export2Excel');\n      let buttons = info.dialog(\"option\", \"buttons\");\n      if (can_export2Excel) {\n        buttons.push({\n          id: 'can_export2Excel',\n          html: '<i class=\"fa fa-table\"></i>',\n          title: window.gettext('Exportar a Excel'),\n          click: () => gc.toExcel(),\n        });\n      }\n      else {\n        buttons = buttons.filter(b => b.id !== 'can_export2Excel');\n      }\n      info.dialog(\"option\", \"buttons\", buttons);\n    })\n    gc.on('change:multiRun', function () {\n      const id = 'multi-run'\n      const multiRun = this.get('multiRun');\n      let buttons = info.dialog(\"option\", \"buttons\");\n      if (multiRun) {\n        buttons.push({\n          id,\n          html: '<i class=\"fa-solid fa-person-running\"></i>',\n          title: window.gettext('Ver múltiples pasadas del día'),\n          click: () => gc.showMultiRun = !gc.showMultiRun,\n        });\n      }\n      else {\n        buttons = buttons.filter(b => b.id !== id);\n      }\n      info.dialog(\"option\", \"buttons\", buttons);\n    })\n    mapa.on('change:info',\n      function () {\n        if (this.get('isDrawing'))\n          return;\n        const evt = this.get('info');\n        ns.page.find('div.info_grafica').empty();\n        ns.page.find('div.info_tabla tbody').empty();\n        ns.page.find('div.info_elem').empty();\n        info.dialog({ autoOpen: false });\n        info.dialog('close');\n        mapa.set('info', evt, true);\n        if (evt) {\n          const marker_feature = marker_infoPunto.getSource().getFeatures()[0];\n          marker_feature.setGeometry(new Point(evt.coordinate));\n          requestInfo2(evt, gc);\n        }\n      });\n    /**\n     * Format length output.\n     * @param {LineString} line The line.\n     * @return {string} The formatted length.\n    */\n    const formatLength = function (line) {\n      const length = getLength(line, { projection: window.epsg });\n      return (length > 1000) ?\n        numeric_lang_format((length / 1000).toFixed(2)) + ' km' : numeric_lang_format(length.toFixed(2)) + ' m';\n    };\n    /**\n   * Format area output.\n   * @param {Polygon} polygon The polygon.\n   * @return {string} Formatted area.\n   */\n    const formatArea = function (polygon) {\n      const area = getArea(polygon, { projection: window.epsg, radius: 6371000 });\n      return (area > 100000) ?\n        `${numeric_lang_format((area / 1000000).toFixed(2))} km<sup>2</sup> - ${numeric_lang_format((area / 10000).toFixed(2))} ha`\n        : numeric_lang_format(area.toFixed(2)) + ' m<sup>2</sup>';\n    };\n    const refrescaEtiqueta = function (geom) {\n      let output, tooltipCoord;\n      if (!measureTooltip) {\n        measureTooltipElement = document.createElement('div');\n        measureTooltipElement.className = 'ol-tooltip ol-tooltip-static';\n        measureTooltip = new Overlay({\n          element: measureTooltipElement,\n          offset: [0, -7],\n          positioning: 'bottom-center'\n        });\n        mapa.addOverlay(measureTooltip);\n      }\n      if (!measureTooltip.getMap())\n        mapa.addOverlay(measureTooltip);\n      if (geom instanceof Polygon) {\n        output = formatArea(geom);\n        tooltipCoord = geom.getInteriorPoint().getCoordinates();\n      } else if (geom instanceof LineString) {\n        output = formatLength(geom);\n        tooltipCoord = geom.getLastCoordinate();\n      } else if (geom instanceof MultiLineString) {\n        output = formatLength(geom);\n        tooltipCoord = geom.getLastCoordinate();\n      } else if (geom instanceof MultiPolygon) {\n        output = formatArea(geom);\n        tooltipCoord = geom.getFlatInteriorPoints();\n        tooltipCoord = [tooltipCoord[0], tooltipCoord[1]];\n      }\n      measureTooltipElement.innerHTML = output;\n      measureTooltip.setPosition(tooltipCoord);\n    }\n    mapa.on('change:new_feature', function () {\n      mapa.set('edit_feature', null);\n      if (draw)\n        mapa.removeInteraction(draw);\n      draw = new Draw({\n        source: srcElementEdit,\n        type: mapa.get('new_feature'),\n        stopClick: true,\n      });\n      /**\n  * The measure tooltip element.\n  * @type {HTMLElement}\n  */\n      if (measureTooltipElement) {\n        measureTooltipElement.parentNode.removeChild(measureTooltipElement);\n      }\n      measureTooltipElement = document.createElement('div');\n      measureTooltipElement.className = 'ol-tooltip ol-tooltip-measure';\n      measureTooltip = new Overlay({\n        element: measureTooltipElement,\n        offset: [0, -15],\n        positioning: 'bottom-center'\n      });\n      mapa.addOverlay(measureTooltip);\n      draw.on('drawstart',\n        function (evt) {\n          // set sketch\n          let sketch = evt.feature;\n          /** @type {import(\"ol/coordinate.js\").Coordinate|undefined} */\n          let listener = sketch.getGeometry().on('change', function (evt) {\n            let geom = evt.target;\n            refrescaEtiqueta(geom);\n          });\n          draw.on('drawend', function (e) {\n            this.setActive(false);\n            mapa.set('edit_feature', e.feature);\n            measureTooltipElement.className = 'ol-tooltip ol-tooltip-static';\n            measureTooltip.setOffset([0, -7]);\n            unByKey(listener);\n          })\n        });\n      mapa.addInteraction(draw);\n      mapa.set('new_feature', null, true);\n    });\n    mapa.on('change:edit_feature', function (evt) {\n      if (this.get('edit_feature')) {\n        mapa.addInteraction(modify);\n        mapa.addInteraction(trans);\n        /** @type {import(\"ol/coordinate.js\").Coordinate|undefined} */\n        let sketch = this.get('edit_feature');\n        modify.on('modifystart', function (e) {\n          sketch = e.features.getArray()[0];\n          sketch.getGeometry().on('change', function (evt) {\n            let geom = evt.target;\n            refrescaEtiqueta(geom);\n          });\n        });\n        trans.on('rotateend', function (e) {\n          let geom = e.feature.getGeometry();\n          refrescaEtiqueta(geom);\n        });\n        trans.on('scaleend', function (e) {\n          let geom = e.feature.getGeometry();\n          refrescaEtiqueta(geom);\n        });\n        trans.on('translateend', function (e) {\n          let geom = e.feature.getGeometry();\n          refrescaEtiqueta(geom);\n        });\n      }\n      if (this.get('edit_feature') && !draw) {\n        srcElementEdit.addFeature(this.get('edit_feature'));\n      }\n      if (draw) {\n        draw.setActive(false);\n        mapa.removeInteraction(draw);\n        draw = null;\n      }\n      if (evt.oldValue) {\n        srcElementEdit.removeFeature(evt.oldValue);\n        mapa.removeOverlay(measureTooltip);\n        mapa.getOverlays().getArray().forEach(el => {\n          (el.getElement().getAttribute('class').search('ol-tooltip-static') != -1) ?\n            mapa.removeOverlay(el) : null;\n        })\n        mapa.removeInteraction(modify);\n        mapa.removeInteraction(trans);\n      }\n    });\n  }\n  if (interactive_map) {\n    $('.ol-overlay').on('scroll', repositionTooltips);\n  }\n  if (interactive_map && window.timelinectl)\n    setCurrentValue(dayjs(window.timelinectl.timeline.getCustomTime('current')));\n  if (window.timelinectl) {\n    if (map_dimensions && timeline_config && timeline_config.time_type.startsWith('ENUM'))\n      map_dimensions['HORIZON'] = { options: Object.keys(timeline_config.marks) };\n  }\n\n  return mapa;\n}\n\nfunction reloadWithParams(params) {\n  for (const key in params) {\n    sessionStorage.setItem(key, params[key]);\n  }\n  window.location.reload();\n}\n\nfunction coordSearchInput(coordInput, mapa, extent_local, alertOverlay) {\n\n  const this_ = {\n    mapa: mapa,\n    extent: extent_local,\n    overlay: alertOverlay,\n    element: coordInput\n  }\n  this_.getMarkerVectorLayer = getMarkerVectorLayer\n\n  coordInput.element.getElementsByClassName('goCoord').goCoord.addEventListener(\n    'click', function () {\n\n      const element = $(this.element.element);\n      const { srcproj, xlong, ylat } = getFormCoords(element);\n      const destProj = proj4(this.mapa.getView().getProjection().getCode());\n      const xy = proj4(srcproj, destProj, [xlong, ylat])\n      if (containsCoordinate(this.extent, xy)) {\n        this.mapa.addLayer(this.getMarkerVectorLayer(xy, '/media/uploads/site/location_pin.png'))\n        this.mapa.getView().animate({\n          center: xy,\n          zoom: Math.max(this.mapa.getView().getZoom(), 14)\n        })\n      }\n      else {\n        this.overlay.show(`<div><p>\n        ${window.gettext('La coordenada introducida no se encuentra en la extensión del mapa o no existe...')}\n        </p></div>`);\n        setTimeout(() => {\n          this.overlay.hide();\n        }, 5000)\n      }\n\n    }.bind(this_), false);\n\n  coordInput.element.getElementsByClassName('reset').reset.addEventListener('click', function () {\n    const element = $(this.element.element);\n    element.find('.combo-coord input').removeAttr(\"value\");\n    element.find('.combo-coord input').val('');\n    this.element.hide();\n    // FIXME: Esto es muy poco elegante\n    const mapa = this.mapa;\n    const len = mapa.getLayers().getLength();\n    for (let i = len - 1; i >= 0; i--) {\n      if (mapa.getLayers().getArray()[i].get('title') == 'Marker') {\n        mapa.removeLayer(mapa.getLayers().getArray()[i])\n      }\n    }\n  }.bind(this_), false)\n  coordInput.toggle();\n}\n\nfunction infoElement() {\n  const infoli = document.createElement('li');\n  infoli.innerHTML = '';\n  const infoul = document.createElement('ul');\n  infoul.appendChild(infoli);\n\n  return infoul;\n}\n\nfunction coordInputElement() {\n  let coordForm = $('<form/>');\n  coordForm.html(\n    `<div id=\"latlon\">\n    <div> <label for=\"xlong\">X|Long :</label> <input type=\"number\" id=\"xlong\" /></div>\n    <div><label for=\"ylat\">Y|Lat :</label><input type=\"number\" id=\"ylat\" /></div>\n    <div title=\"${window.gettext('Seleccionar proyección')}\" id=\"projection\" class=\"seleccionable combo-coord\"><input type=\"text\" data-input readonly=\"readonly\">\n    <i class=\"fas fa-sort-down\"></i>\n    <div class=\"chProj combo dropdown\">\n    <ul class=\"dropdown-content\" id=\"chProj\"></ul></div>\n    </div>\n    <button type=\"button\" title=\"${window.gettext('Ir')}\" class=\"goCoord\" id=\"goCoord\" ><i class=\"fa fa-caret-right\"></i></button>\n    <button type=\"reset\" title=\"${window.gettext('Borrar')}\" class=\"reset\" id=\"reset\" ><i class=\"fas fa-times\"></i></button>\n    </div>\n\n    <div id=\"DMS\">\n    <div id=\"lat\"><label for=\"lat\">Lat :</label>\n      <div><input type=\"number\" id=\"degrees\" /><label for=\"degrees\"> °</label></div>\n      <div><input type=\"number\" id=\"mins\" /><label for=\"mins\"> '</label></div>\n      <div><input type=\"number\" id=\"segs\" /><label for=\"segs\"> ''</label></div>\n      <div title=\"${window.gettext('Seleccionar dirección')}\" id=\"direction\" class=\"seleccionable combo-coord\"><input type=\"text\" data-input value=\"N\" readonly=\"readonly\">\n      <i class=\"fas fa-sort-down\"></i>\n      <div class=\"chProj combo dropdown\">\n      <ul class=\"dropdown-content\" id=\"chProj\">\n        <li value=\"N\" class=\"select\">N</li>\n        <li value=\"S\">S</li>\n      </ul></div>\n      </div>\n    </div>\n    <div id=\"long\"><label for=\"long\">Long :</label>\n      <div><input type=\"number\" id=\"degrees\" /><label for=\"degrees\"> °</label></div>\n      <div><input type=\"number\" id=\"mins\" /><label for=\"mins\"> '</label></div>\n      <div><input type=\"number\" id=\"segs\" /><label for=\"segs\"> ''</label></div>\n      <div title=\"${window.gettext('Seleccionar dirección')}\" id=\"direction\" class=\"seleccionable combo-coord\"><input type=\"text\" data-input value=\"W\" readonly=\"readonly\">\n      <i class=\"fas fa-sort-down\"></i>\n      <div class=\"chProj combo dropdown\">\n      <ul class=\"dropdown-content\" id=\"chProj\">\n        <li value=\"E\">E</li>\n        <li value=\"W\" class=\"select\">W</li>\n      </ul></div>\n      </div>\n    </div>\n    </div>`);\n  coordForm.find('div.combo-coord input').val();\n  for (const ep of window.site_cfg.site_epsgs) {\n    if (ep.code.endsWith(':DMS'))\n      continue;\n    const li = $(`<li value =\"${ep.code}\"></li>`)\n    li.text(ep.name + ' - ' + ep.code);\n    if (ep.code == window.epsg) {\n      li.addClass('select');\n      coordForm.find('div#projection input').val(li.text());\n      coordForm.find('div#projection input').attr('value', li.attr('value'));\n    }\n    coordForm.find('#latlon ul#chProj').append(li)\n  }\n  coordForm.find('div.combo-coord').click(function () {\n    $(this).find('div.dropdown').toggleClass('listshown');\n  })\n  coordForm.find('li').click(function () {\n    const input = $(this).parents('div.combo-coord').find('input');\n    input.val($(this).text());\n    input.attr('value', $(this).attr('value'))\n    $(this).parent().find('.select').removeClass('select')\n    $(this).addClass(\"select\");\n  })\n  return coordForm[0]\n}\n\nfunction geosearch(extent, extent_local, alertOverlay) {\n\n  let search;\n  if (window.geoservice == 'NOMINATIM') {\n    const viewbox = Array([extent[0], extent[1]], [extent[2], extent[3]]);\n\n    search = new searchNominatim(\n      {\n        label: window.gettext('Buscar lugar'),\n        placeholder: `${window.gettext('Buscar')}...`,\n        noCollapse: true,\n        bounded: true,\n        viewbox: viewbox\n      })\n\n  }\n  else {\n    search = new ol_control_SearchES(\n      {\n        label: window.gettext('Buscar lugar'),\n        placeholder: `${window.gettext('Buscar')}...`,\n        dataType: 'jsonp',\n        noCollapse: true,\n        viewbox: extent_local,\n        alertmsg: alertOverlay,\n        url: ['https://www.idee.es/communicationsPoolServlet/SearchAssistant',\n          'https://www.cartociudad.es/geocoder/api/geocoder/candidatesJsonp'],\n        handleResponse: function (response) {\n          return JSON.parse(response.slice(9, -1))\n        }\n      })\n  }\n\n  search.button.innerHTML = '<i class=\"fas fa-search\"></i>'\n  search.clearHistory();\n  reset(search);\n\n  search.on('select', function (e) {\n    if (containsCoordinate(extent_local, e.coordinate)) {\n      const mapa = this.getMap();\n      mapa.getView().animate({\n        center: e.coordinate,\n        zoom: Math.max(mapa.getView().getZoom(), 14)\n      });\n      mapa.addLayer(getMarkerVectorLayer(e.coordinate, '/media/uploads/site/location_pin.png'));\n    }\n    else {\n      e.target.setInput('');\n      e.target.cont = -1;\n      e.target.drawList_(e.target.getHistory());\n      alertOverlay.show('<div><p>' + window.gettext('La dirección seleccionada no se encuentra en la extensión del mapa...') + '</p></div>');\n      setTimeout(() => {\n        alertOverlay.hide();\n      }, 5000)\n    }\n  });\n\n  return search\n}\n\nfunction reset(search) {\n  const reset = document.createElement('button');\n  reset.className = 'reset-button';\n  reset.innerHTML = `<a title = \"${window.gettext('Borrar')}\" class=\"reset\"><i class=\"fas fa-times\"></i></a>`;\n  search.element.appendChild(reset);\n  reset.addEventListener('click', function (e) {\n    e.preventDefault();\n    e.stopPropagation();\n    if (!this.getInputField().value) {\n      this.element.classList.toggle(\"ol-collapsed\");\n    }\n    else {\n      this.setInput('');\n      this.cont = -1;\n      this.drawList_(this.getHistory())\n      // FIXME: poco elegante\n      const len = this.getMap().getLayers().getLength();\n      for (let i = len - 1; i >= 0; i--) {\n        if (this.getMap().getLayers().getArray()[i].get('title') == 'Marker') {\n          this.getMap().removeLayer(this.getMap().getLayers().getArray()[i])\n        }\n      }\n    }\n  }.bind(search), false)\n}\nfunction getMarkerVectorLayer(xy, src_path) {\n  const marker = new Feature({\n    geometry: new Point(xy),\n  });\n  const styles = getComputedStyle(document.body);\n  const color_marker = styles.getPropertyValue('--main-color').trim();\n  const iconStyle = new Style({\n    image: new Icon({\n      color: color_marker,\n      crossOrigin: 'anonymous',\n      anchorOrigin: 'bottom-left',\n      anchor: [0.5, 0],\n      anchorXUnits: 'fraction',\n      anchorYUnits: 'fraction',\n      src: src_path,\n      scale: 0.5\n    })\n  });\n  marker.setStyle(iconStyle);\n  const vectorSource = new VectorSource({\n    features: [marker]\n  });\n  const markerVectorLayer = new VectorLayer({\n    source: vectorSource,\n    title: 'Marker',\n    displayInLayerSwitcher: false\n  });\n  markerVectorLayer.setZIndex(Infinity);\n  return markerVectorLayer;\n}\n\n\nObject.assign(LAYERTYPES, {\n  SAVER: SaverElementsLayer,\n  OSM: OSMLayer,\n  WMS: WMSLayer,\n  WMSFLOW: WMSFlowLayer,\n  WMTS: WMTSLayer,\n  Bing: BingLayer,\n  XYZ: XYZLayer,\n});\n\n\nasync function crearCapa(ns, mapa, pageLayer, extent_local, interactive_map, time_delta, extra) {\n  let factory_name = pageLayer.layer.service.servicetype.name;\n  if (!(factory_name in LAYERTYPES)) {\n    console.warn('No hay factoría para capa:');\n    console.warn(pageLayer.layer);\n    factory_name = 'WMS'; // ficticio\n  }\n  const layerClass = LAYERTYPES[factory_name];\n  const layerObject = new layerClass(ns, pageLayer, time_delta, interactive_map);\n  if (extra?.closed_tree)\n    mapa.set('closed_tree', true);\n  try {\n    await layerObject.crearCapaOL(mapa, extent_local, interactive_map);\n  } catch (error) {\n    console.error(error);\n  }\n  if (mapa)\n    mapa.get('layerObjects').push(layerObject);\n  return layerObject;\n}\n\n\nfunction deleteDrawing(mapa) {\n  for (let i = (mapa.getLayers().getLength() - 1); i >= 0; i--) {\n    if (mapa.getLayers().getArray()[i].get('title') == 'Measure')\n      mapa.removeLayer(mapa.getLayers().getArray()[i]);\n  }\n  mapa.getInteractions().getArray().map((elm) => {\n    ((elm.type_ == 'Polygon') || (elm.type_ == 'LineString')) ?\n      mapa.removeInteraction(elm) :\n      null;\n  })\n  while (mapa.getOverlays().getLength()) {\n    mapa.getOverlays().getArray().forEach(el => { mapa.removeOverlay(el) });\n  }\n}\nfunction createOriginPoint(feat, mapa, prop_id, win) {\n  const tableId = '#create-origin';\n  const featProj = $('#fast-simulation-edit-dialog').find('select#projection').val();\n  $(tableId)\n    .find(\"textarea[name='simulation_id']\")\n    .val(prop_id);\n  const wkt = new WKT();\n  const geom = wkt.writeFeature(feat, {\n    dataProjection: 'EPSG:4326',\n    featureProjection: featProj\n  });\n  $(tableId + ' form .element_geometry.data_new').val(geom);\n  const formData = new FormData($(tableId + ' form')[0]);\n  $.ajax({\n    url: window.Urls.element_create(133),\n    type: 'POST',\n    data: formData,\n    success: function () {\n      $.ajax({\n        url: window.Urls.simulation_launch(prop_id),\n        method: 'POST',\n        dataType: 'json',\n        contentType: 'application/json'\n      })\n        .done(function () {\n          win.location = window.Urls.simulation_page(prop_id);\n        })\n        .fail(function () {\n          alert('error');\n        });\n    }\n  });\n}\nasync function requestInfo2(evt, gc) {\n  gc.redraw(evt);\n}\n\nfunction toggle_track(self, geolocation) {\n  const mapa = self.getMap();\n\n  let geolocationLayer = mapa.get('geolocationLayer');\n\n  const styles = getComputedStyle(document.body);\n  const color_marker = styles.getPropertyValue('--main-color').trim();\n\n  const positionFeature = new Feature();\n  const iconStyle = new Style({\n    image: new Icon({\n      color: color_marker,\n      crossOrigin: 'anonymous',\n      anchorOrigin: 'bottom-left',\n      anchor: [0.5, 0],\n      anchorXUnits: 'fraction',\n      anchorYUnits: 'fraction',\n      src: '/media/uploads/site/location_pin.png',\n      scale: 0.5\n    })\n  });\n\n  positionFeature.setStyle(iconStyle);\n\n  geolocationLayer = new VectorLayer({\n    source: new VectorSource({\n      features: [positionFeature]\n    }),\n    title: 'geomarker',\n    zIndex: Infinity,\n    displayInLayerSwitcher: false,\n    visible: true\n  })\n\n  if (self.getActive()) {\n    geolocation.setProjection(mapa.getView().getProjection());\n    geolocation.setTracking(true);\n    geolocation.on('change:position', function () {\n      const coordinates = geolocation.getPosition();\n      positionFeature.setGeometry(coordinates ?\n        new Point(coordinates) : null);\n    });\n    mapa.addLayer(geolocationLayer);\n    if (geolocation.getPosition())\n      mapa.getView().setCenter(geolocation.getPosition());\n  }\n  else {\n    geolocation.setTracking(false);\n    mapa.getLayers().getArray().map(aux => {\n      (aux.get('title') == 'geomarker') ? mapa.removeLayer(aux) : null;\n    })\n  }\n\n}\n\nclass MapAnimation extends Control {\n  constructor(opt_options) {\n    const options = opt_options || {};\n    options.fa = options.fa || 'fa fa-play-circle';\n    options.action = options.action || 'play';\n    const element = document.createElement('div');\n    element.className = 'map-animation ol-unselectable ol-control';\n    const button = document.createElement('button');\n    button.innerHTML = `<i class=\"${options.fa}\"></i>`;\n    button.title = options.title;\n    element.appendChild(button);\n    super({\n      element: element,\n      target: options.target\n    });\n    this.diff = [];\n    this.enumTime = options.config.time_type.startsWith('ENUM');\n    this.start = options.config.start;\n    this.end = options.config.end;\n    this.scale = options.config.scale;\n    this.cfg = options.cfg;\n    this.mapa = options.mapa;\n    this.options = options;\n    this.intervalSeconds = 3; // s\n    button.addEventListener('click', e => this.handleMapAnimation(e), false);\n  }\n  get interval() {\n    return this.intervalSeconds * 1000;\n  }\n  handleMapAnimation(e) {\n    if (this.options.action === 'play') {\n      this.target = e.target;\n      this.createDialog();\n    } else {\n      this.pause();\n    }\n  }\n\n  play() {\n    this.options.action = 'pause';\n    this.target.className = 'fa fa-pause-circle';\n  }\n\n  pause() {\n    this.getMap().set('animation', false);\n    this.options.action = 'play';\n    this.target.className = 'fa fa-play-circle';\n    clearTimeout(this.timeoutID);\n  }\n\n  createDialog() {\n    const enableTime = this.scale === 'hour' || this.scale === 'minute';\n    if (this.enumTime) {\n      this.diff = [];\n      this.start_date_input = $('select#start-date').empty();\n      this.end_date_input = $('select#end-date').empty();\n      const years = this.options.config.years;\n      $('input#start-date')[0].style.display = 'none';\n      $('input#end-date')[0].style.display = 'none';\n      years.forEach((year, i) => {\n        const opIn = document.createElement('option');\n        opIn.innerText = year.format('YYYY');\n        this.start_date_input.append(opIn);\n        if (i > 0) {\n          const opOut = document.createElement('option');\n          opOut.innerText = year.format('YYYY');\n          this.end_date_input.append(opOut);\n          this.diff.push(year.diff(years[i - 1], 'y'));\n        }\n      })\n      this.start_date_input.on('change', (e) => {\n        const idx = e.target.selectedIndex;\n        this.end_date_input.empty();\n        this.diff = [];\n        years.forEach((year, i) => {\n          if (i > idx) {\n            const op = document.createElement('option');\n            op.innerText = year.format('YYYY');\n            this.end_date_input.append(op);\n            this.diff.push(year.diff(years[i - 1], 'y'));\n          }\n        });\n      });\n    }\n    else {\n      if (this.start_date_input && this.end_date_input) {\n        this.start_date_input.destroy();\n        this.end_date_input.destroy();\n      }\n      this.start_date_input = this.configureCalendar(\n        $('input#start-date'),\n        dayjs(this.start),\n        enableTime\n      );\n      this.end_date_input = this.configureCalendar(\n        $('input#end-date'),\n        dayjs(this.end),\n        enableTime\n      );\n    }\n    this.showDialog();\n  }\n\n  showDialog() {\n    const self = this;\n    $('#interval').val(this.intervalSeconds);\n    $('#map-animation').dialog({\n      title: window.gettext('Animación'),\n      modal: true,\n      appendTo: this.getMap().getTargetElement(),\n      buttons: [\n        {\n          html: `<i class=\"fas fa-download\" title=\"${window.gettext(\"Exportar a gif\")}\"></i>`,\n          click: () => {\n            const visible_layers = [];\n            this.mapa.getLayers().getArray().forEach(l => {\n              if (l.getVisible() && l.get('simmer_id')) {\n                visible_layers.push(l.get('simmer_id'));\n              }\n            })\n            const bbox_max = transformExtent(this.cfg.extent, 'EPSG:4326', window.epsg);\n            const extent = this.mapa.getView().calculateExtent();\n            const intersection = getIntersection(extent, bbox_max);\n            let start, end\n            if (this.start_date_input.latestSelectedDateObj) {\n              start = dayjs(this.start_date_input.latestSelectedDateObj);\n              end = dayjs(this.end_date_input.latestSelectedDateObj);\n            }\n            else {\n              start = dayjs(this.start_date_input.val() + '-01-01T00:00:00Z');\n              end = dayjs(this.end_date_input.val() + '-01-01T00:00:00Z');\n            }\n            const distance = end.diff(start, this.scale);\n            const time_type = window.timelinectl.configure.time_type;\n            const delta_time = time_type == '10M' ? 10 : 1;\n            let params = `?ITERATIONS=${Math.floor(distance / delta_time)}&DELTA_TIME=${delta_time}&SIZE=500` +\n              '&scale=' + this.scale + '&visible_layers=' + visible_layers.join(',') +\n              '&bbox=' + String(intersection) + '&INTERVAL=' + String($('#interval').val() * 1000);\n            if (window.timelinectl)\n              params += '&date=' + start.toISOString();\n            const { ...map_dimensions } = this.mapa.get('dimension_controls');\n            delete map_dimensions.HORIZON;\n            for (const [k, dim] of Object.entries(map_dimensions))\n              params += '&' + $.param({ [k]: dim.value });\n            if (this.getMap().get('simulation_id'))\n              params += '&simulation_id=' + this.getMap().get('simulation_id');\n            window.open(window.Urls.gif_export(this.cfg.id) + params);\n          },\n        },\n        {\n          text: [window.gettext('Aceptar')],\n          click: function () {\n            self.play();\n            $(this).dialog('close');\n            self.startAnimation();\n          },\n        },\n        {\n          text: [window.gettext('Cancelar')],\n          click: function () {\n            self.pause();\n            $(this).dialog('close');\n          }\n        },\n      ],\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n      },\n    });\n    if (!this.enumTime) {\n      $('#map-animation div select').hide();\n      $('#map-animation .start-date .form-control').on('click', () => {\n        this.start_date_input.toggle(!this.start_date_input.isOpen)\n      });\n      $('#map-animation .end-date .form-control').on('click', () => {\n        this.end_date_input.toggle(!this.end_date_input.isOpen)\n      });\n    }\n  }\n\n  configureCalendar(element, date, enableTime) {\n    return flatpickr(element, {\n      defaultDate: date.format('YYYY-M-D HH:mm'),\n      enableTime,\n      dateFormat: 'Y-m-dTH:i',\n      altInput: true,\n      altFormat: 'd-m-Y H:i',\n      allowInput: true,\n      time_24hr: true,\n      minuteIncrement: 60,\n      static: false,\n      clickOpens: false,\n      appendTo: $('#map-animation .' + element[0].id + ' input.form-control')[0],\n      onOpen: [\n        (selectedDates, dateStr, instance) =>\n          instance == this.start_date_input ? this.end_date_input.close() : this.start_date_input.close()\n      ]\n    });\n  }\n\n  getDateRanges(unit, start, end) {\n    let ranges = [start], pos = 0;\n    if (this.scale == 'year') {\n      while (start < end) {\n        start = start.add(this.diff[pos], unit);\n        ranges.push(start);\n        ++pos;\n      }\n    }\n    else {\n      while (start < end) {\n        start = start.add(1, unit);\n        ranges.push(start);\n      }\n    }\n    return ranges;\n  }\n\n  roundDates(start, end) {\n    const scale = this.scale;\n    if (scale == 'hour') {\n      start = start.startOf('hour');\n      end = end.startOf('hour');\n    } else if (scale == 'day') {\n      start = start.startOf('day').add(14, 'hours');\n      end = end.startOf('day').add(14, 'hours');\n    } else if (scale == 'minute') {\n      start = roundNextXMin(start, 10);\n      end = roundNextXMin(end, 10);\n    } else if (scale == 'month') {\n      start = start.startOf('month').add(15, 'days');\n      end = end.startOf('month').add(15, 'days');\n    }\n    return start, end;\n  }\n\n  startAnimation() {\n    const marks = this.options.config.marks;\n    let start_date, end_date, addMarks = [];\n    if (this.start_date_input.latestSelectedDateObj) {\n      start_date = dayjs(this.start_date_input.latestSelectedDateObj);\n      end_date = dayjs(this.end_date_input.latestSelectedDateObj);\n    }\n    else {\n      start_date = dayjs(this.start_date_input.val() + '-01-01T00:00:00Z');\n      end_date = dayjs(this.end_date_input.val() + '-01-01T00:00:00Z');\n    }\n    this.intervalSeconds = $('#interval').val() || this.intervalSeconds;\n\n    let unit = this.scale + 's';\n    start_date, end_date = this.roundDates(start_date, end_date);\n    const ranges = this.getDateRanges(unit, start_date, end_date);\n    addMarks.Inicio = start_date.toDate();\n    addMarks.Fin = end_date.toDate();\n    for (const [mark, dt] of Object.entries(addMarks)) {\n      if (marks[mark]) {\n        window.timelinectl.timeline.setCustomTime(dt, mark)\n      }\n      else {\n        window.timelinectl.timeline.addCustomTime(dt, mark);\n        window.timelinectl.timeline.setCustomTimeTitle(mark, mark);\n        marks[mark] = dt;\n      }\n      window.timelinectl.timeline.customTimes[\n        window.timelinectl.timeline.customTimes.length - 1\n      ].hammer.off('panstart panmove panend');\n    }\n    this.animate(ranges, -1);\n    $('.time-selector').on('click', () => this.pause());\n  }\n  animate(ranges, i) {\n    this.getMap().set('animation', true);\n    i = (i + 1) % ranges.length;\n    const date = ranges[i];\n    setCurrentValue(date);\n    if (!this.enumTime)\n      window.timelinectl.timeline.moveTo(date.toDate());\n    window.timelinectl.timeline.setCustomTime(date.toDate(), 'current');\n    this.timeoutID = setTimeout(() => this.animate(ranges, i), this.interval);\n  }\n}\n\nclass VisibleLayerControl extends Control {\n  constructor() {\n    const html = $(`<div class=\"ol-visible-layer-info\"></div>`)\n    super({\n      element: html[0]\n    });\n  }\n  /**\n   * @param {Array} texts\n   */\n  set texts(texts) {\n    this.element.innerHTML = texts.map((x, idx) => `<p class=\"first-${idx == 0}\">${x[1]}</p>`).join('');\n  }\n}\nclass SelectProjectionControl extends Control {\n  constructor(mousePosition) {\n    const html = $(`\n      <div title=\"${window.gettext('Seleccionar proyección')}\" class=\"chProj combo dropup \">\n      <i class=\"fas fa-sort-up\"></i>\n      <form class=\"dropup-content\">\n      <ul class=\"dropup-content\" id=\"chProj\">\n      </ul>\n      </form>\n      </div>\n      `)\n    html.on('click', () => html.toggleClass('listshown'))\n    html.on('mouseleave', () => html.removeClass('listshown'));\n    window.site_cfg.site_epsgs.forEach(ep => {\n      const li = $(`<li desc=\"${ep.name}\" value =\"${ep.code}\">${ep.name} - ${ep.code}</li>`);\n      html.find('ul').append(li);\n    });\n    super({\n      element: html[0]\n    });\n    html.find('li').on('click', function () {\n      html.find('.select').removeClass('select');\n      $(this).addClass(\"select\");\n      let projCode = this.getAttribute('value');\n      const projDesc = this.getAttribute('desc');\n      let coordStringFunction = null;\n      if (projCode.endsWith(':DMS')) {\n        projCode = projCode.split(':DMS')[0];\n        coordStringFunction = toStringHDMS\n      }\n      else {\n        const destProj = proj4(projCode);\n        const oProj = destProj.oProj;\n        coordStringFunction = createStringXY(oProj.units == 'degrees' ? 4 : 0);\n      }\n      mousePosition.setProjection(projCode);\n      mousePosition.setCoordinateFormat(xy => coordStringFunction(xy, 2) + '<br>' + projDesc);\n      mousePosition.set('coordStringFunction', coordStringFunction);\n      window.coordinates_epsg = projCode;\n      window.coordinates_epsg_name = projDesc;\n    });\n    html.find(`li[value=\"${window.site_cfg.site_epsgs[0].code}\"]`).trigger('click');\n    html.removeClass('listshown');\n\n  }\n}\n\nexport function format(x) {\n  if (x == null)\n    return 'n/a'\n  if (x == '')\n    return x\n  if (x.match && x.match(/\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)/))\n    return new Date(x).toLocaleString()\n  if (isNaN(x))\n    return x\n  if (x > 100)\n    return Math.floor(x + .5)\n  else\n    return Math.floor(x * 1000 + .5) / 1000\n}\nfunction numeric_lang_format(x) {\n  const output = new Intl.NumberFormat($(window.document).find('html').attr('lang')\n    , { maximumFractionDigits: 20 }).format(x)\n  return output\n}\n\nfunction openNewWindow(gc, path) {\n  const element_ids = gc.elements.join(',');\n  const activeDimensions = gc.get('activeDimensions') || {};\n  const groupByValue = gc.get('groupByValue');\n  const boxplot = $('button#boxplot').hasClass('active');\n  const dimensions = {};\n  for (const [id, v] of Object.entries(activeDimensions)) {\n    if (id in activeDimensions)\n      dimensions[id] = activeDimensions[id].map(d => d[0]).join(',');\n    else if (!activeDimensions)\n      dimensions[id] = v.value;\n  }\n  let layers = gc.layers_loc;\n  if (dimensions) {\n    const set_layers = new Set(layers.split(','));\n    layers = [];\n    set_layers.forEach(s => layers.push(s));\n    layers = layers.join(',');\n  }\n  if ('mdt' in gc)\n    layers += `,${gc.mdt}`;\n  const url = new URL(path, window.location);\n  url.searchParams.set('srid', window.epsg);\n  url.searchParams.set('x', gc.poi.centroid[0]);\n  url.searchParams.set('y', gc.poi.centroid[1]);\n  url.searchParams.set('radius', gc.poi.radius || '');\n  url.searchParams.set('visible_srid', window.coordinates_epsg);\n  url.searchParams.set('visible_layers', layers);\n  url.searchParams.set('layers', layers);\n  url.searchParams.set('element_ids', element_ids);\n  url.searchParams.set('boxplot', boxplot);\n  url.searchParams.set('grouped', gc.group_by_unit);\n  url.searchParams.set('groupByDims', gc.print_pluma);\n  url.searchParams.set('groupByValue', groupByValue);\n  if (dimensions) {\n    for (const [k, v] of Object.entries(dimensions)) {\n      if (Array.isArray(v)) {\n        v.forEach(val => url.searchParams.append(k, val));\n      } else if (v != null) {\n        url.searchParams.set(k, v);\n      }\n    }\n  }\n  if (window.timelinectl)\n    url.searchParams.set('date', window.timelinectl.timeline.getCustomTime('current').toISOString());\n  if (gc.zoomRange) {\n    url.searchParams.set('range_from', gc.zoomRange[0]);\n    url.searchParams.set('range_to', gc.zoomRange[1]);\n  }\n  const simulation_id = gc.getMap().get('simulation_id');\n  if (simulation_id)\n    url.searchParams.set('simulation_id', simulation_id);\n  window.open(url);\n}\n\nfunction create_graph_control(mapa, poi, elements) {\n  const target_graphs = $('#info-dataGraph');\n  const gc = new GraphControl(\n    target_graphs,\n    poi,\n    false,\n    true,\n    elements,\n  );\n  gc.on('change:state', function () {\n    if (gc.get('state') == 'ok' && !target_graphs.dialog('isOpen'))\n      target_graphs.dialog('open');\n  })\n  mapa.addControl(gc);\n  const buttons = [{\n    html: '<i class=\"fas fa-print\"></i>',\n    click: () => openNewWindow(gc, window.Urls.plumas_pdf()),\n  }];\n  target_graphs.dialog({\n    appendTo: mapa,\n    autoOpen: false,\n    buttons: buttons,\n    height: 'auto',\n  });\n  gc.redraw();\n}\n\nfunction setPropagation(element_type_id, point, mapa) {\n  const tableId = '#fast-simulation-edit-dialog';\n  const new_pos = {\n    my: 'center',\n    at: 'center',\n    collision: \"fit\"\n  };\n  const buttons = [\n    {\n      text: window.gettext('Cancelar'),\n      click: function () {\n        $(this).dialog(\"close\");\n      },\n    },\n  ];\n  $(tableId).find('select#projection').empty();\n  for (const ep of window.site_cfg.site_epsgs) {\n    if (ep.code.endsWith(':DMS'))\n      continue;\n    const op = document.createElement('option')\n    op.innerText = ep.name + ' - ' + ep.code;\n    op.value = ep.code;\n    op.selected = (op.value == window.coordinates_epsg);\n    $(tableId).find('select#projection').append(op);\n  }\n  const destProj = proj4(window.epsg);\n  const selectProj = proj4(window.coordinates_epsg);\n  const nDec = selectProj.oProj.units == 'm' ? 2 : 6;\n  const [sel_x, sel_y] = proj4(destProj, selectProj, point);\n  $(tableId).find('input#xlong').val(parseFloat(sel_x.toFixed(nDec)));\n  $(tableId).find('input#xlong').attr('step', 1 / Math.pow(10, nDec));\n  $(tableId).find('input#ylat').val(parseFloat(sel_y.toFixed(nDec)));\n  $(tableId).find('input#ylat').attr('step', 1 / Math.pow(10, nDec));\n\n  buttons.unshift({\n    text: window.gettext('Crear'),\n    click: function () {\n      const x = Number($(tableId).find('input#xlong').val());\n      const y = Number($(tableId).find('input#ylat').val());\n      const srcEpsg = $(tableId).find('select#projection').val();\n      const sourceProj = proj4(srcEpsg);\n      const [x2, y2] = proj4(sourceProj, destProj, [x, y]);\n      const p = new Point([x, y]);\n      const p2 = new Point([x2, y2]);\n      if (p2.intersectsExtent(mapa.getView().calculateExtent())) {\n        const form = $(tableId + ' form');\n        const formData = new FormData(form[0]);\n        formData.set('element_simulationtype', element_type_id);\n        let datetime = formData.get('element_initdate');\n        datetime = dayjs(datetime);\n        formData.set('element_initdate', datetime.toISOString());\n        const popup = window.open();\n        popup.document.write(window.gettext('Cargando nueva propagación...'));\n        const featPoint = new Feature({\n          geometry: p,\n        });\n        $.ajax({\n          url: window.Urls.simulation_edit_new(),\n          data: formData,\n          cache: false,\n          contentType: false,\n          processData: false,\n          method: 'POST',\n          success: function (json) {\n            createOriginPoint(featPoint, mapa, json.id, popup);\n            $(tableId).dialog('close');\n          },\n          error: function () {\n            if (popup)\n              popup.close();\n          }\n        });\n      } else {\n        alert('Las coordenadas no corresponden a un punto del mapa');\n      }\n    }\n  });\n\n  const createProp_element = createProp_dialog(tableId, buttons, 'create', new_pos);\n  const marker_fast_prop = getMarkerVectorLayer(point, '/media/uploads/site/map-marker-solid.svg');\n  mapa.addLayer(marker_fast_prop);\n  createProp_element.on(\"dialogclose\", function () {\n    mapa.removeLayer(marker_fast_prop);\n  });\n  fillElementInfo(createProp_element, null, false, element_type_id);\n}\nexport function showProblemDialog(source, url) {\n  const div_error = $('<div id=\"error\"/>');\n  const error_element = $(source.document.body.innerHTML);\n  div_error.append(error_element);\n  let buttons = [];\n  if (source.document.body.id === \"error\") {\n    buttons = [{\n      text: window.gettext('Aceptar'),\n      click: function () {\n        window.open(url + '&huge=ok');\n        $(this).dialog('close');\n      }\n    },\n    {\n      text: window.gettext('Cancelar'),\n      click: function () {\n        $(this).dialog('close');\n      }\n    }\n    ];\n  }\n  if (source.document.body.id === \"empty\") {\n    buttons = [{\n      text: window.gettext('Ok'),\n      click: function () {\n        $(this).dialog('close');\n      }\n    }]\n  }\n  div_error.dialog({\n    appendTo: '.map',\n    position: { my: 'center', at: 'center', collision: 'fit' },\n    width: 'auto',\n    height: 'auto',\n    autoOpen: true,\n    resizable: false,\n    modal: true,\n    buttons,\n  });\n  source.close();\n}\n\nfunction createExportButton(mapa, cfg, args) {\n  let url_func = window.Urls.page_tif;\n  let extra_params = '';\n  if (args.type == 'pdf') {\n    url_func = window.Urls.page_pdf;\n    extra_params = '&DELTA_TIME=1';\n  }\n  if (args.type == 'png') {\n    url_func = window.Urls.page_png;\n    extra_params = '&DELTA_TIME=1';\n  }\n  if (args.toASCII) extra_params += '&toASCII=true';\n  if (args.type == 'kml') {\n    url_func = window.Urls.page_kml;\n    extra_params = '&DELTA_TIME=1&ITERATIONS=1';\n  }\n\n  return new Button({\n    html: args.icon,\n    title: window.gettext(args.title),\n    handleClick: function () {\n      let visible_layers = [];\n      let visible_elements = [];\n      mapa.getLayers().getArray().forEach(l => {\n        if (l.getVisible() && l.get('simmer_id')) {\n          if (l.get('title') == 'elementsLayerGroup') {\n            if (l.getLayersArray()[0].getVisible()) {\n              visible_layers.push(l.get('simmer_id'));\n              visible_elements.push('types' + l.get('simmer_id') + '=' + l.getLayersArray()[0].getSource().getParams()['TYPES']);\n            }\n          }\n          else {\n            visible_layers.push(l.get('simmer_id'));\n          }\n        }\n      })\n      const bbox_max = transformExtent(cfg.extent, 'EPSG:4326', window.epsg);\n      const extent_mosaico = mapa.getView().calculateExtent();\n      const intersection = getIntersection(extent_mosaico, bbox_max);\n      let params = '?visible_layers=' +\n        visible_layers.join(',') +\n        '&bbox=' + String(intersection);\n      if (window.timelinectl)\n        params += '&date=' + window.timelinectl.timeline.getCustomTime('current').toISOString();\n      else\n        params += '&date=' + new Date().toISOString();\n      if (visible_elements.length)\n        params += '&' + visible_elements.join('&');\n      const { ...map_dimensions } = mapa.get('dimension_controls');\n      delete map_dimensions.HORIZON;\n      for (const [k, dim] of Object.entries(map_dimensions))\n        params += '&' + $.param({ [k]: dim.value });\n      if (mapa.get('simulation_id'))\n        params += '&simulation_id=' + mapa.get('simulation_id');\n      if (window.epsg)\n        params += '&srid=' + window.epsg;\n      const srid = $('#chProj').find('li.select').attr('value');\n      if (srid)\n        params += '&t_srid=' + srid;\n\n      if (mapa.get('recortar_activo')) {\n        const trim_mask_id = window.site_cfg.extra.cutting_mask;\n        params += '&' + $.param({ trim_mask_id });\n      }\n      params += extra_params;\n      const url = url_func(cfg.id) + params;\n      const foo = window.open(url);\n      if (args.type !== 'pdf' && args.type !== 'png') {\n        const onload_func = function () {\n          if (['error', 'empty'].includes(this.document.body.id))\n            showProblemDialog(this, url);\n        };\n        foo.addEventListener('load', onload_func);\n      }\n    }\n  });\n}\nfunction createSimulation(e) {\n  $('#simulation-element-type-dialog table tbody').empty()\n  $.ajax({\n    url: window.Urls.simulation_types(),\n    success: function (json) {\n\n      for (const elem_type of json) {\n        const row = $(`<tr element_type=\"${elem_type.id}\"><td>${elem_type.name}</td></tr>`);\n        $('#simulation-element-type-dialog table tbody').append(row);\n      }\n      $('#simulation-element-type-dialog tr').on('click', null, 'create', function () {\n        const element_type_id = $(this).attr('element_type');\n        setPropagation(element_type_id, e.coordinate, e.data);\n        $('#simulation-element-type-dialog').dialog(\"close\");\n      });\n      if (json.length == 1)\n        $('#simulation-element-type-dialog tr').trigger('click');\n    }\n  });\n  $('#simulation-element-type-dialog').dialog({\n    title: window.gettext('Seleccione tipo...'),\n    width: 180,\n    height: 'auto',\n    maxHeight: window.innerHeight,\n  });\n}\nfunction setDims(pagelayer_set) {\n  const extra_dim = {};\n  for (const page_layer of pagelayer_set) {\n    if (page_layer.layer.source_type && page_layer.layer.source_type._dimension_controls) {\n      for (const dim of page_layer.layer.source_type.dimensions) {\n        if (dim.value_type == 'PERIODIC')\n          continue;\n        if (!(dim.locator in page_layer.layer.source_type._dimension_controls))\n          continue;\n        const dim_control = page_layer.layer.source_type._dimension_controls[dim.locator];\n        extra_dim[dim.locator] = dim_control.value;\n      }\n      // OJO comprobar cambio porque creo que antes no tenía senido\n      page_layer.extra_dim = extra_dim;\n    }\n  }\n  return extra_dim;\n}\nconst zip = new JSZip();\n\nasync function getKMLData(buffer, isKml) {\n  let kml_data = zip\n  if (!isKml) {\n    zip.files = {};\n    kml_data = await zip.loadAsync(buffer, { base64: true });\n  }\n  const kmlFiles = kml_data.file(/.kml$/i);\n  const lastKml = kmlFiles.length - 1;\n  if (lastKml >= 0)\n    return await kmlFiles[lastKml].async(\"string\");\n  return kml_data\n}\n\nfunction getKMLImage(href) {\n  let url = href;\n  let path = window.location.href;\n  path = path.slice(0, path.lastIndexOf('/') + 1);\n  if (href.indexOf(path) === 0) {\n    const regexp = new RegExp(href.replace(path, '') + '$', 'i');\n    const kmlFile = zip.file(regexp)[0];\n    if (kmlFile) {\n      url = URL.createObjectURL(new Blob([kmlFile.async(\"arraybuffer\")]));\n    }\n  }\n  return url;\n}\n\n// Define a KMZ format class by subclassing ol/format/KML\n\nclass KMZ extends KML {\n  constructor(opt_options) {\n    const options = opt_options || {};\n    options.iconUrlFunction = getKMLImage;\n    super(options);\n  }\n\n  getType() {\n    return 'arraybuffer';\n  }\n\n  async readFeature(source, options) {\n    const kmlData = await getKMLData(source);\n    return super.readFeature(kmlData, options);\n  }\n\n  async readFeatures(source, options, isKml) {\n    const kmlData = await getKMLData(source, isKml);\n    return super.readFeatures(kmlData, options);\n  }\n}\n\nexport async function cargarMapaMain(ns, cfg) {\n  const mapa = await cargarMapa(ns, ns.page.find('.map'), cfg);\n  const element_id = getParameterByName('element_id');\n  if (element_id) {\n    const response = await fetch(window.Urls.element_info(element_id))\n    const json = await response.json();\n    const geom = json.geometry;\n    const wktFormat = new WKT();\n    const map_geom = wktFormat.readGeometry(geom, {\n      dataProjection: 'EPSG:4326',\n      featureProjection: window.epsg\n    });\n    const view = mapa.getView();\n    view.fit(map_geom, {\n      maxZoom: view.getMaxZoom() - 9,\n    });\n    const newUrl = window.location.href\n      .replace(`element_id=${element_id}`, '')\n      .replace(`?&`, '?')\n      .replace(`&#`, '#')\n      .replace(`&&`, '&');\n    window.history.replaceState(null, null, newUrl);\n  }\n}\n\nclass LegendContextMenu extends ContextMenu {\n  constructor(opt_options) {\n    super(opt_options);\n    this.set('showableLegend', []);\n    this.on('change:showableLegend',\n      function () {\n        if (this.isOpen())\n          this.updateLegendMenuItem()\n      }\n    );\n    this.on('open', function () {\n      this.updateLegendMenuItem();\n    });\n  }\n  updateLegendMenuItem() {\n    const visibles = this.get('showableLegend');\n    const mapa = this.getMap();\n    const cls = 'fa-elementor';\n    const idx = this.items.findIndex(i => i.text?.includes(cls));\n\n    if (visibles.length !== 0 && idx === -1) {\n      const legendItem = {\n        text: `<i class=\"fab ${cls} fa-icon\"></i>&nbsp;&nbsp;${window.gettext('Mostrar leyenda')}`,\n        callback: e => {\n          visibles.forEach(lyr => showLegend(e, mapa, lyr));\n        },\n      };\n      this.items.push(legendItem);\n    } else if (visibles.length === 0 && idx !== -1) {\n      this.items.splice(idx, 1);\n    }\n    this.clear();\n    this.extend(this.items);\n  }\n}\n\nexport { cargarMapa, crearCapa, cargarMosaico, numeric_lang_format, transform_extent, create_graph_control };\n","import { $, dayjs, cargarCSS, proj4, getParameterByName } from '../../../moderna_meteogrid/statix/js/base.mjs';\nimport { TileWMS as TileWMSSource, ImageWMS as ImageWMSSource } from 'ol/source';\nimport { Tile as TileLayer } from 'ol/layer';\nimport Point from 'ol/geom/Point';\nimport Feature from 'ol/Feature';\nimport { Layer, setVisibleLayers_url } from '../../../simmer/statix/simmer/js/simmerlayer.mjs';\nimport { transform_extent } from '../../../simmer/statix/simmer/js/mapa.mjs';\nimport InspireTree from 'inspire-tree'\nimport InspireTreeDOM from 'inspire-tree-dom'\nimport LayerGroup from 'ol/layer/Group';\nimport WKT from 'ol/format/WKT';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { uniq } from 'underscore';\n\nimport {\n    configureCalendar, actOnElement, initializeMapa,\n    crearFilaData, fixDates, createAddDataButton\n} from './mapa_elementos.mjs';\nimport { fromExtent, circular } from 'ol/geom/Polygon';\nimport ImageLayer from 'ol/layer/Image';\n\nfunction updateStyles(tree, srcElements) {\n    const type_filters = $.map(tree.selected(), function (x) {\n        if (x.id.startsWith('et')) return x.id.substring(2);\n    });\n    type_filters.push(-1);\n    srcElements.updateParams({ TYPES: type_filters.join(',') });\n    srcElements.set('listado', true);\n}\n\n\nfunction zoomToPoint(evt) {\n    const mapa = evt.data;\n    const view = mapa.getView();\n    const element = (this.attributes.geom) ? this : $(this).closest('tr')[0];\n    mapa.set('lastElementPixel', undefined);\n    const geom = element.attributes.geom;\n    if (!geom.value)\n        return false;\n    const geojsonFormat = new GeoJSON()\n    const map_geom = geojsonFormat.readGeometry(geom.value, {\n        dataProjection: 'EPSG:4326',\n        featureProjection: window.epsg\n    });\n    view.fit(map_geom);\n    view.setZoom(view.getZoom() - 1);\n}\n\nclass SaverElementsLayer extends Layer {\n    constructor(ns, pageLayer, time_delta, interactive_map) {\n        super(ns, pageLayer, time_delta, interactive_map);\n        this.element_class = this._extra.element_class;\n        this.site = this._extra.site;\n        this.readonly = this._extra.readonly;\n        this.showElementsAffected = this._extra.showElementsAffected;\n        this.hideFilter = this._extra.hidefilter;\n        this.hideChanges = this._extra.hidechanges || this.readonly;\n        this.types = this._extra.types ? this._extra.types : [];\n        delete this._extra.types;\n        // No, no vale instanceof \n        // https://stackoverflow.com/questions/203739/why-does-instanceof-return-false-for-some-literals\n        if (this.types.constructor === String)\n            this.types = this.types.split(',');\n        if (!(this.types instanceof Array))\n            this.types = [this.types];\n        const type_locator = this?._layer?.source_type?.model_query?.filter?.element_type__locator\n        if (type_locator)\n            this.types = [type_locator];\n        const type_locator_in = this?._layer?.source_type?.model_query?.filter?.element_type__locator__in\n        if (type_locator_in)\n            this.types = type_locator_in;\n\n\n    }\n    registerGeomButtons(tableId) {\n        $(tableId).find('button.geom-point').on('click', evt => {\n            evt.preventDefault();\n            this.ns.mapa.set('new_feature', 'Point');\n        });\n        $(tableId).find('button.geom-line').on('click', evt => {\n            evt.preventDefault();\n            this.ns.mapa.set('new_feature', 'LineString');\n        });\n        $(tableId).find('button.geom-polygon').on('click', evt => {\n            evt.preventDefault();\n            this.ns.mapa.set('new_feature', 'Polygon');\n        });\n        $(tableId).find('button.geom-coords').on('click', evt => {\n            evt.preventDefault();\n            pointByCoords(this.ns.mapa);\n        });\n        $(tableId).find('button.geom-size').on('click', evt => {\n            evt.preventDefault();\n            this.polygonBySize();\n        });\n    }\n\n    polygonBySize() {\n        const mapa = this.ns.mapa;\n        const epsg = this.ns.epsg;\n        const tableId = '#polygonbysize-dialog';\n        const form = $(tableId + ' form');\n        const buttons = [\n            {\n                text: window.gettext('Añadir polígono'),\n                click: function (evt) {\n                    evt.preventDefault();\n                    const w = parseFloat(form.find('[name=w]').val());\n                    const h = parseFloat(form.find('[name=h]').val());\n                    const center = mapa.getView().getCenter();\n                    const sourceProj = proj4(epsg);\n                    const destProj = proj4(\"EPSG:4326\");\n                    const [x, y] = proj4(sourceProj, destProj, center);\n                    let polygon = getPolygonFromDistance(x, y, w, h);\n\n                    if (polygon.intersectsExtent(mapa.getView().calculateExtent())) {\n                        const new_geom = new Feature(polygon);\n                        mapa.set('edit_feature', new_geom);\n                        $(tableId).dialog('close');\n                    } else {\n                        alert(window.gettext('Los datos no corresponden a un punto del mapa'));\n                    }\n                },\n            },\n        ];\n        $(tableId).show().dialog({\n            position: { my: \"right top\", at: \"right-5% top+150\", of: mapa.getTargetElement(), collision: 'fit' },\n            title: window.gettext('Dimensiones del polígono'),\n            width: 260,\n            buttons: buttons,\n            appendTo: mapa.getTargetElement(),\n        });\n        $(tableId).dialog(\"moveToTop\");\n    }\n    registerInTree() {\n        const self = this;\n        const raiz = this.ns.page.find('div.arbol');\n        if ($('meta[name=\"is_mosaic\"]').len === 0)\n            raiz.show();\n        const arbol = raiz.find('#' + this._layerTypeLocator);\n        const existing_selector = arbol.find('#pageLayerSelector_' + this._pageLayer.id);\n        if (existing_selector.length) {\n            return;\n        }\n        const modelo = $('.elementos.modelo');\n        const copia = modelo.clone();\n        copia.find('.fa.fa-chevron-right').parent().next().hide();\n        copia.removeClass('modelo')\n        if (this.hideChanges) {\n            copia.find('.cambios').remove();\n        }\n        if (this.hideFilter) {\n            copia.find('.filtro').hide();\n        }\n        copia.attr('id', 'pageLayerSelector_' + this._pageLayer.id);\n        if (self._pageLayer.folder) {\n            const carpeta_existente = raiz.find(`div.folder[folder=\"${self._pageLayer.folder}\"]`);\n            if (carpeta_existente.length == 0) {\n                const carpeta_nueva = raiz.find('div.model_carpeta').clone();\n                carpeta_nueva.removeClass('model_carpeta');\n                carpeta_nueva.text(self._pageLayer.folder);\n                carpeta_nueva.attr('folder', self._pageLayer.folder);\n                carpeta_nueva.show();\n                arbol.append(carpeta_nueva);\n            }\n        }\n        arbol.append(copia);\n        copia.show();\n        if (this.ns.mapa.getTarget())\n            activaAcordeones(copia);\n        else\n            copia.find('.accordion').hide();\n        const calendar_element_from = $('#' + this.id + ' div.calendar-filter[name=\"from\"]');\n        const calendar_element_to = $('#' + this.id + ' div.calendar-filter[name=\"to\"]');\n        configureCalendar(calendar_element_from);\n        configureCalendar(calendar_element_to);\n        const ol_map = this._ol_map;\n        const visible_layers = getParameterByName('visible_layers').split(',');\n        if (visible_layers[0] != '') {\n            this._pageLayer.shown = visible_layers.some((l) => l == this._pageLayer.id);\n            this.lyrElements.setVisible(this._pageLayer.shown);\n        }\n        $('#saver_dialogs').load(window.Urls.saver_dialogs(),\n            () => {\n                this.registerGeomButtons('#create-dialog');\n                this.registerGeomButtons('#edit-dialog');\n                $('#element-info').on('click', 'button.emmet-info', 'info',\n                    function (evt) {\n                        actOnElement.call(this, evt);\n                        $(this).parent().trigger('click');\n                    });\n                $('#element-info').on('click', 'tr.related-row', ol_map, zoomToPoint);\n            });\n        copia.find('.mostrar-capa').attr('id_layer', this._pageLayer.id);\n        copia.find('.clase_elementos').text(this._pageLayer.layer.name);\n        copia.find('.mostrar-elementos').prop('checked', this._pageLayer.shown);\n        copia.find('.mostrar-cambios').prop('checked', this._pageLayer.shown);\n        copia.find('.mostrar-elementos').on('change', function () {\n            self.lyrElements.setVisible(this.checked);\n            const info = ol_map.get('info');\n            if (info) {\n                ol_map.unset('info', true);\n                ol_map.set('info', info);\n            }\n            setVisibleLayers_url(self.ns.page, ol_map, self._pageLayer.id, this.checked);\n        });\n        copia.find('.mostrar-cambios').on('change', function () {\n            self.lyrElementChanges.setVisible(this.checked);\n        });\n        copia.find('.municipio select').on('change', async function () {\n            const srcElements = self.lyrElements.getSource();\n            if (this.value == '') {\n                srcElements.updateParams({ municipio: undefined });\n                srcElements.set('listado', true);\n                return;\n            }\n            srcElements.updateParams({ municipio: this.value });\n            srcElements.set('listado', true);\n            const response = await fetch(window.Urls.municipality(this.value));\n            const json = await response.json()\n            const extent = json.extent;\n            const view = this.ns.mapa.getView();\n            view.fit(transform_extent(extent));\n        });\n        copia.find('form').on('submit', function (event) {\n            event.preventDefault();\n            const from = $(this).find('input[name=\"from\"]').val();\n            const to = $(this).find('input[name=\"to\"]').val();\n            const contains = $(this).find('[name=\"contains\"]').val();\n            const srcElements = self.lyrElements.getSource();\n            srcElements.updateParams({ from: from, to: to, contains: contains });\n            srcElements.set('listado', true);\n        });\n        copia.find('form .reset-filter').on('click', function (event) {\n            event.preventDefault();\n            const from = this.form.elements.from.value = this.form.elements.from.defaultValue\n            const to = this.form.elements.to.value = this.form.elements.to.defaultValue\n            const contains = this.form.elements.contains.value = this.form.elements.contains.defaultValue\n            const srcElements = self.lyrElements.getSource();\n            srcElements.updateParams({ from: from, to: to, contains: contains });\n            srcElements.set('listado', true);\n        });\n        const target = copia.find('a.clase_elementos')\n        const cbx = copia.find('input.mostrar-elementos');\n        self.getLayerInfo(target, cbx);\n        if (self._interactive_map)\n            self.setSliderLayer(target, cbx);\n        const createElement = copia.find('.create-element');\n        if (!this.readonly) {\n            this.ns.mapa.get('contextMenu').items.push({\n                text: `<i class=\"fas fa-plus fa-left\"></i>\n                    <span>${window.gettext(\"Crear\")} ${self._pageLayer.layer.name}</span>`,\n                callback: () => self.createMapElement(),\n            });\n            createElement.on('click', () => this.createMapElement());\n        }\n        else createElement.hide();\n        const elementsAffected = copia.find('.elements-affected');\n        if (this.showElementsAffected)\n            elementsAffected.on('click', () => this.doElementsAffected());\n        else\n            elementsAffected.hide()\n    }\n\n    async crearCapaOL(olmap, extent_local, interactive) {\n        const self = this;\n        this.ns.mapa = olmap;\n        initializeMapa(olmap);\n        this._ol_map = olmap;\n        const SourceFactory = interactive ? TileWMSSource : ImageWMSSource;\n        const LayerFactory = interactive ? TileLayer : ImageLayer;\n        const srcElements = new SourceFactory({\n            url: window.Urls.wms(),\n            params: {\n                LAYERS: 'elements',\n                STYLES: '',\n                SIMULATION_ID: this._extra.simulation_id,\n                CLASE: this.element_class,\n                SRS: window.epsg,\n                MASK_SITE: true,\n                SITE: this.site,\n                TYPES: this.types,\n                ...this._extra\n            },\n        });\n        const timeFormat = this._extra?.timeFormat;\n        srcElements.on('change:time', function () {\n            const time = this.get('time');\n            const effective_time = time\n                .add(this.get('time_delta') || 0, 'hours');\n            this.set('effective_time', effective_time);\n            this.updateParams({ TIME: effective_time.format(timeFormat) });\n        });\n\n        const lyrElements = new LayerFactory({\n            source: srcElements,\n            title: 'null',\n            //maxResolution: 20,\n            name: 'elements',\n            visible: false,\n            displayInLayerSwitcher: false,\n            zIndex: this.zIndex,\n            time_management: 'affected_simulation_id' in this._extra,\n        });\n        this.lyrElements = lyrElements;\n        if (interactive) {\n            const srcElementChanges = new TileWMSSource({\n                url: window.Urls.wms(),\n                params: {\n                    LAYERS: 'element_changes',\n                    SIMULATION_ID: this._extra.simulation_id,\n                    CLASE: this.element_class,\n                    STYLES: '',\n                    TYPES: this.types,\n                    SRS: window.epsg,\n                    MASK_SITE: true,\n                    SITE: this._extra.site,\n                    ...this._extra\n                },\n            });\n\n            const lyrElementChanges = this.hideChanges ? null : new TileLayer({\n                source: srcElementChanges,\n                title: null,\n                displayInLayerSwitcher: false,\n                zIndex: this.zIndex,\n                //maxResolution: 20,\n                name: 'element_changes',\n                visible: false\n            });\n            this.lyrElementChanges = lyrElementChanges;\n        }\n        const layers = this.readonly || this.hideChanges ?\n            [lyrElements] :\n            [lyrElements, this.lyrElementChanges];\n\n        const ret = new LayerGroup({\n            layers: layers,\n            displayInLayerSwitcher: false,\n            title: 'elementsLayerGroup',\n            simmer_id: this._pageLayer.id,\n            time_management: 'affected_simulation_id' in this._extra,\n        });\n        if (interactive) {\n            srcElements.on('change:listado', function () {\n                if (srcElements.get('listadoEnCurso')) {\n                    window.clearTimeout(srcElements.get('listadoEnCurso'));\n                    srcElements.set('listadoEnCurso', null);\n                }\n                srcElements.set('listado', false, true);\n                $('#' + this.id).find('.listado-elements').empty();\n                const layers = [lyrElements];\n                srcElements.set(\n                    'listadoEnCurso',\n                    window.setTimeout(function () {\n                        layers.forEach(requestList, self);\n                        srcElements.set('listadoEnCurso', null);\n                    }, 1000)\n                );\n            });\n            if (!this.hideChanges)\n                olmap.on('change:update_changes', function () {\n                    olmap.set('update_changes', false, true);\n                    self.lyrElementChanges.getSource().updateParams({ refresh: dayjs().format() });\n                    const layers = [self.lyrElementChanges];\n                    layers.forEach(requestList, self);\n                });\n            olmap.on('change:update_elements', function () {\n                olmap.set('update_elements', false, true);\n                srcElements.updateParams({ refresh: dayjs().format() });\n                const layers = [lyrElements];\n                layers.forEach(requestList, self);\n            });\n\n            olmap.on('change:info', function () {\n                if (this.get('isDrawing'))\n                    return;\n                const evt = this.get('info');\n                if (evt) {\n                    this.set('lastElementPixel', evt.pixel);\n                    const layers = [];\n                    if (self.lyrElements.getVisible())\n                        layers.push(lyrElements)\n                    if (!self.hideChanges && self.lyrElementChanges.getVisible())\n                        layers.push(self.lyrElementChanges);\n                    if (layers.length > 0)\n                        self.requestInfo(evt, layers);\n                }\n            });\n        }\n        cargarCSS();\n        this._ol_layer = ret;\n        if (this._ol_map)\n            this._ol_map.addLayer(ret);\n        this.registerInTree()\n        this.cargarArbol();\n        this.cargarMunicipios();\n        return ret;\n    }\n    async cargarMunicipios() {\n        const response = await fetch(window.Urls.municipalities());\n        const municipios = await response.json();\n        const select = $(`#${this.id} .municipio select`)\n        for (const m of municipios)\n            select.append($(`<option value=\"${m.id}\">${m.name}</option>`))\n    }\n    async cargarArbol() {\n        const self = this;\n        const lyrElements = this.lyrElements;\n        const lyrElementChanges = this.lyrElementChanges;\n        const mapa = this._ol_map;\n        const srcElements = lyrElements.getSource();\n        const response = await fetch(window.Urls.element_tree(this.element_class || ',', this.types?.length ? this.types : ',', this.site));\n        if (!response.ok)\n            throw new Error('Request Failed!');\n\n        const tree = new InspireTree({\n            selection: {\n                mode: 'checkbox'\n            },\n            data: await response.json(),\n        });\n        const target = $('#pageLayerSelector_' + this._pageLayer.id).find('.arbol-elementos');\n        new InspireTreeDOM(tree, {\n            target: target\n        });\n        tree.on('model.loaded', function (nodes) {\n            mapa.set('update_changes', true);\n            lyrElements.setVisible(self._pageLayer.shown);\n            if (lyrElementChanges)\n                lyrElementChanges.setVisible(self._pageLayer.shown);\n            nodes.forEach(function (n) {\n                if (n.children)\n                    n.children.forEach(function (x) {\n                        x.refreshIndeterminateState();\n                    });\n                n.refreshIndeterminateState();\n            });\n            if (self.types.length) {\n                const et_ids = self.types.map(id => 'et' + id);\n                for (let n of nodes.slice()) {\n                    if (n.children)\n                        for (let x of n.children.slice()) { // FIXME: Recursivo\n                            if (x.children)\n                                for (let y of x.children.slice()) {\n                                    if (!et_ids.includes(y.id) && !y.indeterminate())\n                                        y.remove();\n                                }\n                            if (!et_ids.includes(x.id) && !x.indeterminate())\n                                x.remove();\n                        }\n                    if (!et_ids.includes(n.id) && !n.indeterminate())\n                        n.remove();\n                }\n            }\n            updateStyles(this, srcElements);\n            tree.on('node.checked', function () {\n                updateStyles(this, srcElements);\n            });\n            tree.on('node.unchecked', function () {\n                updateStyles(this, srcElements);\n            });\n        });\n        const tooltip = $('<div id=\"saver-tooltip\" class=\"layer tooltip\"></div>').hide();\n        const mapDiv = $(this._ol_map.getTargetElement());\n        mapDiv.append(tooltip);\n        let old_img = null;\n        $('[custom_legend=true]').on('mouseover',\n            function (event) {\n                if (tooltip.is(\":visible\"))\n                    return;\n                const offset = mapDiv.offset();\n                const left = event.pageX + 1;\n                const top = event.pageY - offset.top + 1;\n                const et_id = this.dataset.uid.replace(/et/, '');\n                const params = { width: 200, pageLayerId: self._pageLayer.id, types: et_id };\n                const img = `<img src=\"${self._ol_layer?.getLayersArray()[0].getSource().getLegendUrl(null, params)}\"></img>`\n                if (img !== old_img) {\n                    old_img = img;\n                    tooltip.empty();\n                    tooltip.append($(img))\n                }\n                tooltip.css({ top, left }).show();\n            }\n        );\n        $('[custom_legend=true]').on('mouseleave', () => tooltip.hide());\n        return tree;\n    }\n    elementRow(tableId, v) {\n        if (v.name === 'elements') {\n            const tt = v.properties.comments || '';\n            const buttons =\n                '<button type=\"button\" class=\"fa fa-link emmet-url\"></button>' +\n                '<button type=\"button\" class=\"fa fa-info emmet-info\"></button>' +\n                '<button type=\"button\" class=\"fa fa-edit emmet-edit\"></button>' +\n                '<button type=\"button\" class=\"fa fa-trash emmet-delete\"></button>';\n            const tr = $(\n                '<tr geom=\"' +\n                JSON.stringify(v.geometry).replace(/\"/g, '&quot;') +\n                '\" element_id=\"' +\n                v.properties.id +\n                '\" element_class=\"' +\n                v.properties.element_type__element_class +\n                '\"><td title=\"' +\n                v.properties.element_type__name +\n                '\" data-uid=\"et' +\n                v.properties.element_type_id +\n                '\"></td><td title=\"' +\n                tt +\n                '\">' +\n                (v.properties.name\n                    ? v.properties.name\n                    : v.properties.element_type__name) +\n                buttons +\n                '</td></tr>'\n            );\n            if (!this.readonly && (\n                (window.change_municipal_element && v.properties.element_type__municipal) ||\n                window.validate_element_changes ||\n                window.change_site_element\n            ))\n                tr.addClass('can-edit');\n            if (v.properties.elementchange__parameter_change__locator === 'DELETE_ELEMENT')\n                tr.addClass('pending_delete');\n            if (v.properties.elementchange__parameter_change__locator === 'UPDATE_ELEMENT')\n                tr.addClass('pending_edit');\n            $(tableId + ' tr:last').after(tr);\n        } else if (v.name === 'element_changes') {\n            const tt = v.properties.comments || '';\n            let buttons =\n                '<button type=\"button\" class=\"fa fa-check emmet-commit-create\"></button>' +\n                '<button type=\"button\" class=\"fa fa-edit emmet-edit-new\"></button>' +\n                '<button type=\"button\" class=\"fa fa-check emmet-commit-edit\"></button>' +\n                '<button type=\"button\" class=\"fa fa-check emmet-commit-delete\"></button>' +\n                '<button type=\"button\" class=\"fa fa-link emmet-url\"></button>';\n            if (window.change_municipal_element && v.properties.element_type__municipal)\n                buttons += '<button type=\"button\" class=\"fa fa-xmark emmet-change-remove\"></button>'\n            const element_id = v.properties.references__id || v.properties.id;\n            const tr = $(\n                '<tr geom=\"' +\n                JSON.stringify(v.geometry).replace(/\"/g, '&quot;') +\n                '\" element_id=\"' +\n                element_id +\n                '\" element_class=\"' +\n                v.properties.element_type__element_class +\n                '\"><td title=\"' +\n                v.properties.element_type__name +\n                '\" data-uid=\"et' +\n                v.properties.element_type_id +\n                '\"></td><td title=\"' +\n                tt +\n                '\">' +\n                (v.properties.name\n                    ? v.properties.name\n                    : v.properties.element_type__name) +\n                buttons +\n                '</td></tr>'\n            );\n            if (v.properties.parameter_change__locator === 'INSERT_ELEMENT')\n                tr.addClass('pending_create');\n            if (v.properties.parameter_change__locator === 'DELETE_ELEMENT')\n                tr.addClass('pending_delete');\n            if (v.properties.parameter_change__locator === 'UPDATE_ELEMENT')\n                tr.addClass('pending_edit');\n            if (!this.readonly && (\n                (window.change_municipal_element && v.properties.element_type__municipal) ||\n                window.validate_element_changes ||\n                window.change_site_element\n            ))\n                tr.addClass('can-edit-new');\n            if (window.validate_element_changes) tr.addClass('can-commit');\n            $(tableId + ' tr:last').after(tr);\n        }\n    }\n    elementTable(tableId, features, mapa) {\n        const self = this;\n        const newDiv = $('<div><table><tr><td/><td/></tr></table></div>');\n        $(tableId).append(newDiv);\n        $.each(features, function (_, v) {\n            self.elementRow(tableId, v);\n        });\n        newDiv.find('tr:first').remove();\n        newDiv.on('click', 'tr', mapa, zoomToPoint);\n        newDiv.find('button.emmet-url').prop('title', window.gettext('Generar enlace'));\n        newDiv.on('click', 'button.emmet-url', 'url', actOnElement);\n        newDiv.on('click', 'button.emmet-edit', 'edit', actOnElement);\n        newDiv.find('button.emmet-edit').prop('title', window.gettext('Modificar'));\n        newDiv.on('click', 'button.emmet-edit-new', 'edit-new', actOnElement);\n        newDiv.find('button.emmet-edit-new').prop('title', window.gettext('Modificar'));\n        newDiv.on('click', 'button.emmet-delete', 'delete', actOnElement);\n        newDiv.find('button.emmet-delete').prop('title', window.gettext('Eliminar'));\n        newDiv.on('click', 'button.emmet-info', 'info', actOnElement);\n        newDiv.find('button.emmet-info').prop('title', window.gettext('Información'));\n        newDiv.on('click', 'button.emmet-commit-create', 'commit-create', actOnElement);\n        newDiv.find('button.commit-create').prop('title', window.gettext('Confirmar/descartar cambio'));\n        newDiv.on('click', 'button.emmet-commit-edit', 'commit-edit', actOnElement);\n        newDiv.find('button.emmet-commit-edit').prop('title', window.gettext('Confirmar/descartar cambio'));\n        newDiv.on('click', 'button.emmet-commit-delete', 'commit-delete', actOnElement);\n        newDiv.find('button.emmet-commit-delete').prop('title', window.gettext('Confirmar/descartar cambio'));\n        newDiv.on('click', 'button.emmet-change-remove', 'change-remove', actOnElement);\n        newDiv.find('button.emmet-change-remove').prop('title', window.gettext('Descartar cambio'));\n        if (tableId != '.info_elem') {\n            newDiv.on('click', 'button.emmet-edit', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-edit-new', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-delete', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-info', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-commit-create', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-commit-edit', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-commit-delete', mapa, zoomToPoint);\n            newDiv.on('click', 'button.emmet-change-remove', mapa, zoomToPoint);\n        }\n    }\n    requestInfo(evt, layers) {\n        const self = this;\n        const view = evt.map.getView();\n        const viewResolution = view.getResolution();\n        const viewProjection = view.getProjection();\n        const urls = [];\n        for (let i = 0; i < layers.length; i++) {\n            urls[i] = layers[i]\n                .getSource()\n                .getFeatureInfoUrl(evt.coordinate, viewResolution, viewProjection, {\n                    INFO_FORMAT: 'application/vnd.meteogrid.emmet+json',\n                    TOLERANCE: 7,\n                });\n        }\n        const tableId = '.info_elem';\n        const ajax = urls.map(url => $.ajax(url));\n        const simple = urls.length == 1;\n        $.when(...ajax).done(function (...jsons) {\n            if (simple)\n                jsons = [jsons];\n            let features = [];\n            for (const json of jsons)\n                features = features.concat(json[0].features);\n            self.elementTable(tableId, features, evt.map);\n            const containerId = '#info';\n            if (features.length > 0) {\n                if ($(tableId).is(':hidden')) $(tableId).show();\n                if ($(containerId).is(':hidden')) $(containerId).show();\n                if (!$(containerId).dialog('isOpen'))\n                    $(containerId).dialog('open');\n                else\n                    $('.ui-dialog').trigger(\"dialogopen\");\n            }\n        });\n    }\n\n    createMapElement() {\n        const self = this;\n        const new_pos = {\n            my: 'right top',\n            at: 'right-5% top+5',\n            of: this.ns.mapa.getTargetElement(),\n            collision: 'fit'\n        };\n        this.ns.mapa.set('sidebar_toggle', false);\n        $('#element-type-dialog table tbody').empty();\n        $.ajax({\n            url: window.Urls.element_types(this.element_class, this.types?.length ? this.types : ','),\n            success: function (json) {\n                const element_types = json;\n                for (const elem_type of json) {\n                    const row = $(\n                        '<tr element_type=\"' +\n                        elem_type.pk +\n                        '\"><td data-uid=\"et' +\n                        elem_type.pk +\n                        '\"></td><td>' +\n                        elem_type.name +\n                        '</td></tr>'\n                    );\n                    $('#element-type-dialog table tbody').append(row);\n                }\n                $('#element-type-dialog tr').on('click', function (evt) {\n                    const tableId = '#create-dialog';\n                    const table = $(tableId);\n                    table.find('input.element_updated')\n                        .val(dayjs().format('DD-MM-YYYY'));\n                    const element_type_id = $(evt.target)\n                        .closest('tr')\n                        .attr('element_type');\n                    // Montamos lista de opciones para crear datos nuevos\n                    const element_type = element_types.filter(function (elem) {\n                        return elem.pk == element_type_id;\n                    })[0];\n                    const available_data = element_type.data\n                    table.find('.vardata').remove();\n                    table\n                        .find(\"textarea[name='simulation_id']\")\n                        .val(self._extra.simulation_id ? self._extra.simulation_id : '');\n\n                    table.find('.add-data').remove();\n                    const data_menu = $('<ul class=\"add-data\"></ul>');\n                    for (const [i, dat] of Object.entries(available_data)) {\n                        if (!dat.type.calculation_id) {\n                            if (dat.fixed) {\n                                crearFilaData(tableId, [], [dat]);\n                            }\n                            else {\n                                const it = $(\n                                    '<li idx_available_data=\"' + i + '\">Añadir ' + dat.type.name + '</li>'\n                                );\n                                data_menu.append(it);\n                            }\n                        }\n                    }\n\n                    const buttons = [\n                        {\n                            text: window.gettext('Guardar'),\n                            click: function () {\n                                const dialog = this;\n                                if (element_type.locatable) {\n                                    const feat = self.ns.mapa.get('edit_feature');\n                                    if (!feat) {\n                                        $('button.geometry').fadeTo('fast', 0).fadeTo('fast', 1);\n                                        return;\n                                    }\n                                    const geometry = feat.getGeometry();\n                                    geometry.transform(window.epsg, 'EPSG:4326');\n                                    const wkt = new WKT();\n                                    const geom = wkt.writeGeometry(geometry, {\n                                        dataProjection: 'EPSG:4326',\n                                    });\n                                    table.find('form .element_geometry.data_new').val(geom);\n                                }\n                                table.find('input.element_updated').val(dayjs().format('YYYY-MM-DD'));\n                                fixDates(table);\n                                $.ajax({\n                                    url: window.Urls.element_create(element_type_id),\n                                    type: 'POST',\n                                    cache: false,\n                                    contentType: false,\n                                    processData: false,\n                                    data: new FormData(table.find('form')[0]),\n                                    success: function () {\n                                        $(dialog).dialog('close');\n                                        $(dialog).dialog('destroy');\n                                        $('#create-ok').dialog();\n                                        self.ns.mapa.set('update_elements', true);\n                                        self.ns.mapa.set('update_changes', true);\n                                    }\n                                });\n                            }\n                        },\n                        {\n                            text: window.gettext('Cancelar'),\n                            click: function () {\n                                $(this).dialog('close');\n                            }\n                        },\n                    ];\n                    buttons.unshift(createAddDataButton(tableId, data_menu, available_data));\n                    table\n                        .find('textarea.data_new')\n                        .val('');\n                    table.dialog({\n                        width: (window.innerWidth * 2 / 5 <= 475) ? 475 : 'auto',\n                        height: 'auto',\n                        maxHeight: window.innerHeight * 0.7,\n                        appendTo: self.ns.mapa.getTargetElement(),\n                        title: `${window.gettext(\"Crear\")} ${this.textContent}`,\n                        zIndex: 10000,\n                        resizable: true,\n                        buttons: buttons,\n                        position: new_pos,\n                        open: function () {\n                            $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n                            $(this).parent().css('max-width', (window.innerWidth * 2 / 5 <= 475) ? 475 : 'auto');\n                            $(this).css('max-width', (window.innerWidth * 2 / 5 <= 475) ? 475 : 'auto');\n                            self.ns.mapa.set('isDrawing', true)\n                        },\n                        close: function () {\n                            self.ns.mapa.set('isDrawing', false)\n                            // Forzamos refresco de edit_feature\n                            self.ns.mapa.unset('edit_feature');\n                            $(this).hide();\n                        },\n                        autoOpen: false,\n                    });\n                    table.dialog('open');\n                    $('#element-type-dialog').dialog('close');\n                });\n                if (json.length == 1)\n                    $('#element-type-dialog tr').click();\n            }\n        });\n        const height = $(window).height();\n        $('#element-type-dialog').dialog({\n            title: window.gettext('Seleccione tipo...'),\n            appendTo: this.ns.mapa.getTargetElement(),\n            width: 'auto',\n            height: 'auto',\n            maxHeight: height * .6,\n            position: {\n                my: 'center top',\n                at: 'center top+19%',\n                of: this.ns.mapa.getTargetElement(),\n                collision: 'fit'\n            },\n        });\n    }\n    async doElementsAffected() {\n        const self = this;\n        $('body').addClass('wait');\n        const response = await fetch(window.Urls.simul_affected_elements(this.ns.simulation_id, this._pageLayer.id));\n        $('body').removeClass('wait');\n        const json = await response.json()\n        const elements_by_minutes = {};\n        const abs_time_for_time = {};\n        const elements_by_type = {};\n        const elements = {};\n        const all_features = [];\n        for (const [minutes, features, abs_time_iso] of json) {\n            const abs_time = dayjs(abs_time_iso);\n            abs_time_for_time[minutes] = abs_time.format('HH:mm');\n            all_features.push(...features);\n            elements_by_minutes[minutes] = [];\n            for (const elem of features) {\n                elements_by_type[elem.element_type__name] = [];\n                if (!elements[elem.element_type__name])\n                    elements[elem.element_type__name] = {};\n                elements[elem.element_type__name][minutes] = [];\n            }\n        }\n        const uniq_features = uniq(all_features, v => v.id);\n        const layer_features = uniq_features.map(f => ({\n            name: 'elements',\n            geometry: f.geom,\n            properties: f,\n        }))\n        for (const [minutes, features] of json) {\n            for (const elem of features) {\n                elements_by_minutes[minutes].push(elem.id);\n                elements_by_type[elem.element_type__name].push(elem.id);\n                elements[elem.element_type__name][minutes].push(elem.id);\n            }\n        }\n        const ret = $('#affected-elements');\n        ret.find('.delenda').remove();\n        ret.find('.increase-colspan').attr('colspan', 1 + Object.keys(elements_by_minutes).length)\n        const col = ret.find('.minutes.model');\n        const col_abs = ret.find('.time-for-minutes.model');\n\n        const total_col = ret.find('.model.total-count-by-minutes');\n        const row = ret.find('.model.element-type');\n        for (const [minutes, ids] of Object.entries(elements_by_minutes)) {\n            col.clone().removeClass('model').addClass('delenda').text(minutes).insertBefore(col);\n            col_abs.clone().removeClass('model').addClass('delenda').text(abs_time_for_time[minutes]).insertBefore(col_abs);\n            const new_total_col = total_col.clone().removeClass('model').addClass('delenda').insertBefore(total_col).data('ids', ids);\n            new_total_col.find('a').text(ids.length).data('ids', ids);\n        }\n        ret.find('.total-count a').text(uniq_features.length).data('ids', '*');\n        for (const [element_type, ids_by_type] of Object.entries(elements_by_type)) {\n            const uniq_ids_by_type = uniq(ids_by_type);\n            const new_row = row.clone().removeClass('model').addClass('delenda').insertBefore(row);\n            new_row.find('.type').text(element_type);\n            new_row.find('.total-count-by-type a').text(uniq_ids_by_type.length).data('ids', uniq_ids_by_type);\n            const count_model = new_row.find('.count');\n            for (const minutes of Object.keys(elements_by_minutes)) {\n                const ids = elements[element_type][minutes]\n                const new_count = count_model.clone().removeClass('model').addClass('delenda').insertBefore(count_model);\n                new_count.find('a').text(ids && ids.length).data('ids', ids)\n            }\n        }\n        ret.off('click', 'a');\n        ret.on('click', 'a', function (evt) {\n            const ids = $(this).data('ids');\n            const features = layer_features.filter(v => ids === '*' || ids.includes(v.properties.id));\n            const tableId = '.info_elem';\n            $(tableId).empty();\n            self.elementTable(tableId, features, self._ol_map);\n            const containerId = '#info'\n            if ($(containerId).dialog('isOpen'))\n                $(containerId).dialog('close')\n            if (features.length > 0) {\n                if ($(tableId).is(':hidden')) $(tableId).show();\n                if ($(containerId).is(':hidden')) $(containerId).show();\n                const new_pos = evt.new_pos ? evt.new_pos :\n                    {\n                        my: 'right top',\n                        at: 'right-10% top+5',\n                        of: self.ns.mapa.getTargetElement(),\n                        collision: 'none'\n                    };\n                $(containerId).dialog({\n                    position: new_pos,\n                })\n                $(containerId).dialog('open');\n            }\n            evt.stopPropagation();\n            return false;\n        })\n        ret.dialog({\n            title: window.gettext('Elementos expuestos'),\n            width: 'auto',\n            maxWidth: 2048,\n            classes: {\n                \"ui-dialog\": \"ui-front-ma-non-troppo\"\n            }\n\n        });\n    }\n}\nfunction getPolygonFromDistance(x, y, w, h) {\n    // w y h en ms\n    let pol_extent;\n    w = w / 2;\n    h = h / 2;\n    if (w == h) {\n        pol_extent = circular([x, y], w, 4).getExtent();\n    }\n    else {\n        const pol_extent_w = circular([x, y], w, 4).getExtent();\n        const pol_extent_h = circular([x, y], h, 4).getExtent();\n        pol_extent = [pol_extent_w[0], pol_extent_h[1], pol_extent_w[2], pol_extent_h[3]]\n    }\n    let polygon = fromExtent(pol_extent);\n    polygon.transform('EPSG:4326', window.epsg);\n    return polygon;\n}\n\nfunction requestList(layer) {\n    const self = this;\n    const mapa = this._ol_map;\n    const view = mapa.getView();\n    const viewResolution = view.getResolution();\n    const viewProjection = view.getProjection();\n    const src = layer.getSource();\n    const url = src.getFeatureInfoUrl(\n        view.getCenter(),\n        viewResolution,\n        viewProjection,\n        { INFO_FORMAT: 'application/vnd.meteogrid.emmet+json' }\n    );\n    $.getJSON(\n        url.replace(/&I=/, '&II='), // TODO hacerlo más elegante\n        function (json) {\n            const tableId = `#pageLayerSelector_${src.getParams().pageLayer} .listado-${layer.get('name')}`;\n            $(tableId).empty();\n            self.elementTable(tableId, json.features, mapa);\n        }\n    );\n}\n\nexport { SaverElementsLayer, initializeMapa };\nfunction activaAcordeones(id) {\n    id.find('.accordion').click(function () {\n        $(this)\n            .children('span')\n            .toggleClass(\n                'fa-chevron-right',\n                $(this)\n                    .next()\n                    .is(':visible')\n            );\n        $(this)\n            .children('span')\n            .toggleClass(\n                'fa-chevron-down',\n                !$(this)\n                    .next()\n                    .is(':visible')\n            );\n        $(this)\n            .next()\n            .toggle('slow');\n        return false;\n    });\n}\n$(function () {\n    $('.accordion2').click(function () {\n        $(this)\n            .children('span')\n            .toggleClass(\n                'fa-plus-square',\n                $(this)\n                    .parent()\n                    .next()\n                    .is(':visible')\n            );\n        $(this)\n            .children('span')\n            .toggleClass(\n                'fa-minus-square',\n                !$(this)\n                    .parent()\n                    .next()\n                    .is(':visible')\n            );\n        $(this)\n            .parent()\n            .next()\n            .toggle('slow');\n        return false;\n    });\n});\n\nfunction pointByCoords(mapa) {\n    const tableId = '#pointbycoords-dialog';\n    const form = $(tableId + ' form');\n    const buttons = [\n        {\n            text: window.gettext('Añadir punto'),\n            click: function (evt) {\n                evt.preventDefault();\n                const x = parseFloat(form.find('[name=x]').val());\n                const y = parseFloat(form.find('[name=y]').val());\n                const srcEpsg = form.find('[name=epsg]').val();\n                const destProj = proj4(window.epsg);\n                const sourceProj = proj4(srcEpsg);\n                const [x2, y2] = proj4(sourceProj, destProj, [x, y]);\n                const p = new Point([x2, y2]);\n                if (p.intersectsExtent(mapa.getView().calculateExtent())) {\n                    const new_geom = new Feature(p);\n                    mapa.set('edit_feature', new_geom);\n                    $(tableId).dialog('close');\n\n                } else {\n                    alert('Las coordenadas no corresponden a un punto del mapa');\n                }\n            },\n        },\n    ];\n    const epsgSelect = $(tableId).find('select[name=\"epsg\"]');\n    if (epsgSelect.find('option').length === 0)\n        window.site_cfg.site_epsgs.forEach(ep => {\n            const projName = ep.name;\n            const text = projName + ' - ' + ep.code;\n            const op = $(`<option value =\"${ep.code}\">${text}</option>`);\n            epsgSelect.append(op);\n        });\n    $(tableId).show().dialog({\n        position: { my: \"right top\", at: \"right-5% top+150\", of: mapa.getTargetElement(), collision: 'fit' },\n        title: window.gettext('Coordenadas'),\n        width: 'auto',\n        buttons: buttons,\n        appendTo: mapa.getTargetElement(),\n    });\n    $(tableId).dialog(\"moveToTop\");\n}\n","/*eslint no-implicit-globals: \"error\"*/\nimport { $, dayjs, flatpickr, updateUnselectedHorizons, getParameterByName } from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport { Control } from 'ol/control';\nimport { Timeline } from \"vis-timeline/standalone\";\nimport 'vis-timeline/styles/vis-timeline-graph2d.css';\n\nconst sideCarets =\n  '<i class=\"fa-solid fa-diamond\"></i>';\n\nexport function roundNextXMin(date, X) {\n  let intervals = Math.floor(date.minutes() / X);\n  if (date.minutes() % X != 0)\n    intervals++;\n  if (intervals == 60 / X) {\n    date = date.add(1, 'hours');\n    intervals = 0;\n  }\n  date = date.minutes(intervals * X).seconds(0);\n  return date;\n}\n\nexport class TimelineControl extends Control {\n  constructor(opt) {\n    const target = $('.time-selector')[0];\n    window.time_type = opt.time_type;\n    super({\n      target: target,\n    })\n    this.target = target;\n    const enumTime = opt.time_type.locator.startsWith('ENUM');\n    const self = this;\n    if (enumTime) {\n      self.configure = this.configureTimelineENUM(opt);\n      self.create = this.createTimelineENUM(self.configure);\n    }\n    else {\n      self.configure = this.configureTimelineDefault(opt)\n      self.create = this.createTimelineDefault(self.configure);\n      window.setTimeout(() => self.moveToDate(\n        dayjs(this.timeline.getCustomTime('current'))), 100);\n    }\n  }\n  moveToDate(date) {\n    setCurrentValue(date);\n    const { start, end } = this.timeline.getWindow();\n    if (date > end || date < start)\n      this.timeline.moveTo(date.toDate());\n    this.timeline.setCustomTime(date.toDate(), 'current');\n  }\n  createTimelineDefault(config) {\n    const {\n      start,\n      end,\n      marks,\n      scale,\n      step,\n      snap,\n      // moment_function\n    } = config;\n\n    const options = {\n      moment: dayjs,\n      showCurrentTime: true,\n      snap: snap,\n      format: {\n        minorLabels: {\n          millisecond: 'SSS',\n          second: 's',\n          minute: 'HH:mm',\n          hour: 'HH',\n          weekday: 'dddd D',\n          day: 'dddd D',\n          month: 'MMMM',\n          year: 'YYYY'\n        }\n      },\n      width: '100%',\n      editable: {\n        add: false, // add new items by double tapping\n        updateTime: true, // drag items horizontally\n        updateGroup: false, // drag items from one group to another\n        remove: false // delete an item by tapping the delete button top right\n      },\n      margin: {\n        item: {\n          horizontal: 0,\n          vertical: 0\n        },\n        axis: 0\n      },\n      itemsAlwaysDraggable: true,\n      start: dayjs(start).toDate(),\n      maxHeight: '30pt',\n      timeAxis: {\n        scale,\n        step\n      },\n    };\n    const items = [];\n\n    if (end) {\n      options.end = dayjs(end);\n      const delta = end.diff(start);\n      options.end = options.end.add(delta / 10, 'milliseconds').toDate();\n      options.start = dayjs(options.start).subtract(delta / 10, 'milliseconds').toDate();\n      options.height = 28;\n      items.push(\n        { id: 4, content: 'sim', start: options.start, end: options.end, type: 'background' },\n      )\n    }\n    const timeline = new Timeline(this.target, items, [], options);\n    this.target.style.position = 'absolute';\n    const current = dayjs(config.new_initdate ? config.new_initdate : start)\n    const enableTime = ['hour', 'minute'].includes(config.scale);\n    const ts_config = {\n      wrap: true,\n      defaultDate: current.format('YYYY-M-D HH:mm'),\n      enableTime: false,\n      dateFormat: 'Y-m-dTH:i',\n      altInput: true,\n      allowInput: true,\n      altFormat: enableTime ? 'd-m-Y H:i' : 'd-m-Y',\n      time_24hr: true,\n      minuteIncrement: 1,\n      onClose: function (selectedDates, dateStr) {\n        const current_time = dayjs(snap(dayjs(dateStr)));\n        setCurrentValue(current_time);\n        window.timelinectl.timeline.moveTo(current_time.toDate());\n        window.timelinectl.timeline.setCustomTime(current_time.toDate(), 'current');\n      }\n    };\n    const calendar = $($('.calendar')[0]);\n    const time_selector_picker = flatpickr(calendar, ts_config);\n    timeline.addCustomTime(current.toDate(), 'current');\n    timeline.setCustomTimeTitle('', 'current');\n    timeline.on('timechange', function (properties) {\n      const time = dayjs(snap(properties.time));\n      time_selector_picker.setDate(time.format('YYYY-M-D HH:mm'));\n    });\n    function onTimeChanged(properties) {\n      const time = dayjs(snap(properties.time));\n      timeline.setCustomTime(time.toDate(), 'current');\n      setCurrentValue(time);\n      time_selector_picker.setDate(time.format('YYYY-M-D HH:mm'));\n    }\n    timeline.on('timechanged', onTimeChanged);\n    timeline.on('click', onTimeChanged);\n    this.timeline = timeline;\n    window.timelinectl = this;\n    const mapa = document.getElementsByClassName('map interactive');\n    if (mapa.length) {\n      ts_config.appendTo = $(mapa).find('.calendar input.form-control')[0];\n    }\n    calendar.on('keydown', event => {\n      if (event.key == 'Enter') {\n        time_selector_picker.setDate(new Date(time_selector_picker._input.value.replace(/(\\d{2})-(\\d{2})-(\\d{4})/, \"$2/$1/$3\")));\n        time_selector_picker.close();\n      }\n    });\n    setTimeout(function () {\n      $('div.vis-current-time')\n        .text('')\n        .append('<i class=\"fa fa-sort-down\"></i>');\n      $('div.vis-custom-time.current div').append(sideCarets);\n    }, 300);\n\n    for (const [mark, dt] of Object.entries(marks)) {\n      window.timelinectl.timeline.addCustomTime(dt.toDate(), mark);\n      window.timelinectl.timeline.setCustomTimeTitle(mark, mark);\n      window.timelinectl.timeline.customTimes[\n        window.timelinectl.timeline.customTimes.length - 1\n      ].hammer.off('panstart panmove panend');\n    }\n    this.animateMapIfArrowDown(time_selector_picker, scale, step);\n  }\n  createTimelineENUM(config) {\n    const {\n      start,\n      end,\n      marks,\n      scale,\n      step,\n      snap,\n      years,\n      new_initdate,\n    } = config;\n\n    let diff;\n\n    // Configuration for the Timeline as JSON object\n    const options = {\n      moment: dayjs,\n      showCurrentTime: false,\n      snap: snap,\n      format: {\n        minorLabels: () => ''\n      },\n      width: '100%',\n      editable: {\n        add: false, // add new items by double tapping\n        updateTime: true, // drag items horizontally\n        updateGroup: false, // drag items from one group to another\n        remove: false // delete an item by tapping the delete button top right\n      },\n      margin: {\n        item: {\n          horizontal: 0,\n          vertical: 0\n        },\n        axis: 0\n      },\n      itemsAlwaysDraggable: true,\n      start,\n      maxHeight: '30pt',\n      timeAxis: {\n        scale: scale,\n        step: step\n      },\n    };\n    let current = new_initdate || start;\n    if (end) {\n      options.moveable = false;\n      options.hiddenDates = [];\n      years.forEach((y, idx) => {\n        if (idx < years.length - 1)\n          options.hiddenDates.push({ start: String(y.year() + 1), end: String(years[idx + 1].year()) })\n        if (current <= years[idx + 1] && current >= y)\n          current = y;\n      })\n      options.start = dayjs(options.start).subtract(step, scale).toDate();\n      options.end = dayjs(end).add(2 * step, scale).toDate();\n    }\n    const timeline = new Timeline(this.target, [], [], options);\n    this.target.style.position = 'absolute';\n    timeline.addCustomTime(current.toDate(), 'current');\n    timeline.setCustomTimeTitle('', 'current');\n    const calendar = $('.calendar');\n    const ts_config = {\n      wrap: true,\n      defaultDate: current.format('YYYY-M-D HH:mm'),\n      enableTime: false,\n      dateFormat: 'Y-m-dTH:i',\n      altInput: true,\n      allowInput: true,\n      altFormat: 'd-m-Y H:i',\n      time_24hr: true,\n      minuteIncrement: 1,\n      onClose: function (selectedDates, dateStr) {\n        const current_time = dayjs(dateStr);\n        setCurrentValue(current_time);\n        window.timelinectl.timeline.moveTo(current_time.toDate());\n        window.timelinectl.timeline.setCustomTime(current_time.toDate(), 'current');\n      }\n    };\n    const time_selector_picker = flatpickr(calendar, ts_config);\n    timeline.on('timechange', function (properties) {\n      const time = dayjs(snap(properties.time));\n      time_selector_picker.setDate(time.format('YYYY-M-D HH:mm'));\n    });\n    function onTimeChanged(properties) {\n      const time = dayjs(snap(properties.time));\n      timeline.setCustomTime(time.toDate(), 'current');\n      setCurrentValue(time);\n      time_selector_picker.setDate(time.format('YYYY-M-D HH:mm'));\n    }\n    timeline.on('timechanged', onTimeChanged);\n    timeline.on('click', onTimeChanged);\n    this.timeline = timeline;\n    window.timelinectl = this;\n    const mapa = document.getElementsByClassName('map interactive');\n    if (mapa.length) {\n      ts_config.appendTo = $(mapa).find('.calendar input.form-control')[0];\n    }\n    calendar.on('keydown', event => {\n      if (event.key == 'Enter') {\n        time_selector_picker.setDate(new Date(time_selector_picker._input.value.replace(/(\\d{2})-(\\d{2})-(\\d{4})/, \"$2/$1/$3\")));\n        time_selector_picker.close();\n      }\n    });\n    setTimeout(function () {\n      $('div.vis-current-time')\n        .text('')\n        .append('<i class=\"fa fa-sort-down\"></i>');\n      $('div.vis-custom-time.current div').append(sideCarets);\n    }, 2000);\n\n    for (const [mark, dt] of Object.entries(marks)) {\n      window.timelinectl.timeline.addCustomTime(dt.toDate(), mark);\n      window.timelinectl.timeline.setCustomTimeTitle(mark, mark);\n      window.timelinectl.timeline.setCustomTimeMarker(mark, mark, false);\n      window.timelinectl.timeline.customTimes[\n        window.timelinectl.timeline.customTimes.length - 1\n      ].hammer.off('panstart panmove panend');\n    }\n    diff = [];\n    years.forEach((year, i) => {\n      if (i > 0) {\n        diff.push(year.diff(years[i - 1], 'y'));\n      }\n    })\n    if ($('.time-selector').is(':visible'))\n      this.animateMapIfArrowDown(time_selector_picker, scale, step, diff, years);\n  }\n  configureTimelineDefault(config) {\n    let marks = {};\n    let resolution, start, scale, step;\n    let end = null;\n    let year_list;\n    const time_type = config.time_type.locator;\n    const moment_function = time_type.slice(-1) == 'D' ? function (date) {\n      return dayjs(date).utc();\n    } : dayjs;\n    if (config.dyn) {\n      if (config.dyn.initdate) {\n        start = dayjs(config.dyn.initdate);\n        marks.Inicio = start;\n      }\n    } else {\n      start = dayjs(config.start);\n      if (config.initial_time) {\n        start = start.local();\n        start = start.hour(config.initial_time).minute(0).second(0).millisecond(0);\n        start = start.utc();\n      }\n    }\n\n    if (time_type == '1H') {\n      resolution = 1;\n      scale = 'hour';\n      step = 1;\n      end = start.add(window.innerWidth / 1300 * 24, 'hour');\n    } else if (time_type == '1D' || time_type == '1D_1H') {\n      resolution = 24;\n      scale = 'day';\n      step = 1;\n      end = start.add(window.innerWidth / 1300 * 10, 'day');\n    } else if (time_type == '10M') {\n      resolution = 1 / 6;\n      scale = 'minute';\n      step = 10;\n      end = start.add(window.innerWidth / 1300 * 3, 'hour');\n    } else if (time_type == '1MO') {\n      resolution = 720;\n      scale = 'month';\n      step = 1;\n      end = start.add(window.innerWidth / 1300 * 10, 'month');\n    } else if (time_type == '6H') {\n      resolution = 6;\n      scale = 'hour';\n      step = 6;\n      end = start.add(window.innerWidth / 1300 * 144, 'hour');\n    }\n    const snap = function (mdate) {\n      mdate = dayjs(mdate);\n      if (resolution < 1) mdate = roundNextXMin(mdate, 60 * resolution);\n      else if (resolution == 1) mdate = mdate.startOf('hour');\n      else if (resolution == 24) mdate = mdate.startOf('day').add(14, 'hours');\n      else if (resolution > 24) mdate = mdate.startOf('month').add(15, 'days');\n      else if (resolution == 6) mdate = findMoment6H(mdate);\n      return mdate.toDate();\n    };\n    start = snap(start);\n    if (config.dyn?.initdate && config.dyn?.hours) {\n      marks.Fin = dayjs(config.dyn.initdate).add(config.dyn.hours, 'hours');\n      end = marks.Fin;\n    }\n    function findMoment6H(mdate) {\n      const nHour = [0, 6, 12, 18];\n      mdate = mdate.startOf('hour');\n      const idxHour = Math.floor(mdate.hours() / resolution);\n      return mdate.startOf('day').add(nHour[idxHour], 'hour');\n    }\n\n    return {\n      snap: snap,\n      start: start,\n      end: end,\n      dyn: config.dyn,\n      marks: marks,\n      years: (year_list) ? year_list : null,\n      scale: scale,\n      step: step,\n      moveable: true,\n      moment_function: moment_function,\n      new_initdate: config.new_initdate,\n    };\n  }\n  configureTimelineENUM(config) {\n    let marks = {};\n    let resolution, start, scale, step;\n    let end = null;\n    let year_list;\n    if (config.dyn) {\n      if (config.dyn.initdate) {\n        start = dayjs(config.dyn.initdate);\n        marks.Inicio = start;\n      }\n    } else {\n      start = dayjs();\n    }\n    if (config.dyn && config.dyn.hours) {\n      if (config.dyn.initdate) {\n        end = dayjs(config.dyn.initdate).add(config.dyn.hours, 'hours');\n        marks.Fin = end;\n      }\n    }\n    scale = 'year';\n    step = 1;\n    const years = config.time_type.locator\n      .split(':')[1]\n      .split('/')\n      .map(x => dayjs(x + '-01-01T00:00:00Z'));\n    const labelsj = config.time_type.data.find(x => x.locator == 'LABELS');\n    const labels = labelsj ? JSON.parse(labelsj.value) : null;\n    for (const yr of years) {\n      const k = labels ? labels[yr.year()] : yr.year();\n      marks[k] = yr;\n    }\n    year_list = years;\n    start = years[0];\n    end = years[years.length - 1];\n    end = dayjs(end);\n    const last = years[years.length - 1];\n    const snap = function (date) {\n      let mdate = dayjs(date);\n      for (let i = 1; i < years.length; i++) {\n        if (mdate <= years[i])\n          return years[i - 1];\n      }\n      return last.toDate();\n    };\n\n    if (!resolution) resolution = 1;\n    const now = new Date();\n    if (typeof start === 'undefined') start = now.getTime();\n\n    return {\n      snap,\n      start,\n      end,\n      dyn: config.dyn,\n      marks,\n      years: (year_list) ? year_list : null,\n      scale,\n      step,\n      moveable: false,\n      new_initdate: config.new_initdate,\n    };\n  }\n  animateMapIfArrowDown(time_selector_picker, scale, step, diff, y) {\n    // FIXME: Cuando los eventos no son periódicos\n    document.addEventListener(\n      'keydown',\n      event => {\n        const keyName = event.key;\n        if (!['ArrowRight', 'ArrowLeft'].includes(keyName))\n          return;\n        if ((event.target.tagName == 'INPUT') || (event.target.tagName == 'TEXTAREA'))\n          return;\n        event.preventDefault();\n        event.stopPropagation();\n        const current_time = window.timelinectl.timeline.getCustomTime('current');\n        let current_pos;\n        if (diff) {\n          y.forEach((year, i) => {\n            if (year.isSame(current_time))\n              current_pos = i;\n          })\n          if (keyName === 'ArrowRight') {\n            // forward map\n            if (current_pos < diff.length) {\n              let next_date = dayjs(current_time).add(diff[current_pos], 'years');\n              this.moveToDate(next_date);\n              time_selector_picker.setDate(next_date.format('YYYY-M-D HH:mm'));\n              return;\n            }\n          }\n\n          if (keyName === 'ArrowLeft') {\n            // rewind map\n            if (current_pos > 0) {\n              let prev_date = dayjs(current_time).subtract(diff[current_pos - 1], 'years');\n              this.moveToDate(prev_date);\n              time_selector_picker.setDate(prev_date.format('YYYY-M-D HH:mm'));\n              return;\n            }\n          }\n        }\n        else {\n          if (keyName === 'ArrowRight') {\n            // forward map\n            let next_date = dayjs(current_time).add(step, scale + 's');\n            this.moveToDate(next_date);\n            time_selector_picker.setDate(next_date.format('YYYY-M-D HH:mm'));\n            return;\n          }\n\n          if (keyName === 'ArrowLeft') {\n            // rewind map\n            let prev_date = dayjs(current_time).subtract(step, scale + 's');\n            this.moveToDate(prev_date);\n            time_selector_picker.setDate(prev_date.format('YYYY-M-D HH:mm'));\n            return;\n          }\n        }\n\n      },\n      false\n    );\n  }\n}\nfunction highlight(newElem, oldElem) {\n  const oldText = oldElem.text();\n\n  let text = '';\n  newElem\n    .text()\n    .split('')\n    .forEach(function (value, index) {\n      if (value != oldText.charAt(index))\n        text += \"<span class='highlight'>\" + value + '</span>';\n      else text += value;\n    });\n  newElem.html(text);\n}\nexport function getFormatString(time_type) {\n  if (time_type.includes('D'))\n    return 'DD-MM-YYYY';\n  else if (time_type.includes('1MO'))\n    return 'MMMM YYYY';\n  else if (time_type.startsWith('ENUM'))\n    return 'YYYY';\n  else\n    return 'DD - MM - YYYY HH: mm[(UTC]Z[)]';\n}\nexport function setCurrentValue(start) {\n  if (!start)\n    start = dayjs(window.timelinectl.timeline.getCustomTime('current'));\n  const isMosaic = $('div.mosaics').length > 0;\n  let time_type_map, labels;\n  if (isMosaic) {\n    $('div.mosaics td div.mosaic_map').parent().show();\n    time_type_map = window.time_type?.locator;\n    const labelsj = window.time_type.data.find(x => x.locator == 'LABELS');\n    labels = labelsj ? JSON.parse(labelsj.value) : null;\n  }\n  const utc_start = start.utc();\n  for (const ns of window.namespaces)\n    for (const [i, mapa] of ns.mapas.entries()) {\n      if (isMosaic && time_type_map.startsWith('ENUM') && $(mapa.getTargetElement()).find('_info').text() != '...') {\n        if (i == 0) continue;\n        const times = window.timelinectl.timeline.customTimes;\n        let iter_selected = null;\n        let i_time = 0;\n        let idx_hor_notsel = getParameterByName('idx_hor_notsel').split(',');\n        for (const time of times) {\n          if (time.options.id == 'current')\n            continue;\n          if (time.getCustomTime().toISOString() == utc_start.toISOString()) {\n            iter_selected = i_time;\n            break;\n          } else {\n            idx_hor_notsel.push(i_time.toString());\n          }\n          i_time++;\n        }\n        updateUnselectedHorizons(idx_hor_notsel);\n        const tgt = mapa.getTargetElement();\n        if (tgt) {\n          const map_iter = Number(tgt.id.split('_')[1]);\n          $(tgt).siblings('.time_info').text(Object.values(labels)[map_iter]);\n          $(tgt).parent().toggle(map_iter >= iter_selected)\n          $(tgt).parent().addClass('hidden');\n          mapa.getLayers().forEach(function (l) {\n            if (l.get('time_management')) {\n              const src = 'getSource' in l ?\n                l.getSource() :\n                l.getLayers().getArray()[0].getSource();\n              if (isMosaic)\n                src.on('imageloadend', evt => {\n                  const img = evt.image.getImage();\n                  if (img.width > 1 || img.height > 1)\n                    $(tgt).parent().removeClass('hidden');\n                });\n              src.set('time', utc_start);\n            }\n          });\n        }\n      }\n      else {\n        mapa.getLayers().forEach(function (l) {\n          if (l.get('time_management')) {\n            const time_type = window.time_type?.locator ? window.time_type.locator.slice(-1) : '';\n            const src = 'getSource' in l ?\n              l.getSource() :\n              l.getLayers().getArray()[0].getSource();\n            const tgt = mapa.getTargetElement();\n            if (tgt) {\n              if (isMosaic) {\n                $(tgt).parent().addClass('hidden');\n                src.on('imageloadend', evt => {\n                  const img = evt.image.getImage();\n                  if (img.width > 1 || img.height > 1)\n                    $(tgt).parent().removeClass('hidden');\n                });\n              }\n            }\n            src.set('time', utc_start);\n            let effective_time = src.get('effective_time');\n            effective_time = effective_time.utcOffset(start.utcOffset());\n            if (isMosaic && $('div.interval-field span#title').val() == '1MO') {\n              let aux_time = utc_start.utcOffset(start.utcOffset());\n              const init_day = aux_time.date() - 1;\n              aux_time = aux_time.startOf('month')\n                .add(15, 'days')\n                .add(src.get('time_delta') || 0, 'hours');\n              if (init_day < aux_time.daysInMonth())\n                aux_time = aux_time.startOf('month').add(init_day, 'days');\n              else\n                aux_time = aux_time.endOf('month').startOf('day');\n              effective_time = aux_time;\n              src.set('effective_time', aux_time);\n            }\n            const string_format_date = getFormatString(time_type_map ? time_type_map : time_type)\n            let time_info_txt = dayjs(effective_time.toDate()).format(string_format_date)\n            if (labels && time_info_txt in labels)\n              time_info_txt = labels[time_info_txt];\n            const targetElem = mapa.getTargetElement();\n            if (targetElem) {\n              const infoDiv = $(targetElem).siblings('.time_info');\n              infoDiv.text(time_info_txt);\n              if (src.get('time_delta') && window.time_type?.locator != '1MO' && (i != 0)) {\n                const prevInfo = $(ns.mapas[i - 1].getTargetElement()).siblings('.time_info');\n                highlight(infoDiv, prevInfo);\n              }\n            }\n          }\n        });\n      }\n      const info = mapa.get('info');\n      if (info) {\n        mapa.unset('info', true);\n        mapa.set('info', info);\n      }\n      const dimension_controls = mapa.get('dimension_controls');\n      if (dimension_controls) {\n        mapa.unset('dimension_controls');\n        mapa.set('dimension_controls', dimension_controls);\n      }\n    }\n  groupCellsByTimeInfo();\n}\n\nfunction groupCellsByTimeInfo() {\n  $('.fila_mapas').each(function () {\n    const $fila = $(this);\n    const $celdas = $fila.find('td').not(':first');\n\n    // Agrupar por el texto de .time_info\n    const grupos = {};\n    $celdas.each(function () {\n      const $celda = $(this);\n      const key = $celda.find('.time_info').text();\n      if (!grupos[key]) grupos[key] = [];\n      grupos[key].push($celda);\n    });\n    const ordenGrupos = Object.keys(grupos);\n    $celdas.remove();\n    for (const key of ordenGrupos) {\n      for (const celda of grupos[key]) {\n        $fila.append(celda);\n      }\n    }\n  });\n}","import {unByKey} from 'ol/Observable';\nimport Overlay from 'ol/Overlay';\nimport {getArea, getLength} from 'ol/sphere';\nimport {LineString, Polygon} from 'ol/geom';\nimport Draw from 'ol/interaction/Draw';\nimport {Vector as VectorLayer} from 'ol/layer';\nimport {Vector as VectorSource} from 'ol/source';\nimport {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style';\nimport {numeric_lang_format} from './mapa.mjs'\nexport default function Measurer(map , typeValue) {\n\n    var typeSelect;\n    typeSelect = typeValue;\n    var source = new VectorSource();\n\n    var vector = new VectorLayer({\n      source: source,\n      style: new Style({\n        fill: new Fill({\n          color: 'rgba(255, 255, 255, 0.2)'\n        }),\n        stroke: new Stroke({\n          color: '#ffcc33',\n          width: 2\n        }),\n        image: new CircleStyle({\n          radius: 7,\n          fill: new Fill({\n            color: '#ffcc33'\n          })\n        })\n      }),\n      zIndex: Infinity,\n      title: 'Measure',\n      displayInLayerSwitcher: false\n    });\n    /**\n     * Currently drawn feature.\n     * @type {import(\"../src/ol/Feature.js\").default}\n     */\n    var sketch;\n    /**\n     * The help tooltip element.\n     * @type {HTMLElement}\n     */\n    var helpTooltipElement;\n    /**\n     * Overlay to show the help messages.\n     * @type {Overlay}\n     */\n    var helpTooltip;\n    /**\n     * The measure tooltip element.\n     * @type {HTMLElement}\n     */\n    var measureTooltipElement;\n    /**\n     * Overlay to show the measurement.\n     * @type {Overlay}\n     */\n    var measureTooltip;\n    /**\n     * Message to show when the user is drawing a polygon.\n     * @type {string}\n     */\n    var continuePolygonMsg = window.gettext('Click para continuar trazando el polígono');\n      /**\n     * Message to show when the user is drawing a line.\n     * @type {string}\n     */\n    var continueLineMsg = window.gettext('Click para continuar trazando la línea');\n    \n    /**\n     * Handle pointer move.\n     * @param {import(\"../src/ol/MapBrowserEvent\").default} evt The event.\n     */\n    var pointerMoveHandler = function(evt) {\n      if (evt.dragging) {\n        return;\n      }\n      /** @type {string} */\n      var helpMsg = window.gettext('Click para comenzar a dibujar');\n    \n      if (sketch) {\n        var geom = sketch.getGeometry();\n        if (geom instanceof Polygon) {\n          helpMsg = continuePolygonMsg;\n        } else if (geom instanceof LineString) {\n          helpMsg = continueLineMsg;\n        }\n      }\n    \n      helpTooltipElement.innerHTML = helpMsg;\n      helpTooltip.setPosition(evt.coordinate);\n    \n      helpTooltipElement.classList.remove('hidden');\n    };\n    \n    map.addLayer(vector);\n\n    map.on('pointermove', pointerMoveHandler);\n    \n    map.getViewport().addEventListener('mouseout', function() {\n      helpTooltipElement.classList.add('hidden');\n    });\n        \n    var draw; // global so we can remove it later\n    \n    /**\n     * Format length output.\n     * @param {LineString} line The line.\n     * @return {string} The formatted length.\n     */\n    var formatLength = function(line) {\n      var length = getLength(line , {projection:window.epsg});\n      var output;\n      if (length > 1000) {\n        output = numeric_lang_format((length / 1000).toFixed(2)) +\n            ' ' + 'km';\n      } else {\n        output = numeric_lang_format(length.toFixed(2)) +\n            ' ' + 'm';\n      }\n      return output;\n    };\n      /**\n     * Format area output.\n     * @param {Polygon} polygon The polygon.\n     * @return {string} Formatted area.\n     */\n    var formatArea = function(polygon) {\n      var area = getArea(polygon , {projection:window.epsg});\n      let output;\n      if (area > 10000) {\n        output = `${numeric_lang_format((area / 1000000).toFixed(2))} km<sup>2</sup> - ${numeric_lang_format((area / 10000).toFixed(2))} ha`;\n      } else {\n        output = `${numeric_lang_format(area.toFixed(2))} m<sup>2</sup>`;\n      }\n      return output;\n    };\n    \n    function addInteraction() {\n      var type = (typeSelect == 'area' ? 'Polygon' : 'LineString');\n      draw = new Draw({\n        source: source,\n        type: type,\n        stopClick: true,\n        style: new Style({\n          fill: new Fill({\n            color: 'rgba(255, 255, 255, 0.2)'\n          }),\n          stroke: new Stroke({\n            color: 'rgba(0, 0, 0, 0.5)',\n            lineDash: [10, 10],\n            width: 2\n          }),\n          image: new CircleStyle({\n            radius: 5,\n            stroke: new Stroke({\n              color: 'rgba(0, 0, 0, 0.7)'\n            }),\n            fill: new Fill({\n              color: 'rgba(255, 255, 255, 0.2)'\n            })\n          })\n        })\n      });\n      map.addInteraction(draw);\n    \n      createMeasureTooltip();\n      createHelpTooltip();\n    \n      var listener;\n      draw.on('drawstart',\n        function(evt) {\n          // set sketch\n          sketch = evt.feature;\n    \n          /** @type {import(\"../src/ol/coordinate.js\").Coordinate|undefined} */\n          var tooltipCoord = evt.coordinate;\n    \n          listener = sketch.getGeometry().on('change', function(evt) {\n            var geom = evt.target;\n            var output;\n            if (geom instanceof Polygon) {\n              output = formatArea(geom);\n              tooltipCoord = geom.getInteriorPoint().getCoordinates();\n            } else if (geom instanceof LineString) {\n              output = formatLength(geom);\n              tooltipCoord = geom.getLastCoordinate();\n            }\n            measureTooltipElement.innerHTML = output;\n            measureTooltip.setPosition(tooltipCoord);\n          });\n          map.set('isDrawing', true)\n        });\n    \n      draw.on('drawend',\n        function() {\n          measureTooltipElement.className = 'ol-tooltip ol-tooltip-static';\n          measureTooltip.setOffset([0, -7]);\n          // unset sketch\n          sketch = null;\n          // unset tooltip so that a new one can be created\n          measureTooltipElement = null;\n          createMeasureTooltip();\n          unByKey(listener);\n          map.set('isDrawing', false)\n        });\n    }\n\n    function createHelpTooltip() {\n      if (helpTooltipElement) {\n        helpTooltipElement.parentNode.removeChild(helpTooltipElement);\n      }\n      helpTooltipElement = document.createElement('div');\n      helpTooltipElement.className = 'ol-tooltip hidden';\n      helpTooltip = new Overlay({\n        element: helpTooltipElement,\n        offset: [15, 0],\n        positioning: 'center-left'\n      });\n      map.addOverlay(helpTooltip);\n    }\n\n    function createMeasureTooltip() {\n      if (measureTooltipElement) {\n        measureTooltipElement.parentNode.removeChild(measureTooltipElement);\n      }\n      measureTooltipElement = document.createElement('div');\n      measureTooltipElement.className = 'ol-tooltip ol-tooltip-measure';\n      measureTooltip = new Overlay({\n        element: measureTooltipElement,\n        offset: [0, -15],\n        positioning: 'bottom-center'\n      });\n      map.addOverlay(measureTooltip);\n    }\n   \n    addInteraction();\n    \n\n} ","/*eslint no-implicit-globals: \"error\"*/\nimport { $, dayjs, locale, mergeDeep, multiselectOptions, transform_point, getParameterByName, get_horizon, proj4 } from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport { createStringXY } from 'ol/coordinate';\nimport Plotly from 'plotly.js-cartesian-dist-min'\nimport locale_es from 'plotly.js-locales/es'\nimport { Control } from 'ol/control'\nimport { format } from './mapa.mjs'\nimport cartesian from 'cartesian';\nimport * as Excel from \"exceljs\";\nimport { saveAs } from \"file-saver\";\nimport { template } from 'underscore';\nPlotly.register(locale_es);\n\nfunction nameToRgba(name) {\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n  context.fillStyle = name;\n  context.fillRect(0, 0, 1, 1);\n  return context.getImageData(0, 0, 1, 1).data;\n}\n\nconst __colors = [\n  'red', 'lime', 'blue', 'orange', 'black',\n  'purple', 'pink', 'skyblue', 'silver'];\n\nconst colors = __colors.map(nameToRgba)\n\nfunction getColor(i, dimming) {\n  // coordinar con simmer/plugins.py\n  if (!dimming)\n    dimming = 1;\n  const ret = colors[i % colors.length];\n  return `rgba(${ret[0]}, ${ret[1]}, ${ret[2]}, ${ret[3] / 256 / dimming})`\n}\n\nexport class GraphControl extends Control {\n  constructor(target, poi, group_by_unit, print_pluma, elements) {\n    const html = $(`\n        <div>\n          <div class=\"info_elem listado\"></div>\n          <div class=\"info_tabla\"><table class=\"tabla_datos\"><tbody></tbody></table></div>\n          <div id=\"threshold\" class=\"hidden negrita-main-color\">${(window.gettext('Umbral'))}: <input type=\"number\" min=\"0\" max=\"100\" step=\"5\" name=\"threshold\" value=\"\" ></div>\n        </div>\n    `);\n    super({\n      element: html[0],\n      target: target[0]\n    });\n    const self = this;\n    $(html.find('#threshold input')).on('change', function () {\n      self.redraw();\n    })\n    this.isDialog = target.hasClass('dialog');\n    this.target = target;\n    this.info_tabla = html.find('.info_tabla');\n    this.poi = poi;\n    this.zoomRange = null; // rango de zoom para el gráfico, si es el caso\n    this.elements = elements || [];\n    this.group_by_unit = group_by_unit || false;\n    this.print_pluma = print_pluma || false;\n    this.destProj = proj4(window.coordinates_epsg);\n    this.oProj = this.destProj.oProj;\n    const deg = this.oProj.units == 'degrees';\n    this.coordXY = createStringXY(deg ? 4 : 0);\n    this.projDesc = `${window.epsg_name}`.toUpperCase();\n    this.on('change:type', function () {\n      const new_type = this.get('type');\n      for (const target of this.targets) {\n        const data = target.base_data;\n        const new_data_groups = {};\n        const allgroupedDimValues = new Set();\n        let groupedDim = '';\n        let infoDims = {};\n        if (new_type === 'box') {\n          let idx = 0;\n          const groupColumns = Object.keys(data[0]?.dimensions) || [];\n          infoDims = data[0]?.infoDims || {};\n          let groupByValue = data[0]?.groupByValue;\n          const dimsName = {};\n          data.forEach(entry => {\n            Object.values(entry.dimensions).forEach((values) => {\n              if (values.length >= 2 && !Object.prototype.hasOwnProperty.call(dimsName, values[0])) {\n                dimsName[values[0]] = values[1];\n              }\n            });\n          });\n          const uniqueValues = groupColumns.reduce((acc, col) => {\n            acc[col] = new Set(data.map(item => item.dimensions[col][0])).size;\n            return acc;\n          }, {});\n          const columnsWithMultipleValues = groupColumns.filter(col => uniqueValues[col] > 1);\n          if (columnsWithMultipleValues.includes(groupByValue)) {\n            // Si está presente, moverlo al principio del array\n            const index = columnsWithMultipleValues.indexOf(groupByValue);\n            const valueToMove = columnsWithMultipleValues.splice(index, 1)[0];\n            columnsWithMultipleValues.unshift(valueToMove);\n          }\n          for (let i = 0; i < data.length; i++) {\n            const orig_serie = data[i];\n            const dims = Object.fromEntries(\n              Object.entries(orig_serie.dimensions).map(([k, vv]) => [k, vv[0]])\n            );\n            let dimsLabel = {};\n            // dimensiones únicas\n            const columnControl = [];\n            for (const uniqueColumn of groupColumns.filter(\n              col => uniqueValues[col] < 2)) {\n              let name = dimsName[dims[uniqueColumn]];\n              dimsLabel[infoDims[uniqueColumn]] = name;\n              columnControl.push(uniqueColumn);\n            }\n            // las multiplevalues las combinamos todas menos la última\n            for (let i = 0; i < columnsWithMultipleValues.length - 1; i++) {\n              const multiColumn = columnsWithMultipleValues[i]\n              let name = dimsName[dims[multiColumn]];\n              dimsLabel[infoDims[multiColumn]] = name;\n              columnControl.push(multiColumn)\n            }\n            let groupLabel = Object.entries(dimsLabel)\n              .map(([k, v]) => `${k}=${v}`)\n              .join(\" | \");\n            groupedDim = groupColumns.filter(key => !columnControl.includes(key));\n            allgroupedDimValues.add(dimsName[dims[groupedDim]]);\n            if (!(groupLabel in new_data_groups)) {\n              let color;\n              if (orig_serie?.marker?.color && i === 0)\n                color = orig_serie.marker.color;\n              else\n                color = getColor(idx++)\n              new_data_groups[groupLabel] = {\n                x: [],\n                y: [],\n                dims: dimsLabel,\n                name: orig_serie.layer_name,\n                type: 'box',\n                boxmean: 'true',\n                line: { color: color, width: 1.5 }\n              };\n            }\n            const serie = new_data_groups[groupLabel];\n            for (let j = 0; j < orig_serie.x.length; j++) {\n              serie.x.push(orig_serie.x[j]); // Fecha en el eje X\n              serie.y.push(orig_serie.y[j]); // Valores en el eje Y\n            }\n          }\n        }\n\n        const new_values = Object.values(new_data_groups);\n        const groupedString = Array.from(allgroupedDimValues).join(\", \");\n        if (groupedString.length > 0) {\n          for (const newValue of new_values) {\n            let dimsnewValue = newValue.dims;\n            dimsnewValue[infoDims[groupedDim]] = groupedString;\n            newValue.name = `${newValue.name} | ${Object.entries(dimsnewValue)\n              .map(([k, v]) => `${k}: ${v}`)\n              .join(\" | \")}`;\n          }\n        }\n        const delenda = [];\n        for (let idx = 0; idx < target.data.length; idx++)\n          delenda.push(idx)\n        Plotly.deleteTraces(target, delenda);\n        if (new_type == 'box') {\n          target.old_layout = target.layout;\n          target.layout = {\n            xaxis: target.old_layout.xaxis,\n            yaxis: target.old_layout.yaxis,\n            //hovermode: target.old_layout.hovermode,\n            hoverlabel: {\n              namelength: 999\n            },\n            legend: target.old_layout.legend,\n            hovermode: 'x unified',\n            font: target.old_layout.font,\n            margin: target.old_layout.margin,\n            showlegend: target.old_layout.showlegend,\n          }\n        } else {\n          target.layout = target.old_layout;\n        }\n        if (new_values.length > 1) {\n          target.layout.boxmode = \"group\"\n          for (let idx = 0; idx < new_values.length; idx++) {\n            new_values[idx].offsetgroup = `group${idx}`;\n            new_values[idx].hoverinfo = 'y';\n          }\n        }\n        if (new_values.length) {\n          Plotly.addTraces(target, new_values);\n        } else {\n          Plotly.addTraces(target, target.base_data);\n        }\n      }\n    })\n  }\n  get threshold() {\n    return $(this.element).find('#threshold input').val();\n  }\n  set threshold(value) {\n    $(this.element).find('#threshold input').val(value);\n  }\n  get showMultiRun() {\n    return this._showMultiRun;\n  }\n  set showMultiRun(value) {\n    if (this._showMultiRun != value) {\n      this._showMultiRun = value;\n      this.redraw();\n    }\n  }\n  purge() {\n    for (const target of this.targets) {\n      this.observer.unobserve(target);\n      Plotly.purge(target);\n    }\n    this.target.remove();\n  }\n  get activeLayers() {\n    if (this.analyers)\n      return this.analyers\n    const layers = []\n    for (const layerObj of this.getMap().get('layerObjects')) {\n      const layer = layerObj._ol_layer;\n      if (!('mdt' in layerObj._extra && layerObj._extra['mdt'])) {\n        if (!this.analyers && !layer.getVisible())\n          continue;\n        if (!layer.get('time_management') && layer.get('title') != 'elementsLayerGroup') {\n          if (!layerObj._extra)\n            continue;\n          if (layerObj._extra.queryable !== true) {\n            continue;\n          }\n        }\n      }\n      layers.push(layerObj);\n    }\n    return layers;\n  }\n  async redraw(evt) {\n    this.targets = [];\n    this.set('state', 'busy');\n    if (evt) {\n      const isNewPoint = !this.poi?.centroid ||\n        this.poi.centroid[0] !== evt.coordinate[0] ||\n        this.poi.centroid[1] !== evt.coordinate[1];\n      if (isNewPoint)\n        // no se aplica el zoom si es un punto nuevo\n        this.zoomRange = null;\n      this.poi = {\n        centroid: evt.coordinate,\n        same_srid: true,\n      };\n      this.analyers = evt.analyers;\n      const pixelSize = evt.frameState?.pixelToCoordinateTransform[0];\n      if (pixelSize)\n        this.poi.radius = pixelSize * 3;\n    }\n    $(this.element).find('#threshold').toggleClass('hidden', !this.analyers);\n    const point = this.poi && this.poi.same_srid ? this.poi.centroid : transform_point(this.poi.centroid);\n    const mapa = this.getMap();\n    const view = mapa.getView();\n    this.set('multiRun', this.activeLayers.some(\n      x => x?._extra.multiRun));\n    let con_pluma = false;\n    const map_dimensions = mapa.get('dimension_controls') || {};\n    if (Object.values(map_dimensions).some(x => x.options.length)) {\n      if (!this.get('activeDimensions')) {\n        this.set('activeDimensions', {}, true);\n        const newActiveDimensions = {}\n        Object.values(map_dimensions).map(dc => {\n          if (dc.id) {\n            newActiveDimensions[dc.id] = [];\n            const dim_values = getParameterByName(dc.id);\n            if (dim_values) {\n              for (const dval of dim_values.split(',')) {\n                const option = dc.options.find(o => o[0] == dval);\n                if (option)\n                  newActiveDimensions[dc.id].push(option);\n              }\n            }\n            else\n              newActiveDimensions[dc.id] = [[dc.value, dc.caption]]\n          }\n        });\n        this.set('activeDimensions', newActiveDimensions);\n      } else {\n        const activeDimensions = this.get('activeDimensions');\n        this.unset('activeDimensions', activeDimensions);\n        this.set('activeDimensions', activeDimensions);\n      }\n    }\n    if (!mapa.getTarget()) {\n      mapa.setSize([100, 100]);\n      view.setResolution(1000);\n      view.setCenter(point);\n    }\n    mapa.set('elements', this.elements);\n    let [layers, urls, data_plumas_mapping, dimDataByLayer] = this.getQueryLayers(\n      evt ? evt.coordinate : point,\n      this.get('activeDimensions'));\n    for (const lyr of layers) {\n      for (const dim of lyr._layer.source_type.dimensions) {\n        if (dim.locator in map_dimensions) {\n          con_pluma = true;\n          break;\n        }\n      }\n    }\n    this.set('con_pluma', con_pluma);\n    this.layers_loc = layers.map(x => x._pageLayer.id).join(',');\n    this.layers = layers;\n    this.dimDataByLayer = dimDataByLayer;\n    const urls_plumas = []\n    const group_dims = !$.isEmptyObject(this.get('activeDimensions'));\n    const tabs = $('#tabs-Graph').clone();\n    tabs.removeClass('hidden');\n    if (this.print_pluma) {\n      this.target.empty();\n      this.target.append(tabs);\n      let layers_by_graphs = []\n      for (const layer of layers.values()) {\n        const src = layer?.source;\n        let this_url = urls.splice(1, 1)[0];\n        if (src) {\n          const dim_mapping = {};\n          for (const [i, v] of Object.entries(map_dimensions)) {\n            if (i.includes('HOR'))\n              continue;\n            if (src && i in src.getParams())\n              dim_mapping[i] = v.options;\n          }\n          getCombinatedDims(dim_mapping, tabs, map_dimensions, this_url, data_plumas_mapping, urls_plumas, layers_by_graphs, layer);\n        }\n        else {\n          urls_plumas.push(this_url);\n          layers_by_graphs.push(layer);\n        }\n      }\n      urls.push(...urls_plumas);\n      layers = layers_by_graphs;\n    }\n    let numUrls = urls.length;\n    if (numUrls > 1)\n      this.getMap().set('notification', window.gettext('Quedan %s consultas...').replace(/[%]s/, numUrls));\n    const calls = urls.map(async url => {\n      const response = await fetch(url);\n      if (--numUrls > 1)\n        this.getMap().set('notification', window.gettext('Quedan %s consultas...').replace(/[%]s/, numUrls));\n      return await response.json();\n    });\n    this.graphs = await Promise.allSettled(calls).then(\n      jsons => {\n        if (this.getMap() == null)\n          return;\n        this.getMap().set('notification', null);\n        this.jsons = jsons;\n        this.loadGraphs(jsons, layers, data_plumas_mapping, group_dims, tabs)\n      })\n    this.observer = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        const style = getComputedStyle(entry.target);\n\n        const paddingLeft = parseFloat(style.paddingLeft);\n        const paddingRight = parseFloat(style.paddingRight);\n        const paddingTop = parseFloat(style.paddingTop);\n        const paddingBottom = parseFloat(style.paddingBottom);\n        const width = entry.target.clientWidth - paddingLeft - paddingRight;\n        const origHeight = entry.target.layout?.height;\n        const height = origHeight || entry.target.clientHeight - paddingTop - paddingBottom;\n        const newLayout = {\n          width: width,\n          height: height || undefined,\n        }\n        Plotly.relayout(entry.target, newLayout);\n        entry.target.layout.height = origHeight;\n        $(entry.target).find('g.infolayer rect.legendtoggle').hide();\n      }\n    });\n    for (const target of this.targets)\n      this.observer.observe(target);\n    if (this.get('type')) {\n      this.unset('type', true);\n      this.set('type', 'box');\n    }\n    if (this.targets.length || this.info_tabla.find('tr').length)\n      this.set('state', 'ok');\n  }\n  getQueryLayers(coordinate, dimensionValues) {\n    const mapa = this.getMap();\n    const poi = this.poi;\n    const layers = this.activeLayers;\n    if (this.analyers)\n      this.group_by_unit = true;\n    const elements = mapa.get('elements');\n    const map_dimensions = mapa.get('dimension_controls') || {};\n    const view = mapa.getView();\n    const viewResolution = view.getResolution();\n    const viewProjection = view.getProjection();\n    const graph_layers = [];\n    const dimDataByLayer = []\n    const data_plumas_mapping = [];\n    const urls = [window.Urls.info_punto_json(window.epsg.split(':')[1], ...coordinate, window.coordinates_epsg.split(':')[1], 'None')];\n    for (const layerObj of layers) {\n      const layer = layerObj._ol_layer;\n      if (!('mdt' in layerObj._extra && layerObj._extra['mdt'])) {\n        if (!this.analyers && !layer.getVisible())\n          continue;\n        if (!layer.get('time_management') && layer.get('title') != 'elementsLayerGroup') {\n          if (!layerObj._extra)\n            continue;\n          if (layerObj._extra.queryable !== true) {\n            continue;\n          }\n        }\n      }\n      const layerDimensions = layerObj._layer.source_type ? layerObj._layer.source_type.dimensions.map(x => x.locator) : [];\n      const layerDimensionValues = {};\n      if (dimensionValues)\n        for (const [k, v] of Object.entries(dimensionValues))\n          if (layerDimensions.includes(k))\n            layerDimensionValues[k] = v;\n      const combinations = !$.isEmptyObject(layerDimensionValues) ? cartesian(layerDimensionValues) : [{}];\n      if (layer.get('title') == 'elementsLayerGroup') {\n        for (const elem of elements) {\n          urls.push(window.Urls.element_info(elem))\n          graph_layers.push(layerObj);\n        }\n        continue;\n      }\n      if (layerObj._extra &&\n        layerObj._extra.queryable === false)\n        continue;\n      if ('mdt' in layerObj._extra) {\n        urls.shift()\n        urls.unshift(window.Urls.info_punto_json(window.epsg.split(':')[1], ...coordinate, window.coordinates_epsg.split(':')[1], layerObj._pageLayer.id))\n        continue;\n      }\n      layer.set('addFolderName', false);\n      if (graph_layers.some(graph_layer => graph_layer._ol_layer?.get('title') == layer.get('title')))\n        layer.set('addFolderName', true);\n      const params = getTimeParams(layer);\n      if (this.analyers)\n        params.HORIZON = undefined;\n      if (poi && poi.type == 'element')\n        params.element = poi.id;\n      const src = layer.getSource();\n      const infoDims = {};\n      for (const combination of combinations) {\n        dimDataByLayer.push(combination);\n        const title_dims = [];\n        let dims_names = '';\n        const saved_params = { ...src.getParams() };\n        for (const [k, vv] of Object.entries(combination)) {\n          const dim_name = map_dimensions[k]?.name\n          src.updateParams({ [k]: vv[0] });\n          dims_names += ` | ${dim_name}: ${vv[1]}`;\n          // title_dims.push(`${}: ${vv[1]}`);\n          title_dims.push(`${vv[1]}`);\n          infoDims[k] = dim_name;\n        }\n        data_plumas_mapping.push({\n          title_dims: title_dims.join(' / '),\n          dimensions: combination,\n          infoDims,\n          dims_names\n        })\n        if (this.showMultiRun)\n          params.all_runs = true;\n        urls.push(\n          src.getFeatureInfoUrl(coordinate, viewResolution, viewProjection, {\n            INFO_FORMAT: 'application/json',\n            ...params\n          })\n        );\n        graph_layers.push(layerObj);\n        src.updateParams(saved_params);\n      }\n    }\n    return [graph_layers, urls, data_plumas_mapping, dimDataByLayer];\n  }\n  showDimSelector() {\n    const dimsDialogExistente = $('#dims-dialog');\n    const dimControls = this.getMap().get('dimension_controls');\n    if (dimsDialogExistente.length === 0) {\n      const self = this;\n      const captions = {};\n      const dialog = $(`<div id=\"dims-dialog\"></div>`)\n        .appendTo(this.target)\n        .dialog({\n          title: window.gettext('Seleccione dimensiones'),\n          autoOpen: false,\n          width: 'auto',\n          buttons: [{\n            text: window.gettext('Aceptar'), click: function () {\n              const newActiveDimensions = {};\n              $(this).find('.multi.flex:visible').each((idx, divSel) => {\n                const $divSel = $(divSel);\n                const sel = $divSel.find('select');\n                const val = sel.val();\n                const id = sel.attr('id').split(' ')[1];\n                if (val.length == 0)\n                  $divSel.fadeOut().fadeIn();\n                newActiveDimensions[id] = val.map(v => [v, captions[id][v]]);\n              });\n              const groupByValue = $('#sortSelect').val();\n              if (Object.values(newActiveDimensions).some(x => x.length == 0))\n                return;\n              if (self.isDialog) {\n                const keepType = self.get('type');\n                self.target.dialog('close');\n                self.set('type', keepType);\n              }\n              self.set('groupByValue', groupByValue);\n              self.set('activeDimensions', newActiveDimensions);\n              self.redraw();\n              dialog.dialog('close');\n            }\n          }]\n        });\n      for (const ctl of Object.values(dimControls)) {\n        if (!ctl.id)\n          continue\n        captions[ctl.id] = {};\n        const div = $(`<div class=\"multi flex\"></div>`).appendTo(dialog);\n        $(`<h4>${ctl.name}</h4>`).appendTo(div)\n        const sel = $(`<select id=\"dimensionSel ${ctl.id}\" multiple=\"multiple\"></select>`).appendTo(div);\n        for (const [value, name] of ctl.options) {\n          sel.append($(`<option value=\"${value}\">${name}</option>`))\n          captions[ctl.id][value] = name;\n        }\n        sel.multiSelect(multiselectOptions());\n      }\n    }\n    for (const [k, vv] of Object.entries(this.get('activeDimensions'))) {\n      const sel = $(`select[id=\"dimensionSel ${k}\"]`);\n      sel.multiSelect('deselect_all');\n      sel.multiSelect('select', vv.map(v => '' + v[0]));\n    }\n    for (const ctl of Object.values(dimControls)) {\n      $(`select[id=\"dimensionSel ${ctl.id}\"]`).closest('div').toggle(ctl.usage > 0);\n    }\n    const dimsDialog = $('#dims-dialog');\n    if ($('#sortSelectContainer').length === 0) {\n      const selectHTML = `\n        <div id=\"sortSelectContainer\" class=\"dim-control\">\n          <label for=\"sortSelect\">${window.gettext('Agrupar por')}:</label>\n          <select id=\"sortSelect\" class=\"custom-select\">\n            ${Object.values(dimControls)\n          .filter(ctl => ctl.usage > 0)\n          .map(ctl => `<option value=\"${ctl.id}\">${ctl.name}</option>`)\n          .join('')}\n          </select>\n        </div>\n      `;\n      dimsDialog.prepend(selectHTML);\n    }\n    const maxZIndex = Math.max(...$.map($('.ui-dialog:visible'), el => parseInt($(el).css('z-index')) || 0));\n    dimsDialog.parent('.ui-dialog').css('z-index', maxZIndex + 10);\n    dimsDialog.dialog('open');\n  }\n  showCurrentValue(tzFunction) {\n    let currentTime = dayjs(window.timelinectl.timeline.getCustomTime('current'))[tzFunction]();\n    for (const other_target of this.targets) {\n      for (let numSeries = 0; numSeries < other_target.data.length; numSeries++) {\n        const xx = other_target.data[numSeries].x;\n        if (xx.length === 0)\n          continue\n        for (const [ix, xxx] of Object.entries(xx)) {\n          const m_xxx = dayjs(xxx);\n          if (m_xxx.isAfter(currentTime)) {\n            if (ix == 0) break;\n            currentTime = dayjs(xx[ix - 1])[tzFunction]();\n            break;\n          }\n        }\n        const layout = other_target.layout;\n        const range = layout.xaxis.range.map(x => dayjs(x));\n        const dx = (currentTime - range[0]) / (range[1] - range[0]);\n        const xpx = (layout.width - layout.margin.l - layout.margin.r) * dx;\n        Plotly.Fx.hover(other_target, { xpx }, undefined, true);\n        break;\n      }\n    }\n  }\n\n  loadGraphs(jsons, layers, data_plumas_mapping, group_dims, tabs) {\n    let tzFunction = 'local';\n    const info = jsons[0].value;\n    let title = this.poi.name;\n    if (!title) {\n      title = info.success ? info.name + ' ' : '';\n      title += '(' + this.coordXY(info.pt) + ')';\n      if ('mdt' in info) {\n        title += ` ${info.mdt.title}: ${info.mdt.value}`;\n        this.mdt = info.mdt.id_mdt;\n      }\n    }\n    this.title = title;\n    jsons.shift();\n    this.target.find('h3').remove();\n    this.target.find('h5').remove();\n    this.target.find('h6').remove();\n    this.target.find('div.graph').addClass('delenda');\n    this.target.find('div.info_tabla').empty();\n    const all_data = [];\n    const subplots = [];\n    const yaxises = {};\n    const unit_mapping = {};\n    const order_mapping = {};\n    const var_mapping = {};\n    let can_be_grouped = false;\n    this.set('can_export2Excel', jsons.length > 0);\n    let y_idx = this.group_by_unit || this.print_pluma || group_dims ? -1 : 0;\n    for (const [idx, json] of jsons.entries()) {\n      if (json.status == 'rejected')\n        continue\n      const lyr = layers[idx];\n      if (this.showMultiRun) {\n        const features = json.value.features[0].features;\n        const features_by_base_time = Object.groupBy(features, f => f.properties.base_time)\n        let dimming = 1;\n        for (const features of Object.values(features_by_base_time)) {\n          json.value.features[0].features = features;\n          [y_idx, can_be_grouped] = this.carga_serie(lyr, all_data, subplots, yaxises, json, data_plumas_mapping, idx, group_dims, can_be_grouped, unit_mapping, var_mapping, order_mapping, y_idx, tabs, dimming);\n          dimming *= 4;\n        }\n        json.value.features[0].features = features\n      }\n      else\n        [y_idx, can_be_grouped] = this.carga_serie(lyr, all_data, subplots, yaxises, json, data_plumas_mapping, idx, group_dims, can_be_grouped, unit_mapping, var_mapping, order_mapping, y_idx, tabs);\n    }\n    for (const idx of [1, 2, 3])\n      this.target.removeClass(`subplots_${idx}`)\n    for (const idx of [1, 2, 3])\n      this.target.removeClass(`subplots_info_${idx}`)\n    this.target.addClass(`subplots_info_${this.info_tabla.find('tr').length}`);\n    this.target.addClass(`subplots_${y_idx + 1}`);\n    if (this.isDialog) {\n      this.target.dialog('option', 'title', this.title);\n    }\n    else {\n      const jqTitle = $(`<h3>${this.title}</h3>`);\n      this.target.append(jqTitle);\n    }\n    this.set('can_be_grouped', can_be_grouped);\n    for (const subplot of new Set(subplots)) {\n      const data = all_data.filter(d => 'x' + d.yaxis == subplot);\n      for (const datum of data)\n        if ('serie' in datum)\n          for (const [k, v] of Object.entries(datum.serie))\n            datum[k] = v;\n      const jqTarget = $('<div class=\"graph\"></div>');\n      const target = jqTarget[0];\n      this.targets.push(target);\n      const titles = {};\n      if (this.analyers) {\n        const legend = data[0].fixed_times[0] + data[0].legend_title;\n        const new_data = data.map(d => [d.layer_name, d.y[0], d.short_name]);\n        new_data.sort((d1, d2) => d2[1] - d1[1]);\n        new_data.splice(0, new_data.length, ...new_data.filter(d => d[1] >= parseFloat(this.threshold)));\n        if (new_data.length === 0) {\n          return;\n        }\n        data.splice(0);\n        data.push({\n          x: new_data.map(x => x[2]),\n          y: new_data.map(x => x[1]),\n          hovertext: new_data.map(x => x[0]),\n          hoverinfo: 'text+y',\n          fixed_times: [],\n          layout: {\n            xaxis: {\n              type: 'category',\n              automargin: true,\n            },\n            yaxis: {\n              range: [0, 100],\n            }\n          },\n          name: legend,\n          type: 'bar'\n        })\n        this.target.append(jqTarget);\n      } else if (this.print_pluma) {\n        // if (data[0]?.dim_name != data[0]?.dim_title) {\n        const target_tab = tabs.find(`#tabs_Graph-${data[0]?.dim_id}`);\n        if (!target_tab.find(`h4#${data[0]?.layer_loc}`).length)\n          target_tab.append(`<h4 id=\"${data[0]?.layer_loc}\">${data[0]?.layer_name}</h4>`);\n        if (data[0]?.obj_name && !target_tab.find(`h4#object_${data[0]?.obj_count}`).length)\n          target_tab.append(`<h4 id=\"object_${data[0]?.obj_count}\">${data[0]?.obj_name}</h4>`);\n        if (data[0]?.dim_title_opt != data[0]?.name) {\n          target_tab.append(`<h5>${data[0]?.dim_title}: ${data[0]?.dim_title_opt}</h5>`);\n          target_tab.append(`<h6>${data[0]?.dim_name}</h6>`);\n        }\n        target_tab.append(jqTarget);\n        // }\n      } else {\n        let idx = 0;\n        for (const [i, v] of data.entries()) {\n          if (group_dims && v.name != v.layer_name) {\n            v.legendgroup = v.layer_name;\n            v.hovertemplate = `${v.name} %{customdata:.2f}`;\n            if (!titles[v.layer_name] && i === 0) {\n              titles[v.layer_name] = {};\n            } else {\n              if (v?.marker?.color) {\n                v.marker = {};\n                v.marker.color = getColor(idx++);\n              }\n            }\n            v.name = `${v.layer_name} ${v.legend_title}`;\n          }\n          if (v.dynDate)\n            v.name += ` <br>⏲ ${v.dynDate.utc().format('DD-MM-YYYY HH')}h UTC`;\n        }\n        this.target.append(jqTarget);\n      }\n      if (data[0].fixed_times.length > 0 || window.time_type?.locator == '1D')\n        tzFunction = 'utc';\n      tabs.tabs();\n      data[0].layout = data[0].layout || {};\n      if (Object.keys(titles).length) {\n        data[0].layout.margin = {\n          l: 50,\n          r: 0,\n          b: 50,\n          t: 55,\n          pad: 4\n        };\n        data[0].layout.xlegend = {\n          title: {\n            text: data[0].legend_title,\n            font: { family: \"'Alegreya Sans', Arial, sans-serif\", size: 12 },\n          },\n          xanchor: 'left',\n          x: 0,\n          yanchor: 'bottom',\n          y: 1,\n          orientation: \"h\",\n          bgcolor: 'rgba(255,255,255,.5)',\n        };\n      }\n      this.create_graph(target, data, tzFunction, yaxises[subplot]);\n    }\n    this.target.find('div.graph.delenda').remove();\n    if (this.analyers) {\n      return;\n    }\n    if (this.targets.length) {\n      const target = this.targets[0];\n      if (!target.layout.xaxis.ticktext?.length && !this.analyers)\n        window.setTimeout(() => this.showCurrentValue(tzFunction), 200);\n      if (this.targets.length > 1) {\n        let [mrange0, mrange1] = target.layout.xaxis.range;\n        for (const target of this.targets) {\n          const [range0, range1] = target.layout.xaxis.range;\n          if (range0 < mrange0)\n            mrange0 = range0\n          if (range1 > mrange1)\n            mrange1 = range1\n        }\n        const range = {\n          \"xaxis.range[0]\": mrange0,\n          \"xaxis.range[1]\": mrange1,\n        }\n        target.emit('plotly_relayout', range);\n      }\n    }\n  }\n  carga_serie(lyr, all_data, subplots, yaxises, json, data_plumas_mapping, idx, group_dims, can_be_grouped, unit_mapping, var_mapping, order_mapping, y_idx, tabs, dimming) {\n    const { listOfDates, listOfValues, listOfTable, listOfFixed_times, listOfDimMapping } = (json.value?.features) ? layerdataFromJson(json.value, lyr) : elementdataFromJson(json.value, this.getMap(), lyr, tabs);\n    if (!dimming)\n      dimming = 1;\n    let count_obj = -1;\n    for (const [name_obj, arrayOfValues] of Object.entries(listOfValues)) {\n      const arrayOfDates = listOfDates[name_obj];\n      const arrayOfTable = listOfTable[name_obj];\n      const arrayOfFixed_times = listOfFixed_times[name_obj];\n      const arrayOfDimMapping = listOfDimMapping[name_obj];\n      ++count_obj;\n      for (const [i_serie, values] of arrayOfValues.entries()) {\n        const dates = arrayOfDates[i_serie];\n        const table = arrayOfTable[i_serie] || [];\n        const fixed_times = arrayOfFixed_times[i_serie] || [];\n        const extra = lyr._extra;\n        const unit = lyr._layer.effective_unit;\n        const order = lyr.order || lyr._pageLayer.order;\n        let data_pluma = data_plumas_mapping[idx] || [];\n        if (arrayOfDimMapping.length) {\n          idx = i_serie;\n          data_pluma = arrayOfDimMapping[idx];\n        }\n        if (this.group_by_unit) {\n          if (unit in unit_mapping) {\n            y_idx = unit_mapping[unit];\n            can_be_grouped = true;\n          } else {\n            y_idx++;\n            unit_mapping[unit] = y_idx;\n          }\n        } else if (extra.with) {\n          y_idx = order_mapping[extra.with];\n        } else if (group_dims) {\n          const v = data_pluma?.title_opt == data_pluma?.name_opt ?\n            lyr._layer.id + '-' + data_pluma?.id + '-' + String(count_obj) :\n            lyr._layer.id + '-' + data_pluma?.title_opt + '-' + String(count_obj);\n          if (v in var_mapping) {\n            y_idx = var_mapping[v];\n          } else {\n            var_mapping[v] = ++y_idx;\n          }\n        } else {\n          y_idx = idx;\n        }\n        order_mapping[order] = y_idx;\n        if (unit in unit_mapping)\n          can_be_grouped = true;\n        else\n          unit_mapping[unit] = true;\n        if (!$.isEmptyObject(table)) {\n          let columns = extra.info;\n          let label_columns = extra.columns;\n          const table_info = extra.table_info;\n          const nexttotitle = extra.nexttotitle;\n          if (typeof columns === 'string')\n            columns = [columns];\n          if (Array.isArray(columns)) {\n            const columnsObject = {};\n            for (const [i, k] of columns.entries())\n              if (typeof k === 'string')\n                columnsObject[' '.repeat(i)] = `<%= ${k} %>`;\n              else\n                mergeDeep(columnsObject, k);\n            columns = columnsObject;\n          }\n          const tr_title = $(`<tr><td class=\"negrita-main-color\">${lyr._layer.name_and_unit}:</td></tr>`)\n          this.info_tabla.append(tr_title);\n          if (table_info) {\n            const table_info_element = $('<table><thead><tr></tr></thead><tbody></tbody></table>');\n            for (const [it, t] of Object.entries(table)) {\n              const row = $('<tr></tr>');\n              if (label_columns) {\n                const colspan = label_columns.length || 0;\n                for (const col of Object.values(label_columns)) {\n                  if (it == \"0\")\n                    table_info_element.find('thead tr').append(\n                      $(`<th colspan=${colspan} class=\"negrita-main-color\">${col.alias}</th>`)\n                    )\n                  row.append($(`<td colspan=${colspan}>${t[col.id] || '---'}</td>`))\n                }\n                table_info_element.find('tbody').append(row);\n              }\n              else {\n                if (columns) {\n                  const colspan = Object.entries(columns).length || 0;\n                  for (const templateIn of Object.values(columns)) {\n                    const _template = template(templateIn);\n                    let content;\n                    try {\n                      content = _template(t);\n                    } catch {\n                      content = null;\n                    }\n                    row.append($(`<td colspan=${colspan}>${content || '---'}</td>`))\n                  }\n                  table_info_element.find('tbody').append(row);\n                }\n                else {\n                  for (const [k, vvv] of Object.entries(t)) {\n                    if (vvv !== null && vvv !== '')\n                      this.info_tabla.append($(`<tr><td>${k}</td><td>${vvv != null ? vvv : 'n/a'}</td></tr>`));\n                  }\n                }\n              }\n            }\n            this.info_tabla.append(table_info_element);\n          }\n          else\n            for (const [it, t] of Object.entries(table)) {\n              if (columns) {\n                let row = tr_title;\n                if (!nexttotitle) {\n                  row = $('<tr></tr>')\n                  this.info_tabla.append(row);\n                }\n\n                for (const [title, templateIn] of Object.entries(columns)) {\n                  const _template = template(templateIn);\n                  try {\n                    title ? row.append($(`<td>${title}</td><td>${_template(t)}</td>`))\n                      : row.append($(`<td>${_template(t)}</td>`));\n                  }\n                  catch {\n                    row.append($(`<td>${title}</td><td>---</td>`));\n                  }\n                }\n                if (nexttotitle && table.length != Number(it) + 1)\n                  row.append(', ');\n              }\n              else\n                for (const [k, vvv] of Object.entries(t)) {\n                  if (vvv !== null && vvv !== '')\n                    this.info_tabla.append($(`<tr><td>${k}</td><td>${vvv != null ? vvv : 'n/a'}</td></tr>`));\n                }\n            }\n        }\n        if ($.isEmptyObject(dates))\n          continue;\n        const text = extra.text;\n        const y = text ? values.map(() => 1) : values;\n        let name = lyr._pageLayer.folder ?\n          lyr._pageLayer.folder + ' - ' + lyr._title :\n          lyr._title;\n        const data = {\n          x: dates,\n          y: y.length ? y : [0],\n          line: { color: getColor(idx, dimming), width: 1.5 },\n          customdata: values.length ? values : [NaN],\n          name: data_pluma?.title_opt ? data_pluma?.name_opt || data_pluma?.title_opt : data_pluma?.title_dims ? data_pluma?.title_dims : name,\n          layer_name: data_pluma?.element_name ? data_pluma?.element_name : name,\n          legend_title: data_pluma.dims_names,\n          obj_name: name_obj,\n          obj_count: count_obj,\n          layer_loc: lyr._layer?.source_type?.locator || lyr._layer.servicelayer,\n          yaxis: `y${y_idx == 0 ? '' : y_idx + 1}`,\n          hovertemplate: '%{customdata:.2f}',\n          hoverinfo: 'x+y',\n          hoverlabel: {\n            namelength: 0,\n          },\n          dim_name: data_pluma?.name,\n          dim_title: data_pluma?.title,\n          dim_title_opt: data_pluma?.title_opt,\n          dim_id: data_pluma?.id,\n          dimensions: data_pluma?.dimensions,\n          infoDims: data_pluma?.infoDims,\n          groupByValue: this.get('groupByValue'),\n          fixed_times,\n          ...extra\n        };\n        if (this.getMap().get('graph_show_run_time'))\n          data.dynDate = lyr._dynDate;\n        if (extra?.marker?.color)\n          data.line.color = extra.marker.color\n        data.zorder = 99 - idx;\n        all_data.push(data);\n        subplots.push(`x${data.yaxis}`)\n        yaxises[`xy${y_idx == 0 ? '' : y_idx + 1}`] = text ? {\n          zeroline: false, showgrid: false, showline: false,\n          ticks: '',\n          showticklabels: false,\n        } : {};\n      }\n    }\n    return [y_idx, can_be_grouped];\n  }\n  create_graph(target, data, tzFunction, yaxis) {\n    const self = this;\n    const layout_extra = 'layout' in data[0] ? data[0].layout : {};\n    let minx = '9999', maxx = '0000';\n    delete data[0].layout;\n    let range;\n    if (layout_extra?.xaxis?.type !== 'category') {\n      for (const datum of data) {\n        minx = minx < datum.x[0] ? minx : datum.x[0];\n        maxx = maxx > datum.x.slice(-1)[0] ? maxx : datum.x.slice(-1)[0];\n        delete datum.yaxis;\n        datum.x = datum.x.map(x => dayjs(x)[tzFunction]().format());\n      }\n      range = [minx, maxx].map(x => dayjs(x));\n      const xmargin = dayjs.duration((range[1] - range[0]) / 10);\n      range[0] = range[0].subtract(xmargin);\n      range[1] = range[1].add(xmargin);\n      range = range.map(x => x[tzFunction]().format());\n      target.range = [...range];\n      range = this.zoomRange ? this.zoomRange.map(\n        x => dayjs(x)[tzFunction]().format()) : range;\n    }\n    let fixed_times = [];\n    if (data[0].fixed_times.length > 0) {\n      // ordenamos los valores, y nos aseguramos que para cada x haya un valor y\n      const data_sorted = Array.from(\n        new Map(\n          data.flatMap(datum =>\n            datum.x.map((xValue, index) =>\n              [`${xValue}-${datum.fixed_times[index]}`, { x: xValue, fixed_times: datum.fixed_times[index] }]\n            )\n          )\n        ).values()\n      ).sort((a, b) => new Date(a.x) - new Date(b.x));\n\n      fixed_times = data_sorted.map(item => item.fixed_times);\n      const new_x = [];\n      const new_y = [];\n      for (const ft of fixed_times) {\n        const item = data[0].fixed_times.find(fixedTime => fixedTime === ft);\n        if (item) {\n          const index = data[0].fixed_times.indexOf(ft);\n          new_x.push(data[0].x[index]);\n          new_y.push(data[0].y[index]);\n        } else {\n          new_x.push(data_sorted.find(item => item.fixed_times === ft)?.x || null);\n          new_y.push(null);\n        }\n      }\n      data[0].fixed_times = fixed_times;\n      data[0].x = new_x;\n      data[0].y = new_y;\n    }\n    else {\n      fixed_times = data[0].fixed_times;\n    }\n    // si hay varias gŕaficas tomamos el eje x con más valores\n    const tickvals = Array.from(new Set(\n      (data || []).flatMap(t => Array.isArray(t?.x) ? t.x : [])\n    )).sort((a, b) => new Date(a) - new Date(b));\n    const layout = {\n      font: { family: \"'Alegreya Sans', Arial, sans-serif\", size: 12 },\n      margin: {\n        l: 50,\n        r: 0,\n        t: 30,\n        pad: 4\n      },\n      hoverlabel: {\n        bordercolor: 'transparent',\n        bgcolor: 'rgba(255,255,255,.9)',\n      },\n      legend: {\n        xanchor: 'left',\n        x: 0,\n        yanchor: 'bottom',\n        y: 1,\n        orientation: \"h\",\n        bgcolor: 'rgba(255,255,255,.5)',\n      },\n      showlegend: true,\n\n      hovermode: 'x unified',\n      xaxis: {\n        showgrid: true,\n        gridcolor: 'silver',\n        tickformat: '%Hh\\n%d-%m-%Y',\n        range,\n        automargin: true,\n      },\n      yaxis: {\n        ...yaxis,\n        fixedrange: true // bloquea zoom y pan vertical\n      },\n      ...layout_extra\n    };\n    if (tickvals.length <= 16) {\n      layout.xaxis.type = 'date';\n      layout.xaxis.tickmode = \"array\"; // modo manual por lista\n      layout.xaxis.tickvals = tickvals; // imponemos valores del eje x\n    }\n    if (fixed_times.length > 0) {\n      layout.xaxis.ticktext = fixed_times;\n      layout.xaxis.type = 'category';\n    } else if (window.time_type?.locator == '1MO') {\n      layout.xaxis.tickformat = '%B\\n%Y';\n    } else if (window.time_type?.locator == '1D') {\n      layout.xaxis.tickformat = '%a %d\\n%m-%Y';\n    } else if (['1H', '1D_1H', 'TIME'].includes(\n      window.time_type?.locator) &&\n      // (diez)minutales\n      !data[0].x.every(x => x.match(/00:00[+-]/))) {\n      layout.xaxis.tickformat = '%H:%M\\n%d-%m-%Y';\n    }\n    if (window.innerWidth < 700 - 100)\n      layout.width = window.innerWidth - 100;\n\n    Plotly.newPlot(target, data, layout, {\n      locale: locale,\n      displayModeBar: false,\n    }).then(function (g) {\n      for (const trace of g.data) {\n        if (trace.text && !self.analyers) {// Hay que rotar las etiquetas esta dirección\n          const flechas = $(g).find('svg g.textpoint text')\n          for (let i = 0; i < trace.customdata.length; i++) {\n            const angle = trace.customdata[i];\n            const flecha = flechas[i];\n            flecha.setAttribute(\"style\",\n              flecha.getAttribute(\"style\") +\n              `transform:rotate(${angle}deg);\n                 transform-box:fill-box;\n                 transform-origin:center;`);\n          }\n        }\n      }\n    });\n    target.on('plotly_legendclick', () => false);\n    target.base_data = [...data];\n\n    target.on('plotly_unhover', eventdata => {\n      if (self.analyers)\n        return;\n      for (const other_target of this.targets) {\n        if (target != other_target)\n          Plotly.Fx.unhover(other_target, eventdata.event, undefined, true);\n      }\n    })\n    target.on('plotly_hover', eventdata => {\n      if (self.analyers)\n        return;\n      for (const other_target of this.targets) {\n        if (target != other_target)\n          Plotly.Fx.hover(other_target, eventdata.event, undefined, true);\n      }\n    });\n    target.on(\"plotly_relayout\", ed => {\n      if (this._syncingRange)\n        return;\n      const isReset = 'xaxis.autorange' in ed || Array.isArray(ed['xaxis.range']);\n      if (isReset) {\n        // con un doble clic en al menos una capa se reinician todas\n        this.zoomRange = null;\n        this._syncingRange = true;\n        Promise.all(this.targets.map(div =>\n          Plotly.relayout(div, { \"xaxis.range[0]\": div.range[0], \"xaxis.range[1]\": div.range[1] })\n        )).then(() => { this._syncingRange = false; });\n        return;\n      }\n      if (!('xaxis.range[0]' in ed || 'xaxis.range[1]' in ed))\n        return;\n      this.zoomRange = [\n        dayjs(ed[\"xaxis.range[0]\"]).toISOString(),\n        dayjs(ed[\"xaxis.range[1]\"]).toISOString(),\n      ];\n      this._syncingRange = true;\n      // aplicamos el mismo rango a todas las capas\n      Promise.all(this.targets.map(div => {\n        const x = div.layout.xaxis;\n        return (x.range[0] != ed[\"xaxis.range[0]\"] || x.range[1] != ed[\"xaxis.range[1]\"]) && Plotly.relayout(div, ed);\n      })).then(() => { this._syncingRange = false; });\n    });\n  }\n\n  async toExcel(zip) {\n    const headers_dimensions = [];\n    const data_rows = [];\n    const rangeFrom = this.zoomRange ? dayjs(this.zoomRange[0]) : null;\n    const rangeTo = this.zoomRange ? dayjs(this.zoomRange[1]) : null;\n    const inRange = m => (!rangeFrom || !m.isBefore(rangeFrom)) && (!rangeTo || !m.isAfter(rangeTo));\n    for (const [idx, json] of this.jsons.entries()) {\n      if (json.status == 'rejected')\n        continue\n      const lyr = this.layers[idx];\n      const layer = lyr._layer;\n      const { listOfDates, listOfValues, listOfTable, listOfFixed_times } = layerdataFromJson(json.value, lyr);\n      const dates = listOfDates[''][0];\n      const values = listOfValues[''][0];\n      const table = listOfTable[''][0];\n      const fixed_times = listOfFixed_times[''][0];\n      const dimensions = layer?.source_type && layer?.source_type?._dimension_controls;\n      if (dimensions)\n        for (const [k, dim] of Object.entries(dimensions)) {\n          if (headers_dimensions.some((h) => h.key == dim.id) || k.includes('HOR'))\n            continue;\n          headers_dimensions.push({ header: dim.name, key: dim.id, width: 15 })\n        }\n      const layerActualDims = layer?.source_type?.dimensions.map(d => d.locator);\n      for (let [i_value, value] of values.entries()) {\n        let full_name = layer?.name_and_unit;\n        const json_dimensions = {};\n        if (dimensions) {\n          const dimData = this.dimDataByLayer[idx];\n          for (const [k, dim] of Object.entries(dimensions)) {\n            if (k.includes('HOR'))\n              continue;\n            if (!layerActualDims.includes(k))\n              continue;\n            json_dimensions[dim.id] = dimData[k][1] || dim.value;\n          }\n          full_name += ' ' + Object.values(json_dimensions).map(x => x).join('/');\n        }\n        const effective_time = fixed_times.length ? fixed_times[i_value] : dayjs(dates[i_value])\n        if (!fixed_times.length && !inRange(effective_time))\n          continue;\n        const unit = layer?.locator_unit ? layer.locator_unit : layer?.effective_unit;\n\n        if (value != null)\n          value = parseFloat(value.toFixed(2));\n        data_rows.push({ 'name': full_name, 'var': lyr?._serviceLayer, 'u': unit, ...json_dimensions, 'hor': fixed_times.length ? effective_time : new Date(effective_time.utcOffset(0, true).toDate()), 'val': value });\n      }\n      for (const row of table.values()) {\n        let name = layer?._title;\n        let effective_time, val;\n        for (const [col, value] of Object.entries(row)) {\n          if (col == 'datetime') {\n            let dt = value.replaceAll(',', '');\n            if (!dt.includes('Z')) dt = dt.concat('Z');\n            effective_time = dayjs(dt, 'DD-M-YYYY HH:mm:ss');\n            effective_time.$x ??= {};\n          }\n          if (col == 'name') name = (value == '-') ? name : value;\n          if (col == 'value') val = value;\n        }\n        if (effective_time && !inRange(effective_time))\n          continue;\n        const unit = layer?.locator_unit ? layer.locator_unit : layer?.effective_unit;\n        data_rows.push({ 'name': name, 'var': lyr?._serviceLayer, 'u': unit, 'hor': new Date(effective_time?.utcOffset(0, true).toDate()), 'val': val });\n      }\n    }\n    const headers = [\n      { header: window.gettext('Nombre'), key: 'name', width: 15 },\n      { header: window.gettext('Variable'), key: 'var', width: 15 },\n      { header: window.gettext('Unidad'), key: 'u', width: 15 },\n      ...headers_dimensions,\n      { header: window.gettext('Horizonte'), key: 'hor', width: 25, style: { numFmt: 'DD-MM-YYYY HH:mm' } },\n      { header: window.gettext('Valor'), key: 'val', width: 15 },\n    ]\n    const wb = new Excel.Workbook();\n    const ws = wb.addWorksheet('My Sheet');\n    const fileName = this.title.replace(/\\s+/g, '');\n    ws.columns = headers;\n    ws.addRows(data_rows);\n    const buffer = await wb.xlsx.writeBuffer();\n    const fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n    const fileExtension = '.xlsx';\n    const blob = new Blob([buffer], { type: fileType });\n    if (zip)\n      zip.file(fileName + fileExtension, blob);\n    else\n      saveAs(blob, fileName + fileExtension);\n  }\n}\n\n\nfunction layerdataFromJson(features, lyr) {\n  const values = [];\n  const dates = [];\n  const table = [];\n  let fixed_times = [];\n  const listOfValues = { '': [values] };\n  const listOfDates = { '': [dates] }\n  const listOfTable = { '': [table] }\n  const listOfFixed_times = { '': [fixed_times] }\n  const listOfDimMapping = { '': [] }\n  if (features.features.length == 0) return { listOfDates, listOfValues, listOfTable, listOfFixed_times, listOfDimMapping };\n  const variable = features.features[0];\n  if (features.features.length == 1 &&\n    variable.type == \"FeatureCollection\" &&\n    variable.features.length == 0)\n    return { listOfDates, listOfValues, listOfTable, listOfFixed_times, listOfDimMapping };\n  if (variable.type === 'FeatureCollection') {\n    const v = variable.features[0];\n    if (v && v.properties.data_history) {\n      const arrayFeatures = v.properties.data_history.features[0].features;\n      for (const h of arrayFeatures) {\n        const tab = {};\n        const prop = h.properties;\n        const time_prop = 'time' in prop ? prop['time'] : prop['timestamp'];\n        dates.push(time_prop);\n        values.push(h.value);\n        for (const k in prop) {\n          const vv = format(prop[k]);\n          tab[k] = vv;\n        }\n        table.push(tab);\n      }\n    } else if (!variable.has_time) {\n      for (const v of variable.features) {\n        const single_table = {}\n        if (v.properties.value === null)\n          continue\n        for (const [k, vvv] of Object.entries(v.properties)) {\n          if (vvv !== null && vvv !== '')\n            single_table[k] = format(vvv);\n        }\n        table.push(single_table);\n      }\n    } else { // gráfica de raster\n      for (const [i_v, v] of variable.features.entries()) {\n        const prop = v.properties;\n        if (i_v == 0)\n          lyr.setCalculatedDate(prop);\n        const value = prop.value;\n        if (prop.fixed_times)\n          fixed_times.push(prop.fixed_times);\n        const time_prop = 'time' in prop ? prop['time'] : prop['timestamp'];\n        values.push(value);\n        dates.push(time_prop);\n      }\n    }\n    return { listOfDates, listOfValues, listOfTable, listOfFixed_times, listOfDimMapping };\n  }\n}\n\nfunction elementdataFromJson(json, mapa, lyr, tabs) {\n  const calc_vars = Object.groupBy(json.data, function (x) {\n    if (x.dimension_values)\n      return x.type.name;\n  });\n  const name_vars = Object.groupBy(json.data, function (x) {\n    return x.type.name;\n  });\n  const map_dimensions = mapa.get('dimension_controls') || {};\n  const listOfDates = {};\n  const listOfValues = {};\n  const listOfTable = {};\n  const listOfFixed_times = {};\n  const listOfDimMapping = {};\n  for (const [type, data] of Object.entries(calc_vars)) {\n    const arrayOfDates = [];\n    const arrayOfValues = [];\n    const arrayOfTable = [];\n    const arrayOfFixed_times = [];\n    const arrayOfDimMapping = [];\n    if (!(type in name_vars))\n      continue;\n    const dim_mapping = {};\n    let horizon_dim;\n    const data_dim = Object.keys(data[0].dimension_values);\n    const horizon_name = get_horizon(data_dim);\n    for (const [i, v] of Object.entries(map_dimensions)) {\n      if (i.includes('HOR')) {\n        horizon_dim = v;\n        continue;\n      }\n      if (i in data[0].dimension_values)\n        dim_mapping[i] = v.options;\n    }\n    const ret = getCombinatedDims(dim_mapping, tabs, map_dimensions, null, [], [], [], lyr);\n    let info_dim_data = ret['data_plumas_mapping']\n    info_dim_data = Object.groupBy(info_dim_data, function (x) {\n      return x.title_opt;\n    });\n    for (const [n_opt, info_dim_series] of Object.entries(info_dim_data)) {\n      for (const info_dim_serie of info_dim_series) {\n        const id = info_dim_serie['id'];\n        let id2 = info_dim_serie['id2'];\n        if (!id2) id2 = id;\n        const ordered = Object.groupBy(data, function (x) {\n          if (x.dimension_values[id] == n_opt && x.dimension_values[id2] == info_dim_serie['name_opt'])\n            return x.dimension_values[horizon_name]\n        })\n        const { dates, values, fixed_dates } = createItems(ordered, horizon_dim.options, info_dim_serie);\n        info_dim_serie['element_name'] = json.element_type.name + ': ' + json.name;\n        if (dates.length) {\n          arrayOfDates.push(dates);\n          arrayOfValues.push(values);\n          arrayOfFixed_times.push(fixed_dates);\n          arrayOfDimMapping.push(info_dim_serie);\n        }\n      }\n    }\n    listOfDates[type] = arrayOfDates;\n    listOfValues[type] = arrayOfValues;\n    listOfTable[type] = arrayOfTable;\n    listOfFixed_times[type] = arrayOfFixed_times;\n    listOfDimMapping[type] = arrayOfDimMapping;\n  }\n  return { listOfDates, listOfValues, listOfTable, listOfFixed_times, listOfDimMapping }\n}\n\nfunction createItems(ordered_values, horizon_opt) {\n  const values = [];\n  const dates = [];\n  const fixed_dates = [];\n  for (const opt of horizon_opt) {\n    if (!(opt in ordered_values)) continue;\n    for (const data of ordered_values[opt].values()) {\n      let fixedYears = true;\n      const ef_time = opt.length == 4 ? opt + '-01-01T00:00Z' : opt;\n      if (opt.length != 4)\n        fixedYears = false;\n      if (data) {\n        values.push(data.value);\n        dates.push(dayjs(ef_time).toDate());\n        if (fixedYears)\n          fixed_dates.push(opt);\n      }\n    }\n  }\n  return { dates, values, fixed_dates };\n}\n\nfunction getCombinatedDims(dim_mapping, tabs, map_dimensions, this_url, data_plumas_mapping, urls_plumas, layers_by_graphs, layer) {\n  const combinations = cartesian(dim_mapping);\n  const dim_mapping_length = Object.keys(dim_mapping).length;\n  for (const i of Object.keys(dim_mapping)) {\n    let id_dim2;\n    id_dim2 = Object.keys(dim_mapping).filter(d => d != i);\n    if (tabs.find('li').length < dim_mapping_length) {\n      tabs.find('ul').append(`<li><a href=\"#tabs_Graph-${map_dimensions[i].id}\"></a>${map_dimensions[i].name}</li>`);\n      tabs.append($(`<div id=\"tabs_Graph-${map_dimensions[i].id}\"></div>`));\n    }\n    const grouped_combinations = Object.groupBy(combinations, (c) => {\n      return c[i];\n    });\n    for (const cbx of Object.values(grouped_combinations)) {\n      for (const dim of Object.values(cbx)) {\n        const data = { 'id': map_dimensions[i].id, 'title': map_dimensions[i].name, 'title_opt': dim[i][0], 'name': '', 'name_opt': '', }\n        if (id_dim2) data['id2'] = id_dim2[0];\n        for (const [n_op, dim_op] of Object.entries(dim)) {\n          if (this_url)\n            this_url = this_url.replace(new RegExp(`(${n_op}=)[^&]*(.*)`), '$1' + dim_op[0] + '$2');\n          if (!(dim_mapping_length > 1 && i == n_op)) {\n            data['name'] = map_dimensions[n_op].name;\n            data['name_opt'] = String(dim_op[0]);\n          }\n        }\n        urls_plumas.push(this_url);\n        data_plumas_mapping.push(data);\n        layers_by_graphs.push(layer);\n      }\n    }\n  }\n  return { data_plumas_mapping, layers_by_graphs, urls_plumas }\n}\nfunction getTimeParams(layer) {\n  const params = {};\n  const days_back = layer.get('extra').days_back;\n  const days_forward = layer.get('extra').days_forward;\n  const round_to_days = days_back || days_forward;\n  const t1_iso = layer.getSource().getParams()['TIME'];\n  const t1p = dayjs(t1_iso).utc();\n  const t1 = round_to_days ? t1p.startOf('date') : t1p;\n  if (days_back && days_forward) {\n    const t2 = t1.subtract(days_back, 'days');\n    const t3 = t1.add(days_forward, 'days');\n    params.TIME = t2.format() + '/' + t3.format();\n  } else if (days_forward) {\n    const t2 = t1;\n    const t3 = t1.add(days_forward, 'days');\n    params.TIME = t2.format() + '/' + t3.format();\n  } else if (days_back) {\n    const t2 = t1.subtract(days_back, 'days')\n    const t3 = t1.add(1)\n    params.TIME = t2.format() + '/' + t3.format();\n  } else {\n    params.TIME = t1_iso;\n    params.HORIZON = '__all__';\n  }\n  return params;\n}\nexport function crearControlesDimensiones(ol_map, dimension_controls, dimensions) {\n  if (!dimensions)\n    return;\n  for (const dim of dimensions) {\n    if (dim.value_type == 'PERIODIC')\n      continue;\n    const alreadyExists = dim.locator in dimension_controls;\n    const control = alreadyExists ? dimension_controls[dim.locator] : new DimensionControl(dim);\n    if (!alreadyExists) {\n      if (ol_map) {\n        ol_map.addControl(control);\n      } else {\n        $('#dimensions').append(control.element);\n        $('#dimensions').removeClass('hidden');\n      }\n      dimension_controls[dim.locator] = control;\n    }\n  }\n}\nclass DimensionControl extends Control {\n  constructor(dim) {\n    const html = $(`\n          <div id=\"${dim.locator}\" title=\"${dim.name}\" class=\"chProj combo dropdown \">\n          <span class='dim_title'></span>\n          <span class='dim_value'>...</span>\n          <i class=\"fas fa-sort-down\"></i>\n          <form class=\"dropdown-content\">\n          <ul class=\"dropdown-content\" id=\"${dim.locator}\">\n          </ul>\n          </form>\n          </div>\n          `)\n    html.on('click', function () {\n      html.toggleClass('listshown');\n    });\n    html.on('mouseleave', () => html.removeClass('listshown'));\n    dim.values.forEach((dimv) => {\n      const li = $(`<li value =\"${dimv[0]}\">${dimv[1]}</li>`);\n      html.find('ul').append(li);\n    });\n    const target = $('#dimensions');\n    target.removeClass('hidden');\n    super({\n      element: html[0],\n      target: target[0]\n    });\n    this.id = dim.locator;\n    this._options = dim.values;\n    this.name = dim.name;\n    html.find('span.dim_title').text(this.name);\n    this.value = dim.values[0][0];\n    html.find('span.dim_value').attr(\"value\", this.value);\n    const self = this;\n    html.find('li').on('click', function () {\n      html.find('span.dim_value').attr(\"value\", this.getAttribute('value'));\n      self.value = this.getAttribute('value');\n    });\n    this.html = html;\n    this.usage = 0;\n    this.html.toggle(false);\n  }\n  setMap(map) {\n    super.setMap(map);\n    const ov = map.getOverlayContainerStopEvent();\n    if ($(ov).closest('html').length)\n      $('#dimensions').appendTo(ov);\n    else\n      $('#dimensions').appendTo($('div.botonera'));\n  }\n\n  get options() {\n    return this._options;\n  }\n  get value() {\n    return this._value;\n  }\n  get caption() {\n    return this._caption;\n  }\n  set value(new_value) {\n    this._value = new_value;\n    const li = $(this.element).find(`li[value='${new_value}']`)\n    this._caption = li.text();\n    $(this.element).find('span.dim_value').text(this._caption);\n    this.set('value', this.value);\n    const mapa = this.getMap();\n    let info, dimension_controls;\n    if (mapa) {\n      info = mapa.get('info');\n      dimension_controls = mapa.get('dimension_controls');\n    }\n    if (dimension_controls) {\n      mapa.unset('dimension_controls');\n      mapa.set('dimension_controls', dimension_controls);\n    }\n    if (info) {\n      mapa.unset('info', true);\n      mapa.set('info', info);\n    }\n  }\n  use() {\n    this.enabled = ++this.usage > 0;\n  }\n\n  unuse() {\n    this.enabled = --this.usage > 0;\n  }\n\n  get enabled() {\n    return this.html.is(\":visible\");\n  }\n  set enabled(enabled) {\n    this.html.toggle(enabled);\n  }\n}\n\n","/*eslint no-implicit-globals: \"error\"*/\nimport { $, dayjs, flatpickr, getDTMessages, getFormCoords } from '../../../../moderna_meteogrid/statix/js/base.mjs';\n\nimport { actOnElement, createSimulation } from './simulaciones.mjs';\nimport { actOnElement as saverActOnElement, initializeMapa as saverInitializeMapa } from '../../../../saver/statix/js/mapa_elementos.mjs';\nimport BaseObject from 'ol/Object';\nimport { SaverElementsLayer } from '../../../../saver/statix/js/saver_layers.mjs';\nimport { showProblemDialog } from './mapa.mjs';\n\nconst emul_mapa = new BaseObject();\nsaverInitializeMapa(emul_mapa); //  FIXME: objeto global un poco feo\n\nfunction exportar(dt, layer_id, formato) {\n  const params = { ...dt.ajax.params() };\n  delete params.start;\n  delete params.length;\n  delete params.draw;\n  window.open(`${window.Urls.listingFile(layer_id)}?format=${formato}&${$.param(params)}`);\n}\n\nexport async function cargarTablas(ns, cfg) {\n  const coordForm = ns.page.find('.coord-input div.form');\n  window.site_cfg.site_epsgs.forEach(ep => {\n    const li = $(`<li value =\"${ep.code}\"></li>`)\n    li.text(ep.name + ' - ' + ep.code);\n    if (ep.code == window.epsg) {\n      li.addClass('select');\n      coordForm.find('div#projection input').val(li.text());\n      coordForm.find('div#projection input').attr('value', li.attr('value'));\n    }\n    coordForm.find('#latlon .chProj ul').append(li);\n  })\n  coordForm.find('div.combo-coord').on('click', function () {\n    $(this).find('div.dropdown').toggleClass('listshown');\n  })\n  coordForm.find('li').on('click', function () {\n    const input = $(this).parents('div.combo-coord').find('input');\n    input.val($(this).text());\n    input.attr('value', $(this).attr('value'))\n    $(this).parent().find('.select').removeClass('select')\n    $(this).addClass(\"select\");\n  })\n\n  ns.page.find('table.listado:visible').each(function (idx, table) {\n    const dt = cargarTablaMain(ns, table, cfg.pagelayer_set[idx]);\n    ns.page.find('table thead th[list]').each(async function () {\n      const elem = $(this);\n      const colId = this.getAttribute('col-id');\n      const colIdx = this.getAttribute('col-idx');\n      const selector = $(`<select class=\"form-control\" name=\"${colId}\"><option value=\"\" selected />${elem.text()}</selector>`);\n      elem.text('');\n      elem.append(selector);\n      const paramType = this.getAttribute('data-param-type');\n      const pagelayer_id = this.getAttribute('data-pagelayer-id');\n      if (colId == 'municipality__name') {\n        cargarMunicipios(selector);\n      } else if (paramType || pagelayer_id) {\n        const url = paramType ?\n          window.Urls.parameter_options(paramType) :\n          window.Urls.table_options_for_sourcetype(pagelayer_id, colId);\n        const response = await fetch(url);\n        const values = await response.json();\n        for (const m of values)\n          selector.append($(`<option>${m.name}</option>`))\n      }\n      selector.on('change', function (ev) {\n        dt\n          .column(colIdx)\n          .search($(this).val());\n        ev.preventDefault();\n      });\n    });\n    emul_mapa.on('change:update_elements', function () {\n      emul_mapa.set('update_elements', false, true);\n      dt.draw();\n    });\n\n  })\n}\n\nasync function cargarMunicipios(selector) {\n  const response = await fetch(window.Urls.municipalities());\n  const municipios = await response.json();\n  for (const m of municipios)\n    selector.append($(`<option>${m.name}</option>`))\n}\n\nexport function cargarTablaMain(ns, table, pageLayer) {\n  const buttons = [];\n  const layer_id = table.id.split('_')[2];\n  for (const action of window.parameters) {\n    if (action.type != 'LISTING_ACTION')\n      continue\n    if (action.parameter == 'CREATE_ELEMENT' && !(window.change_municipal_element || window.change_site_element))\n      continue\n    buttons.push({\n      text: `<i class=\"${action.CLASS}\"></i>`,\n      titleAttr: action.name,\n      action: function (evt, dt) {\n        if (action.parameter == 'XLSX_EXPORT')\n          exportar(dt, layer_id, 'xlsx')\n        else if (action.parameter == 'PDF_EXPORT')\n          exportar(dt, layer_id, 'pdf')\n        else if (action.parameter == 'CREATE_SIMULATION')\n          createSimulation('#' + table.id);\n        else if (action.parameter == 'CREATE_ELEMENT') {\n          const lyr = new SaverElementsLayer(pageLayer);\n          const filter = pageLayer.layer.source_type.model_query.filter;\n          if (filter.element_type__element_class__id)\n            lyr.element_class = [filter.element_type__element_class__id];\n          else\n            lyr.element_class = ',';\n          if (filter.element_type__id)\n            lyr.types = [filter.element_type__id];\n          if (filter.element_type__id__in)\n            lyr.types = filter.element_type__id__in;\n          lyr.createMapElement('#' + table.id);\n        }\n      }\n    });\n  }\n  const hideSearch = pageLayer.layer.extra?.hideSearch || pageLayer.extra?.hideSearch;\n  const hidePaging = pageLayer.layer.extra?.hidePaging || pageLayer.extra?.hidePaging;\n  const ret = $(table).DataTable({\n    language: getDTMessages(),\n    dom: `<'row'<'col-sm-6'r${hideSearch ? '' : 'f'}><'col-sm-6'B>>\n      <'row'<'col-sm-12't>>\n      <'row'<'col-sm-7'${hidePaging ? '' : 'i'}><'col-sm-5'${hidePaging ? '' : 'pl'}>>`,\n    fixedHeader: true,\n    lengthMenu: [20, 40, 80],\n    buttons: {\n      dom: {\n        button: {\n          tag: 'button'\n        }\n      },\n      buttons: buttons,\n      select: true,\n    },\n    pagingType: \"simple\",\n    retrieve: false,\n    serverSide: true,\n    processing: true,\n    searchDelay: 1000,\n    ajax: {\n      url: window.Urls.listing_json(layer_id),\n      dataSrc: 'data',\n    },\n    columnDefs: [{\n      // The `data` parameter refers to the data for the cell (defined by the\n      // `data` option, which defaults to the column being worked with, in\n      // this case `data: 0`.\n      orderable: false,\n      data: 0,\n      render: function (data) {\n        let ret = '';\n        for (const action of window.parameters) {\n          if (action.type != 'LISTING_ROW_ACTION')\n            continue\n          if ((action.parameter == 'EDIT_ELEMENT' || action.parameter == 'DELETE_ELEMENT') && !(window.change_municipal_element || window.change_site_element))\n            continue\n          // const action_id = action.parameter.replaceAll('_', ''); FIXME: 2022\n          const action_id = action.parameter.replace(/_/g, '');\n          ret += `<button title=\"${action.name}\" table_id=\"${table.id}\"\n                                 action=\"${action_id}\" id=\"${action_id}_${data}\"\n                                 class=\"${action.CLASS}\"></button>`;\n        }\n        if (ret === '')\n          ret += data;\n        return ret;\n      },\n      targets: 0\n    },],\n    drawCallback: function () {\n      const api = this.DataTable();\n      $(this).find('button').on('click', function (evt) {\n        evt.stopPropagation();\n        const data = api.row(this.closest('tr')).data();\n        const id = data[0];\n        const name = this.getAttribute('action');\n        evt.appendTo = '#listado_body';\n        evt.new_pos = {\n          my: 'center',\n          at: 'center',\n          of: evt.appendTo,\n          collision: 'fit',\n        };\n        if (name == 'OPENSIMULATION') {\n          window.open(window.Urls.simulation_page(id), '_blank');\n        } else if (name == 'EDITSIMULATION') {\n          evt.data = 'edit';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'SHARESIMULATION') {\n          evt.data = 'share';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'CLONESIMULATION') {\n          evt.data = 'clone';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'DELETESIMULATION') {\n          evt.data = 'delete';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'LOCKSIMULATION') {\n          evt.data = 'lock';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'INFOELEMENT') {\n          evt.data = 'info';\n          saverActOnElement.bind(this)(evt);\n        } else if (name == 'EDITELEMENT') {\n          evt.data = 'edit';\n          saverActOnElement.bind(this)(evt);\n        } else if (name == 'DELETEELEMENT') {\n          evt.data = 'delete';\n          saverActOnElement.bind(this)(evt);\n        } else if (name == 'GENERA5LANDFORECASTBEHAVE') {\n          evt.data = 'GEN_ERA5LAND_FORECAST_BEHAVE';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'FIREVIEWERA5LANDFORECASTBEHAVE') {\n          evt.data = 'FIRE_VIEW_ERA5LAND_FORECAST_BEHAVE';\n          actOnElement.bind(this)(evt);\n        } else if (name == 'DOWNLOADREPORT')\n          downloadReport(ns, data);\n      });\n    }\n  });\n  debounceSearch('#' + table.id);\n  $('#' + table.id).on('click', 'tr', function () {\n    $(this).toggleClass('selected');\n  });\n\n  return ret;\n}\n\nfunction verifyParameters(reportParameters) {\n  let ok = true;\n  const ask_for = this ? $(this).dialog('option', 'ask_for') : {};\n  const munis = reportParameters.find('select[name=\"municipality\"]');\n  const poi = reportParameters.find('select[name=\"pois\"]');\n  const layer = reportParameters.find('select[name=\"layer\"]');\n  const email_address = reportParameters.find('input[name=\"email_address\"]:valid');\n  if (ask_for.layer && !layer.val()) {\n    ok = false;\n    layer.fadeOut(500).fadeIn(500);\n  }\n  if (ask_for.email_address && (email_address.length && !email_address.val())) {\n    ok = false;\n    email_address.fadeOut(500).fadeIn(500);\n  }\n  const validCoords = getFormCoords(reportParameters);\n  if ((ask_for.municipalities || ask_for.pois || ask_for.coords) &&\n    ((poi.val().length + munis.val().length) == 0) && !validCoords.srcproj) {\n    ok = false;\n    if ($('#tabla_coords').is(':visible')) $('#tabla_coords').fadeOut(200).fadeIn(200);\n    if (munis.parent().is(':visible')) munis.parent().fadeOut(200).fadeIn(200);\n    if (poi.parent().is(':visible')) poi.parent().fadeOut(200).fadeIn(200);\n  }\n  const form = reportParameters.find('form');\n  if (ok) {\n    let url = form[0].action + '?' + form.serialize();\n    if (validCoords.srcproj) {\n      url += `&crs=${validCoords.srcproj}&x=${validCoords.xlong}&y=${validCoords.ylat}`;\n    }\n    if (ask_for.email_address) {\n      $.ajax({\n        url: url,\n        cache: false,\n        success: response => $(response.message).dialog()\n      })\n    }\n    else {\n      const onload_func = function () {\n        if (this?.document && 'error' == this.document.body.id) {\n          showProblemDialog(this, url);\n        }\n      }\n      const foo = window.open(url);\n      foo.addEventListener('DOMContentLoaded', onload_func)\n    }\n    if (this)\n      $(this).dialog('close');\n  }\n}\nfunction debounceSearch(tableId) {\n  const $searchBox = $(tableId + \"_filter input[type='search']\");\n  $searchBox.off();\n  const searchDebouncedFn = debounce(function () {\n    $(tableId).DataTable().search($searchBox.val()).draw();\n  }, 600);\n  $searchBox.on(\"keyup\", searchDebouncedFn);\n}\n\n/* from https://davidwalsh.name/javascript-debounce-function */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function () {\n    const context = this,\n      args = arguments;\n    const later = function () {\n      timeout = null;\n      if (!immediate) func.apply(context, args);\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) func.apply(context, args);\n  };\n}\nfunction downloadReport(ns, data) {\n  const id = data[0];\n  $('input[name=\"report\"]').val(id);\n  const extra = data[data.length - 1];\n  const batch = extra.batch;\n  const ask_for = extra.ask_for || {};\n  if (batch) {\n    ask_for.email_address = true;\n  }\n  const reportParameters = ns.page.find('.report-parameters');\n  $('#email_address').toggle(ask_for.email_address !== undefined);\n  $('#tabla_municipios').toggle(ask_for.municipalities !== undefined);\n  $('#tabla_coords').toggle(ask_for.coords !== undefined);\n  $('#tabla_pois').toggle(ask_for.pois !== undefined);\n  $('#tabla_capas').toggle(ask_for.layers !== undefined);\n  if ($.isEmptyObject(ask_for))\n    return verifyParameters(reportParameters);\n  const calendar = reportParameters.find('div.calendar');\n  const fp = configureCalendar(calendar, false, extra);\n  if (ask_for.date) {\n    calendar.removeClass('hidden');\n  }\n  const yearCalendar = reportParameters.find('div.calendar_year');\n  if (ask_for.year && yearCalendar.is(':hidden')) {\n    yearCalendar.removeClass('hidden');\n    yearCalendar.find('input').val(new Date().getFullYear());\n  }\n  if (ask_for.layers)\n    cargarTabla('#tabla_capas', window.Urls.layers_by_report(id), undefined, true);\n  else\n    $('#tabla_capas select').val([]);\n  const model = $('.model.tabla_dimensiones');\n  model.siblings('.tabla_dimensiones').remove();\n  if (ask_for.dimensions) {\n    for (const [dim, title] of Object.entries(extra.ask_for.dimensions)) {\n      const new_tabla = model.clone();\n      const new_id = `tabla_dimensiones_${dim}`;\n      new_tabla.find('h4').text(title);\n      new_tabla.find('select').attr('name', dim);\n      new_tabla.attr('id', new_id).removeClass('model').insertBefore(model).show();\n      cargarTabla('#' + new_id, window.Urls.dimension_values(dim), undefined, true);\n    }\n  }\n  if (ask_for.coords !== undefined)\n    $('#tabla_coords input').val('');\n  if (ask_for.municipalities)\n    cargarTabla('#tabla_municipios', window.Urls.municipalities());\n  else\n    $('#tabla_municipios select').val([]);\n  const ask_for_pois = extra.ask_for?.pois;\n  if (ask_for_pois) {\n    if (ask_for_pois.title)\n      $('#tabla_pois h4').text(ask_for_pois.title)\n    const st = ask_for_pois.source_type;\n    const et = ask_for_pois?.element_type;\n    if (st)\n      cargarTabla('#tabla_pois', window.Urls.pois_json_by_st(st));\n    else if (et)\n      cargarTabla('#tabla_pois', window.Urls.pois_json_by_et(et));\n  }\n  else\n    $('#tabla_pois select').val([]);\n  reportParameters.removeClass('hidden');\n  reportParameters.show().animate({ width: 'auto', height: 'auto' });\n  reportParameters.dialog({\n    title: data[1],\n    height: 'auto',\n    width: 'auto',\n    buttons: [{\n      text: window.gettext('Aceptar'),\n      click: function () { verifyParameters.call(this, reportParameters) },\n    }],\n    modal: true,\n    ask_for,\n    open: () => $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar')),\n    close: () => {\n      reportParameters.find('div.calendar').addClass('hidden');\n      reportParameters.find('div.calendar_year').addClass('hidden');\n      reportParameters.find('div#email_address').addClass('hidden');\n      reportParameters.find('div.multi.flex').toggle(false);\n      reportParameters.find('#tabla_coords').toggle(false);\n      fp.destroy();\n      reportParameters.dialog('destroy');\n    },\n  });\n}\n\nexport function configureCalendar(\n  calendar_element,\n  enableTime = true,\n  extra = {}\n) {\n  const pastDays = Number.isInteger(extra.past) ? extra.past : null;\n  const futureDays = Number.isInteger(extra.future) ? extra.future : null;\n  const now = dayjs();\n  const defaultDate = now.toDate();\n  const options = {};\n\n  if (pastDays !== null)\n    options.minDate = now.subtract(pastDays, 'day').toDate();\n\n  if (futureDays !== null)\n    options.maxDate = now.add(futureDays, 'day').toDate();\n\n  return flatpickr(calendar_element, {\n    defaultDate,\n    wrap: true,\n    altInput: true,\n    altFormat: enableTime ? 'd-m-Y H:i' : 'd-m-Y',\n    dateFormat: 'Y-m-d',\n    allowInput: true,\n    clickOpens: false,\n    enableTime,\n    time_24hr: true,\n    minuteIncrement: 1,\n    appendTo: calendar_element.find('input.form-control')[0],\n    ...options\n  });\n}\n\nexport function cargarTabla(tableId, url, selected_centroids) {\n  const sel = $(tableId + ' select');\n  if (sel.length === 0)\n    return;\n  if (sel.hasClass(\"select2-hidden-accessible\")) {\n    // select2 ya inicializado, no hay manera elegante de verlo\n    // https://select2.org/programmatic-control/methods#checking-if-the-plugin-is-initialized\n    const prev_url = sel.data('select2').options.get('ajax').url;\n    if (prev_url === url)\n      return;\n    // los elem seleccionados de la otra url no son válidos\n    sel.val(null).trigger('change');\n  }\n  if (selected_centroids) {\n    for (const r of selected_centroids) {\n      if (r.id === null)\n        continue\n      const opt = new Option(r.name, r.id, true, true);\n      opt.dataset.name = r.name;\n      opt.dataset.centroid = r?.centroid?.coordinates ? r.centroid.coordinates : r.centroid;\n      sel.append(opt);\n    }\n    selected_centroids.length = 0;\n  }\n\n  const ret = sel.select2({\n    placeholder: \"buscar...\",\n    dropdownParent: $('body'),\n    width: '100%',\n    closeOnSelect: false,\n    ajax: {\n      url,\n      dataType: 'json',\n      processResults: function (data) {\n        const ret = {\n          results: data.map(function (r) {\n            return {\n              id: r.id,\n              text: r.name,\n              data: {\n                name: r.name,\n                centroid: r?.centroid?.coordinates ? r.centroid.coordinates : r.centroid,\n              },\n            };\n          })\n        };\n        return ret;\n      },\n    },\n  });\n  return ret\n}\n\n","import View from 'ol/View';\nimport Map from 'ol/Map';\nimport { GraphControl, crearControlesDimensiones } from './GraphControl.mjs';\nimport { crearCapa } from './mapa.mjs';\nimport { TimelineControl, setCurrentValue } from './timeline.mjs'\nimport { $, getParameterByName, dayjs, getFormCoords, proj4, global_init } from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport { cargarTabla } from './informes.mjs';\nimport ol_control_Notification from 'ol-ext/control/Notification';\nimport JSZip from 'jszip';\nimport { saveAs } from 'file-saver';\n\nfunction selectScope(callback) {\n  if ($('#selector-ambito').hasClass('ui-dialog-content'))\n    $('#selector-ambito').dialog('open');\n  else {\n    $('#selector-ambito').show().animate({ width: 'auto', height: 'auto' });\n    $('#selector-ambito').dialog({\n      title: window.gettext('Selector de ámbitos'),\n      height: 'auto',\n      width: 'auto',\n      buttons: [{\n        text: window.gettext('Aceptar'),\n        id: 'generate',\n        type: 'submit',\n        click: function () {\n          const scopes_selected = [];\n          for (const select of $('#selector-ambito select:visible')) {\n            for (const elemData of $(select).select2('data')) {\n              const newData = 'name' in elemData.element.dataset ?\n                {\n                  id: elemData.id,\n                  name: elemData.element.dataset.name,\n                  centroid: elemData.element.dataset.centroid.split(',').map(f => parseFloat(f)),\n                } : {\n                  id: elemData.id,\n                  name: elemData.data.name,\n                  centroid: elemData.data.centroid,\n                };\n              scopes_selected.push(newData)\n            }\n            const DMS_element = $('.coord-input');\n            const { ylat, xlong, srcproj } = getFormCoords(DMS_element)\n            if (xlong !== null)\n              scopes_selected.push(createScopeByCoords(srcproj, [xlong, ylat]))\n            if (!callback(scopes_selected))\n              $(this).dialog('close');\n          }\n        },\n      }],\n      modal: true,\n      open: function () {\n        $('button.ui-dialog-titlebar-close').attr('title', window.gettext('Cerrar'))\n      },\n    });\n  }\n}\nfunction createScopeByCoords(projection, xy) {\n  const sourceProj = proj4(projection);\n  const destProj = proj4('EPSG:4326');\n  const coords = proj4(sourceProj, destProj, [xy[0], xy[1]]);\n  return {\n    id: null,\n    centroid: coords\n  };\n}\nfunction transformProjFromCoords(x, y, src, dest) {\n  return proj4(proj4(src), proj4(dest), [x, y]);\n}\nfunction print(evt, emul_mapa, graphControls) {\n  const centroids = graphControls.map(x => x.poi)\n  const visible_layers = emul_mapa.get('layerObjects')\n    .filter(lyr => lyr._ol_layer?.getVisible())\n    .map(lyr => lyr._pageLayer.id).join(',');\n  const id_pois = centroids.filter(c => c.id).map(c => c.id).join(',');\n  const coords = centroids.filter(c => !c.id).map(c => c.centroid).join('/');\n\n  const path = $('button#group').attr('group') == 'true' ?\n    window.Urls.pdf_grouped_graphicpage() :\n    window.Urls.pdf_graphicpage();\n  const url = new URL(path, window.location.href);\n  url.searchParams.set('coords', coords);\n  url.searchParams.set('id_pois', id_pois);\n  url.searchParams.set('layers', visible_layers);\n  url.searchParams.set('date', window.timelinectl.timeline.getCustomTime('current').toISOString());\n  const zoomRange = graphControls[0]?.zoomRange;\n  if (zoomRange) {\n    url.searchParams.set('range_from', zoomRange[0]);\n    url.searchParams.set('range_to', zoomRange[1]);\n  }\n\n  const dimensions = {};\n  const activeDimensions = graphControls[0].get('activeDimensions') || {};\n  for (const [id, v] of Object.entries(activeDimensions)) {\n    if (id in activeDimensions)\n      dimensions[id] = activeDimensions[id].map(d => d[0]).join(',');\n    else if (!activeDimensions)\n      dimensions[id] = v.value;\n  }\n  for (const [k, v] of Object.entries(dimensions)) {\n    if (Array.isArray(v)) {\n      v.forEach(val => url.searchParams.append(k, String(val)));\n    } else if (v != null) {\n      url.searchParams.set(k, String(v));\n    }\n  }\n  window.open(url);\n}\n\nexport async function cargarGraphicPage2(ns, cfg) {\n  const page = $(`#page-${ns.page_id}`);\n  ns.time_type = cfg.time_type;\n  const visible_layers = getParameterByName('visible_layers').split(',').map(x => parseFloat(x));\n  const visible_srid = getParameterByName('visible_srid');\n  const rangeFrom = getParameterByName('range_from');\n  const rangeTo = getParameterByName('range_to');\n  if (!cfg.centroids) {\n    const x = parseFloat(getParameterByName('x'));\n    const y = parseFloat(getParameterByName('y'));\n    const srid = getParameterByName('srid');\n    ns.coordinates_epsg = (visible_srid) ? visible_srid : srid;\n    const [xt, yt] = transformProjFromCoords(x, y, srid, ns.coordinates_epsg);\n    $('.coord-input #xlong').val(xt);\n    $('.coord-input #ylat').val(yt);\n    $(`.coord-input #projection li[value=\"${ns.coordinates_epsg}\"]`).trigger('click');\n    $(`.coord-input #projection`).trigger('click');\n    const coords = transformProjFromCoords(x, y, srid, 'EPSG:4326');\n    cfg.centroids = [{\n      id: null,\n      centroid: coords\n    }];\n  }\n  //cfg.pagelayer_set.forEach(cargarArbol)\n  if (cfg.epsg)\n    ns.epsg = window.epsg = cfg.epsg.locator;\n  const qGrouped = getParameterByName('grouped');\n  const groupGraphics = qGrouped ? qGrouped == 'true' : cfg.extra.groupGraphics;\n  if (groupGraphics) {\n    page.find('button#group').attr('group', 'true');\n  }\n  let timeline_config;\n  if (cfg.time_type) {\n    if (cfg.time_type.locator != '0') {\n      let start = getParameterByName('date');\n      if (start !== '')\n        cfg.start = start;\n      else if (ns.time_travel)\n        cfg.start = dayjs(ns.time_travel);\n      $('.time-selector').removeClass('hidden');\n      $('.time-selector-input').removeClass('hidden');\n      if (!cfg.time_type.locator.startsWith('ENUM')) {\n        $('.calendar').removeClass('hidden');\n      }\n      const timelineControl = window.timelinectl || new TimelineControl(cfg);\n      timeline_config = timelineControl.configure;\n      timeline_config.time_type = cfg.time_type.locator;\n    }\n  }\n\n  const view = new View({\n    projection: window.epsg,\n    showFullExtent: true,\n    zoom: 10\n  });\n  const notification = new ol_control_Notification({ target: $('div.row > .map')[0] });\n  const emul_mapa = new Map({\n    view: view,\n    controls: [notification]\n  });\n  emul_mapa.set('layerObjects', []);\n  if (cfg.extra?.graph_show_run_time)\n    emul_mapa.set('graph_show_run_time', true)\n\n  emul_mapa.on('change:notification', function () {\n    const txt = this.get('notification');\n    if (txt) notification.show(txt, -1);\n    else notification.hide();\n  });\n  const dimension_controls = {};\n  emul_mapa.set('dimension_controls', dimension_controls, true);\n  crearControlesDimensiones(emul_mapa, dimension_controls, cfg.dimensions)\n  cfg.pagelayer_set = cfg.pagelayer_set.filter(pl => pl.layer.layertype.locator == 'LAYER')\n  const calls = cfg.pagelayer_set.map(async function (pl) {\n    if (visible_layers.includes(pl.id))\n      pl.shown = true;\n    await crearCapa(ns, emul_mapa, pl, null, null, null, cfg.dimensions, cfg.extra);\n  });\n  await Promise.allSettled(calls);\n\n  ns.mapas = [emul_mapa];\n  const graphControls = [];\n  loadGraphs(ns.page, graphControls, cfg.centroids, emul_mapa, groupGraphics, rangeFrom, rangeTo);\n  emul_mapa.on('change:info', async function () {\n    if (emul_mapa.get('info'))\n      for (const graphControl of graphControls) {\n        graphControl.redraw();\n      }\n  })\n  emul_mapa.on('change:dimension_controls', async function () {\n    for (const gc of graphControls) {\n      if (this.get('dimension_controls') && gc.get('activeDimensions')) {\n        const newActiveDimensions = {};\n        for (const ctl of Object.values(this.get('dimension_controls'))) {\n          newActiveDimensions[ctl.id] = [[ctl.value, ctl.caption]];\n        }\n        gc.set('activeDimensions', newActiveDimensions);\n      }\n    }\n  })\n  setCurrentValue(dayjs(window.timelinectl.timeline.getCustomTime('current')));\n  emul_mapa.set('info', true);\n  page.find('button.capas').on('click', () => page.find('.arbol').toggle());\n  $('button#show-dim-selector').on('click', () => graphControls[0].showDimSelector())\n  $('button#group').on('click', function () {\n    const opt = !($(this).attr('group') == 'true');\n    for (const graphControl of graphControls) {\n      graphControl.group_by_unit = opt;\n      graphControl.redraw();\n    }\n    $(this).attr('group', opt);\n  });\n  if (cfg.extra.boxplot == false)\n    $('button#boxplot').addClass('hidden');\n  $('button#boxplot').on('click', function () {\n    const button_bp = $(this);\n    for (const gc of graphControls) {\n      const active = gc.get('type');\n      if (active) {\n        gc.unset('type');\n        button_bp.removeClass('active')\n      } else {\n        gc.set('type', 'box');\n        button_bp.addClass('active')\n      }\n    }\n  });\n  if (cfg.extra.scope == false)\n    $('button#seleccionar_ambito').addClass('hidden');\n  $('#seleccionar_ambito').on('click', function () {\n    const old_scopes = graphControls.map(x => x.poi);\n    if (cfg.extra.ask_for?.coords == false)\n      $('.coord-input').hide()\n    if (cfg.extra.ask_for?.municipalities != false)\n      cargarTabla('#tabla_municipios', window.Urls.municipalities(), old_scopes);\n    else\n      $('#tabla_municipios').hide();\n    const ask_for_pois = cfg.extra.ask_for?.pois;\n    if (ask_for_pois) {\n      if (ask_for_pois.title)\n        $('#tabla_pois h4').text(ask_for_pois.title)\n      const st = ask_for_pois.source_type;\n      const et = ask_for_pois?.element_type;\n      if (st)\n        cargarTabla('#tabla_pois', window.Urls.pois_json_by_st(st), old_scopes);\n      else if (et)\n        cargarTabla('#tabla_pois', window.Urls.pois_json_by_et(et), old_scopes);\n    }\n    else\n      $('#tabla_pois').hide();\n    selectScope(function (scopes_selected) {\n      graphControls.map((graphControl) => {\n        graphControl.setMap(null);\n        graphControl.purge();\n      });\n      graphControls.length = 0;\n      loadGraphs(ns.page, graphControls, scopes_selected, emul_mapa, groupGraphics)\n      for (const graphControl of graphControls) {\n        graphControl.redraw();\n      }\n    });\n  });\n  ns.page.find('button.fa-print').on('click', function (evt) {\n    print(evt, emul_mapa, graphControls);\n  });\n  ns.page.find('button.toExcel').on('click', async function () {\n    const zip = graphControls.length > 1 ? new JSZip() : false;\n    for (const graphControl of graphControls) {\n      await graphControl.toExcel(zip);\n    }\n    if (zip) {\n      const content = await zip.generateAsync({ type: \"blob\" });\n      const fn = slugify(cfg.titles);\n      saveAs(content, fn);\n    }\n  });\n}\nfunction slugify(str) {\n  str = str.replace(/^\\s+|\\s+$/g, '-');\n  str = str.toLowerCase();\n  str = str.replace(/[^a-z0-9 -]/g, '')\n    .replace(/\\s+/g, '-')\n    .replace(/-+/g, '-');\n  return str;\n}\nfunction loadGraphs(page, graphControls, centroids, emul_mapa, groupGraphics, rangeFrom, rangeTo) {\n  for (const [idx, poi] of centroids.entries()) {\n    const modelo = page.find('div.info_grafica.modelo');\n    const target = modelo.clone();\n    target.removeClass('modelo');\n    modelo.parent().append(target);\n    const graphControl = new GraphControl(\n      target,\n      poi,\n      groupGraphics\n    )\n    if (rangeFrom && rangeTo)\n      graphControl.zoomRange = [rangeFrom, rangeTo];\n    emul_mapa.addControl(graphControl);\n    if (idx > 0)\n      graphControls[0].on('change:activeDimensions',\n        function () {\n          const newActiveDimensions = graphControls[0].get('activeDimensions');\n          graphControl.set('activeDimensions', newActiveDimensions);\n          graphControl.redraw();\n        });\n    else {\n      graphControl.on('change:con_pluma',\n        () => $('#show-dim-selector').toggle(graphControl.get('con_pluma')));\n    }\n    graphControl.on('change:activeDimensions',\n      function () {\n        const dimControls = emul_mapa.get('dimension_controls');\n        const newActiveDimensions = this.get('activeDimensions');\n        const dimsControlEnabled = Object.values(newActiveDimensions).some(x => x.length != 1) == false;\n        for (const ctl of Object.values(dimControls)) {\n          if (!ctl.id)\n            continue\n          ctl.enabled = dimsControlEnabled;\n          if (dimsControlEnabled && ctl.value != newActiveDimensions[ctl.id][0][0])\n            ctl.value = newActiveDimensions[ctl.id][0][0];\n        }\n      });\n    graphControls.push(graphControl);\n  }\n}\n$(function () {\n  global_init();\n  $('.coord-input').removeClass('hidden');\n  const inputs_number = $('div.coord-input').find('input[type=\"number\"]');\n  inputs_number.spinner({\n    min: 0.000000,\n    step: 0.000001,\n    numberFormat: \"N6\",\n    stop: function (event) {\n      const nDec = $(event.target).val().split('.')[1]?.length;\n      if (nDec && nDec > 6) {\n        event.target.value = event.target.valueAsNumber.toFixed(6);\n      }\n    }\n  });\n  inputs_number.siblings('a.ui-spinner-button').hide();\n  inputs_number.removeClass('ui-spinner-input');\n  inputs_number.parent().removeClass('ui-spinner ui-corner-all ui-widget ui-widget-content');\n  $('.third').addClass('hidden');\n  $('div#title').addClass('hidden');\n  const coordForm = $('.coord-input div.form');\n  window.site_cfg.site_epsgs.forEach(ep => {\n    const li = $(`<li value =\"${ep.code}\"></li>`)\n    li.text(ep.name + ' - ' + ep.code);\n    if (ep.code == window.epsg) {\n      li.addClass('select');\n      coordForm.find('div#projection input').val(li.text());\n      coordForm.find('div#projection input').attr('value', li.attr('value'));\n    }\n    coordForm.find('ul[name=chProj]').append(li);\n  })\n  coordForm.find('div.combo-coord').click(function () {\n    $(this).find('div.dropdown').toggleClass('listshown');\n  })\n  coordForm.find('li').click(function () {\n    const input = $(this).parents('div.combo-coord').find('input');\n    input.val($(this).text());\n    input.attr('value', $(this).attr('value'))\n    $(this).parent().find('.select').removeClass('select')\n    $(this).addClass(\"select\");\n  })\n})","import { $, global_init, getParameterByName } from '../../../../moderna_meteogrid/statix/js/base.mjs';\nimport { cargarGraphicPage2 } from './graphic_page.mjs';\nimport { cargarMosaico } from './mapa.mjs';\nimport { cargarTablas } from './informes.mjs';\nimport { cargarMapaMain } from './mapa.mjs';\nimport { cargaInicialSimulacion } from './simulaciones.mjs'\n\nimport \"util\"\nimport \"popper.js\"\n\n$(function () {\n    global_init();\n    for (const ns of window.namespaces) {\n        // caso especial mosaico desde mapa\n        if (ns.page_type_locator == 'graphicpage' || $('body#body-graphicpage').length) {\n            $.getJSON(window.Urls.page_json(ns.page_id), async function (cfg) {\n                if (getParameterByName('id_munis') || getParameterByName('id_pois') || getParameterByName('id_masks')) {\n                    const response = await fetch(window.Urls.scope_json() + location.search + '&srid=' + ns.epsg);\n                    cfg.centroids = await response.json();\n                }\n                cargarGraphicPage2(ns, cfg)\n            });\n        } else if (ns.page_type_locator == 'mosaicpage' || $('body#body-mosaicpage').length) {\n            $.getJSON(window.Urls.page_json(ns.page_id), layers => cargarMosaico(ns, layers));\n            ns.page.find('button.capas').on('click', () => ns.page.find('div.arbol').toggle());\n        } else if (ns.page_type_locator == 'simulationpage') {\n            cargaInicialSimulacion(ns)\n        } else if (ns.page_type_locator == 'mappage') {\n            $.getJSON(window.Urls.page_json(ns.page_id), cfg => cargarMapaMain(ns, cfg))\n            ns.page.find('button.capas').on('click', () => ns.page.find('div.arbol').toggle());\n        } else if (ns.content_model == 'listingpage') {\n            $.getJSON(window.Urls.page_json(ns.page_id), async function (cfg) {\n                cargarTablas(ns, cfg);\n            });\n        }\n        $('#saver_dialogs').load(window.Urls.saver_dialogs());\n        $('#simulation_dialogs').load(window.Urls.simulation_dialogs());\n    }\n});\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 625;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t625: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkemmet\"] = self[\"webpackChunkemmet\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [96], () => (__webpack_require__(12089)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","jQuery","isFunction","func","trim","String","prototype","$","window","customParseFormat","utc","duration","pluralGetSet","_","gettext","initialized","global_init","csrftoken","get","ajaxSetup","beforeSend","xhr","settings","method","type","test","this","crossDomain","setRequestHeader","document","ajaxStart","addClass","ajaxComplete","removeClass","draggable","click","e","stopPropagation","resizable","handles","delay","slideUp","self","top","body","not","$dropdowns","on","$this","prop","clearTimeout","setTimeout","documentElement","each","addEventListener","touches","length","hasClass","target","parentNode","preventDefault","closeDropdown","removeEventListener","namespaces","ns","page","page_id","mapas","csrfmiddlewaretoken","getElementById","fileuploader","form","closest","find","val","ajax","url","data","processData","contentType","FormData","success","result","text","class_","error","elem","appendTo","fadeIn","fadeOut","Urls","uploadFile","trigger","layerTree","ev","search","currentTarget","value","toUpperCase","idx","el","textContent","includes","classList","add","remove","setup_layer_tree_filter","getParameterByName","name","URL","location","searchParams","process","locale","langMap","en","es","fr","ca","langMapDT","pt","selLangMapDT","langs","lang","navigator","languages","l","split","localize","multiselectOptions","headerLeft","headerRight","selectableHeader","selectionHeader","afterInit","that","$selectableSearch","$selectableUl","prev","$selectionSearch","$selectionUl","selectableSearchString","$container","attr","selectionSearchString","select_all","select_none","$selectableContainer","elemsSelector","$selectionContainer","qs1","quicksearch","cache","which","focus","qs2","afterSelect","afterDeselect","isObject","item","Array","isArray","mergeDeep","sources","source","shift","key","Object","assign","transform_point","xy","sourceProj","destProj","epsg","fluidDialog","dialog","width","parseInt","options","maxWidth","css","height","maxHeight","option","position","get_horizon","dims","v","values","startsWith","getFormCoords","element","srcproj","xlong","Number","ylat","lat_degrees","lat_mins","lat_segs","lat_dir","long_degrees","long_mins","long_segs","long_dir","ConvertDMSToDD","degrees","minutes","seconds","direction","dd","updateUnselectedHorizons","idx_hor_notsel","Set","sort","splice","oldUrl","href","newUrl","replace","history","replaceState","LAYERTYPES","sigym2","tz","Intl","DateTimeFormat","resolvedOptions","timeZone","dimension_controls","getBigTileGrid","projectionObj","undefined","repositionTooltips","btn","id","my","at","of","collision","uniqId","i","id_counter","Layer","constructor","pageLayer","time_delta","interactive_map","_pageLayer","_layer","layer","_layerTypeLocator","layertype","locator","_baseLayer","_refLayer","_varLayer","extra","extra_dim","_extra","title","_title","name_and_unit","service","_url","source_type","_serviceLayer","servicelayer","_legend","legend","_information","information","_time_delta","_interactive_map","_dynDate","_dynInfo","getTooltip","ol_factory","Tile","zIndex","weight","order","getLayerInfo","checkbox","tooltipBtn","tooltip","hide","append","ishidden","is","info","empty","toggle","shown","checked","setSliderLayer","ol_layer","_ol_layer","sliderCnt","getOpacity","inpt","etq","onmouseover","w","innerHTML","parseFloat","style","left","hidden","onmouseout","oninput","setOpacity","newURL","delete","set","setCalculatedDate","props","STATIC_LAYER","propsTime","base_time","time","Error","dt","year","format","message","console","registerInTree","ol_map","_ol_map","closedTree","visible_layers","some","setVisible","raiz","arbol","existing_selector","selector","clone","leyenda","show","folder","orig_path","path","component","push","join","carpeta_existente","carpetaDestino","thisPath","folderTitle","pop","toggleClass","disabled","layerTitle","layers_opacity","layer_opacity","legendDialog","showLegend","control","controls","use","unuse","unset","setVisibleLayers_url","reload","getPosDefault","getTargetElement","dim","dimensions","value_type","dim_value","control_empty","reloaded_dims","updateParams","getVisible","_dimension_controls","crearCapaOL","extent_local","interactive","get_async_source","extraOpts","getExtraOpts","opacity","ret","visible","baseLayer","displayInLayerSwitcher","time_management","simmer_id","unit","effective_unit","unbound","setExtent","refreshTime","refresh_time","start","clearInterval","setInterval","refresh","Date","now","stop","addLayer","layerCaption","_caption","WMSLayer","updateDynInfo","dyn_info","dataType","TIME","getParams","done","resp","debug","fail","_src","params","LAYERS","STYLES","repeat","__tz","tileGrid","projection","proxy_meteo2","VERSION","AUTH_TYPE","src_factory","ratio","singleTile","TileWMS","ImageWMS","src","finalTime","timeFormat","firstTime","secondTime","effective_time","ISOstart","ISOend","time_type","Math","random","Image","pageLayerId","TRANSPARENT","getLegendUrl","l_id","isVisible","fondo","getLayers","getArray","capas","map","toArray","references","filter","x","mapa","pl","lyr_name","legendUrl","contains","legend_element","new_pos","pixel","getPixelFromCoordinate","coordinate","once","pos","mytarget","existing_legend_element","classes","autoOpen","minHeight","open","one","ol_control_SearchES","className","typing","super","polygon","viewbox","bounded","alertmsg","getTitle","f","address","requestData_idee","s","name_equals","maxresults","polygon_geojson","requestData_cc","addressdetails","q","limit","select","getMap","cord","results","err","alert","encodeURI","portal","portalNumber","JSON","parse","slice","opt","lat","lng","isNaN","cords","olproj","getView","getProjection","c","animate","center","zoom","max","getZoom","marker","Feature","geometry","Point","color_marker","getComputedStyle","getPropertyValue","iconStyle","Style","image","Icon","color","crossOrigin","anchorOrigin","anchor","anchorXUnits","anchorYUnits","scale","setStyle","vectorSource","features","markerVectorLayer","Vector","setZIndex","Infinity","getMarkerVectorLayer","json","obj","Promise","resolve","reject","toQueryString","encodeUrlXhr","callback","head","script","createElement","callbackName","round","setAttribute","indexOf","removeChild","appendChild","jsonp","fetch","mode","then","r","catch","keys","reduce","a","k","encodeURIComponent","autocomplete","cback","cont","protocol","res","bind","handleResponse","drawList_","auto","ul","querySelector","_list","li","min","equalFeatures","_handleSelect","getAttribute","Element","dateInputFormat","datatable","actOnElement","evt","buttons","tableId","datatableId","activeControl","DataTable","op","action","element_id","alertOverlay","fillElementInfo","simulation_delete","share_window","formData","edit_users","getAll","ro_users","alert_window","simulation_share","parent","fadeToggle","simulation_users","sel_edit","sel_ro","rellena_sel","sel","rel","u","relation","multiSelect","lock_window","simulation_lock","element_layer","forEach","getLayersArray","element_update","view","viewResolution","getResolution","viewProjection","getSource","TYPES","getFeatureInfoUrl","getCenter","INFO_FORMAT","geom_from_simulation","simulation_num","properties","selected","element_type__name","simulation_report","popup","write","toISOString","simulation_clone","simulation_page","fire_view_era5land_forecast_behave","gen_era5land_forecast_behave","unshift","datetime","simulation_edit","simulation_edit_new","close","createProp_dialog","element_type_id","createProp_element","simulation_user_groups","group","propDialog","read_only","simulationtype_id","prevent_new_data","elems","urlFunction","simulation_info","simulation_info_new","getJSON","old_data","initdate","events","vdat","elementValue","casilla","crearCasilla","cls","replaceWith","getElementsByClassName","defaultDate","enableTime","dateFormat","altInput","altFormat","time_24hr","minuteIncrement","new_data","crearFilaData","concat","available_data","simulationtype","data_menu","show_button","dat","calculation_id","it","__edit","button","menu","event","ui","attributes","idx_available_data","klass","toString","old_vars","groupBy","new_vars","all_vars","itype","rowspan","vdat_old","which_table","modelTR","tr","existentes","multiple","suffix","before","parameter_options","parameter_type","simulation_types","table_options","html","NewLaunchControl","Control","opt_options","fa","simulation_launch","log","refresco","ActControl","simul_json","sigym_config","state","cause","progress_status","extra_info","async","navigateToElement","response","element_info","geom","map_geom","WKT","readGeometry","dataProjection","featureProjection","fit","maxZoom","getMaxZoom","d","timelinectl","timeline","moveTo","setCustomTime","emit","getCustomTime","cargaInicialSimulacion","simulation_id","cfg","simul","relations","cargarMapa","page_json","SIMUL","GeoJSON","initializeMapa","mapa_","configureCalendar","calendar_element","minDate","maxDate","wrap","allowInput","clickOpens","crearSubCasilla","readOnly","fixed","dvalue","mvalue","local","hasTime","input_date","columns","recuadro","klasses","entries","cell","file_input","uploadFileReader","fileInput","input","maxSize","handleSelected","handleEvent","floor","loaded","total","showAlertDialog","removeListeners","reader","addListeners","FileReader","selectedFile","files","size","readAsDataURL","msg","div_error","error_element","modal","poi_coords","calc_vars","dimension_values","map_dimensions","class","model_table","total_table","table_one","table_two","table_n","tabs","horizon_opt","table","data_dim","horizon_name","div_table","dim_opt","ordered_values","td","innerText","parentElement","NumberFormat","maximumFractionDigits","div_tab","this_tab","other_dim","tab","dim_opt2","dimensionalTables2Pdf","scrollTop","hmax","poi","elements","target_graphs","gc","GraphControl","addControl","openNewWindow","plumas_pdf","redraw","create_graph_control","centroid","same_srid","showCalcVars","edTable","possibleVars","cells","HORIZON","currentYear","getFullYear","hasMapDimensions","simpleData","insertBefore","firstTD","first","miscCell","edRow","col","comments","next","change","bocadillo","fillElementTypes","currentTypeId","element_class","selectElem","types","element_types","pk","is_new","element_change_info","pending_changes","center_proj","toFixed","vv","model_row","related","new_row","other__name","other__element_type__name","other__element_type_id","other__id","stringify","geomx","parameter_change","element_type","old_geom_data","wkt","old_geom","Polygon","MultiPolygon","area_data","area","numeric_lang_format","formatArea","feat","readFeature","createAddDataButton","showUserInfo","username","user_info","mapTarget","lastElementPixel","width_edit","innerWidth","minWidth_edit","clipboard","writeText","innerHeight","print_element_info","element_delete","operation","element_commit_delete","writeFeature","element_commit_edit","fixDates","ipt","element_edit","ww","outerWidth","doble_height","resize","diff","element_commit_create","element_edit_new","is_pending_create","element_cancel_create","element_cancel_edit","pickr","isValid","updateStyles","tree","srcElements","type_filters","substring","zoomToPoint","setZoom","SaverElementsLayer","site","readonly","showElementsAffected","hideFilter","hidefilter","hideChanges","hidechanges","type_locator","model_query","element_type__locator","type_locator_in","element_type__locator__in","registerGeomButtons","y","srcEpsg","x2","y2","p","intersectsExtent","calculateExtent","new_geom","epsgSelect","site_cfg","site_epsgs","ep","code","pointByCoords","polygonBySize","h","pol_extent","getExtent","pol_extent_w","pol_extent_h","transform","getPolygonFromDistance","len","copia","carpeta_nueva","getTarget","children","calendar_element_from","calendar_element_to","lyrElements","load","saver_dialogs","call","lyrElementChanges","municipio","municipality","extent","transform_extent","from","to","defaultValue","cbx","items","createMapElement","elementsAffected","doElementsAffected","olmap","SourceFactory","LayerFactory","wms","SIMULATION_ID","CLASE","SRS","MASK_SITE","SITE","srcElementChanges","layers","requestList","requestInfo","fileref","iconos_css","getElementsByTagName","cargarCSS","cargarArbol","cargarMunicipios","municipalities","municipios","m","element_tree","ok","selection","nodes","n","refreshIndeterminateState","et_ids","indeterminate","mapDiv","old_img","offset","pageX","pageY","et_id","dataset","uid","img","elementRow","tt","element_type__element_class","change_municipal_element","element_type__municipal","validate_element_changes","change_site_element","elementchange__parameter_change__locator","after","references__id","parameter_change__locator","elementTable","newDiv","urls","TOLERANCE","simple","when","jsons","containerId","elem_type","row","locatable","fadeTo","getGeometry","writeGeometry","element_create","simul_affected_elements","elements_by_minutes","abs_time_for_time","elements_by_type","all_features","abs_time_iso","abs_time","uniq_features","layer_features","col_abs","total_col","ids","ids_by_type","uniq_ids_by_type","count_model","off","sideCarets","roundNextXMin","date","X","intervals","TimelineControl","enumTime","configure","configureTimelineENUM","create","createTimelineENUM","configureTimelineDefault","createTimelineDefault","moveToDate","setCurrentValue","end","getWindow","toDate","config","marks","step","snap","moment","showCurrentTime","minorLabels","millisecond","second","minute","hour","weekday","day","month","editable","updateTime","updateGroup","margin","horizontal","vertical","axis","itemsAlwaysDraggable","timeAxis","delta","subtract","content","current","new_initdate","ts_config","onClose","selectedDates","dateStr","current_time","calendar","time_selector_picker","onTimeChanged","setDate","addCustomTime","setCustomTimeTitle","_input","mark","customTimes","hammer","animateMapIfArrowDown","years","moveable","hiddenDates","setCustomTimeMarker","resolution","moment_function","dyn","Inicio","initial_time","mdate","startOf","idxHour","hours","findMoment6H","Fin","year_list","labelsj","labels","yr","last","getTime","keyName","tagName","current_pos","isSame","next_date","prev_date","highlight","newElem","oldElem","oldText","index","charAt","getFormatString","isMosaic","time_type_map","utc_start","times","iter_selected","i_time","tgt","map_iter","siblings","getImage","utcOffset","aux_time","init_day","daysInMonth","endOf","string_format_date","time_info_txt","targetElem","infoDiv","$fila","$celdas","grupos","$celda","ordenGrupos","celda","Measurer","typeValue","typeSelect","sketch","helpTooltipElement","helpTooltip","measureTooltipElement","measureTooltip","draw","listener","vector","fill","Fill","stroke","Stroke","Circle","radius","continuePolygonMsg","continueLineMsg","createMeasureTooltip","positioning","addOverlay","dragging","helpMsg","LineString","setPosition","getViewport","Draw","stopClick","lineDash","addInteraction","feature","tooltipCoord","output","line","getInteriorPoint","getCoordinates","getLastCoordinate","setOffset","CESIUM_BASE_URL","Cesium","Ion","defaultAccessToken","defs","MAP_ACTIONS","GET_METEOCIEL_SOUNDING","coords","getCurrentTime","selectedTime","horizon","asHours","lon","GET_VER_VAL_REPORT","REPORTS","GET_VER_VAL_REPORT_LIST","obs","availableReports","obsType","obsLayer","lyr","reportList","modelRow","toSorted","b","localeCompare","newRow","ad_hoc_report","SPECIES_ANALYSIS","srs","analysis_forestecco","getCode","coordinates_epsg","sel_species","sel_scenarios","sel_periods","urlSpecs","pois_json_by_st","specs","spec","scenarios","FIC_SCENARIO_FCC","scenario","periods","period","customTime","downloadbusy","iframe","timer","timeOut","minWidth","UME_JIINT_REPORT","corners","cargarMosaico","diffs","string_extent","page_type_locator","Float64Array","iterations","extent_local_global","View","showFullExtent","emul_mapa","activeDimensions","crearControlesDimensiones","$dim","size_field","iter_field","iter","interv_field","interv","img_size","mapasM","crearMosaicos","crearMapas_mosaico","iter_list","interv_list","n_map","createTimeline","newActiveDimensions","ctl","dim_values","o","combinations","isEmptyObject","cartesian","sortByValue","valA","valB","drawBox","pagelayer_set","extentInicial","viewState","getViewStateAndExtent","extentInicial3857","complete","wrapX","addFeature","OSM","page_layer","crearCapa","geometryFunction","source_","getFeatures","removeFeature","extent3857","extent4326","sep","extent_mosaico","page_pdf","sp","getAllLayers","layerOpacity","vals","setDims","page_tif","selector_element","getVisibleLayers_set","default_layer","format_string","hor_id","no_selected","init_date","iter_value","delta_value","iteracion","opt_val","lis_notsel","lis_sel","maps","idx_li","showHorizons","$btn","dimControls","$dialog","divSel","captions","pair","groupContainer","usage","valid_dims_contol","flatMap","div","activeDims","showDimSelector","prepend","restart","allSettled","kv","dim_control","lyr_dims","baselayer","referencias","fondos","default_background","every","mask_id","capas_with","with","layerObject","capas_pl","max_side","aspect","titulo","getTitlePageLayer","comb_layer","dims_layer","comb","total_columnas","fila_titulo","fila","dims_para_source","dims_para_id","dims_html","page_layer_with_dims","map_cfg","tabla","deg","oProj","units","coordXY","projDesc","epsg_name","sessionStorage","new_extent","getItem","removeItem","extent_global","reference","affection_layer","affected_simulation_id","extra_k","interactions","timeline_config","time_travel","geolocation","Geolocation","tracking","mainbar_top","infobar_bottom","mousePosition","MousePosition","coordinateFormat","undefinedHTML","selectProjectionControl","SelectProjectionControl","notification","sidebar","sidebar_toggle","onToggle","visibleLayerControl","VisibleLayerControl","Collection","ScaleLine","srcElementEdit","lyrElementEdit","modify","Modify","trans","Transform","hitTolerance","loadTilesWhileAnimating","loadTilesWhileInteracting","pixelRatio","devicePixelRatio","getEventPixel","getCoordinateFromPixelInternal","sunrise","sunriseHour","getHours","sunsetHour","sunset","handleMouseMove","showableLegend","hide_layers_caption","getZIndex","texts","infoContent","infoElement","tb_controls_bottom","OverviewMap","collapseLabel","label","tipLabel","active","getActive","ele","setHtml","coordInput","coordInputElement","searcherBar","toggleOne","autoDeactivate","geosearch","Button","handleClick","this_","overlay","goCoord","reset","removeAttr","getLength","removeLayer","coordSearchInput","geolocationLayer","positionFeature","setProjection","setTracking","coordinates","getPosition","setGeometry","setCenter","aux","toggle_track","getControls","control_layer_popup","tb_controls_top","Zoom","zoomInTipLabel","zoomOutTipLabel","Rotate","ZoomToExtent","FullScreen","bar","measurerBar","getInteractions","elm","type_","removeInteraction","getOverlays","getElement","removeOverlay","deleteDrawing","handleKmlFiles","fileList","kml_layers","kml_layer","file","isKml","onloadend","encode_data","zip","base64","kmz_format","KMZ","extractStyles","extractAttributes","readFeatures","vectorLayer","type_layer_locator","cutting_mask","recortarToggle","capas_id","plyr","layerObjectVisible","maskId","MapAnimation","ro","rw","report_sim","sub1","bbox_map","page_opt","content_model","page_mosaic","trim_mask_id","createExportButton","icon","toASCII","legs_visible","slidecontainers","pos_legs","slideCont","recortar_activo","setItem","reloadWithParams","ol3d","scene","getCesiumScene","tp","terrainProvider","setEnabled","button_","constrainResolution","floating_legend","closed_tree","graph_show_run_time","sim_type_locators","parameters","CLASS","parameter","contextMenu","LegendContextMenu","defaultItems","setUpContextMenu","pagelayer","jsValue","txt","setActive","groupGraphics","print_pluma","threshold","caption","new_tab","page_graph","graphic_pdf","info_punto_pdf","originalEvent","marker_infoPunto","has_table","info_tabla","targets","hasButton","mustHaveButton","groupButton","group_by_unit","dimsButton","boxPlotButton","can_export2Excel","toExcel","multiRun","showMultiRun","requestInfo2","formatLength","refrescaEtiqueta","MultiLineString","getFlatInteriorPoints","oldValue","infoli","infoul","coordForm","endsWith","parents","geoservice","placeholder","noCollapse","clearHistory","getInputField","setInput","getHistory","src_path","factory_name","servicetype","warn","layerClass","SAVER","WMS","WMSFLOW","getColorStops","SERVICE","REQUEST","FORMAT","PAGELAYERID","WIDTH","HEIGHT","URLSearchParams","colorStops","jsonColors","maxSpeed","Flow","dataTileSize","CRS","dataTileGrid","dataTileProjection","wind","DataTile","transition","loader","z","tileCoord","BBOX","getTileCoordExtent","Float32Array","setSource","WMTS","matrixSet","WMTSCapabilities","read","setUrl","Bing","BingMaps","imagerySet","XYZ","intervalSeconds","handleMapAnimation","interval","createDialog","pause","play","timeoutID","start_date_input","end_date_input","display","opIn","opOut","selectedIndex","destroy","showDialog","bbox_max","intersection","latestSelectedDateObj","distance","delta_time","param","gif_export","startAnimation","isOpen","static","onOpen","instance","getDateRanges","ranges","roundDates","start_date","end_date","addMarks","projCode","coordStringFunction","setCoordinateFormat","coordinates_epsg_name","match","toLocaleString","element_ids","groupByValue","boxplot","layers_loc","set_layers","mdt","zoomRange","showProblemDialog","args","url_func","extra_params","page_png","page_kml","visible_elements","srid","foo","onload_func","point","selectProj","nDec","sel_x","sel_y","pow","featPoint","prop_id","win","featProj","createOriginPoint","marker_fast_prop","setPropagation","getKMLData","buffer","kml_data","loadAsync","kmlFiles","lastKml","getKMLImage","lastIndexOf","regexp","RegExp","kmlFile","createObjectURL","Blob","KML","iconUrlFunction","getType","kmlData","cargarMapaMain","updateLegendMenuItem","visibles","findIndex","legendItem","clear","extend","colors","context","getContext","fillStyle","fillRect","getImageData","getColor","dimming","isDialog","new_type","base_data","new_data_groups","allgroupedDimValues","groupedDim","infoDims","groupColumns","dimsName","entry","hasOwnProperty","uniqueValues","acc","columnsWithMultipleValues","valueToMove","orig_serie","fromEntries","dimsLabel","columnControl","uniqueColumn","multiColumn","groupLabel","layer_name","boxmean","serie","j","new_values","groupedString","newValue","dimsnewValue","delenda","old_layout","layout","xaxis","yaxis","hoverlabel","namelength","hovermode","font","showlegend","boxmode","offsetgroup","hoverinfo","_showMultiRun","purge","observer","unobserve","activeLayers","analyers","layerObj","queryable","pixelSize","frameState","pixelToCoordinateTransform","con_pluma","dc","dval","setSize","setResolution","data_plumas_mapping","dimDataByLayer","getQueryLayers","urls_plumas","group_dims","layers_by_graphs","this_url","dim_mapping","getCombinatedDims","numUrls","calls","graphs","loadGraphs","ResizeObserver","paddingLeft","paddingRight","paddingTop","paddingBottom","clientWidth","origHeight","newLayout","clientHeight","observe","dimensionValues","graph_layers","info_punto_json","layerDimensions","layerDimensionValues","graph_layer","getTimeParams","combination","title_dims","dims_names","saved_params","dim_name","all_runs","dimsDialogExistente","$divSel","keepType","dimsDialog","selectHTML","maxZIndex","showCurrentValue","tzFunction","currentTime","other_target","numSeries","xx","ix","xxx","isAfter","range","dx","xpx","hover","id_mdt","all_data","subplots","yaxises","unit_mapping","order_mapping","var_mapping","can_be_grouped","y_idx","status","features_by_base_time","carga_serie","jqTitle","subplot","datum","jqTarget","titles","fixed_times","legend_title","short_name","d1","d2","hovertext","automargin","target_tab","dim_id","layer_loc","obj_name","obj_count","dim_title_opt","dim_title","legendgroup","hovertemplate","dynDate","t","pad","xlegend","family","xanchor","yanchor","orientation","bgcolor","create_graph","ticktext","mrange0","mrange1","range0","range1","listOfDates","listOfValues","listOfTable","listOfFixed_times","listOfDimMapping","layerdataFromJson","name_vars","arrayOfDates","arrayOfValues","arrayOfTable","arrayOfFixed_times","arrayOfDimMapping","horizon_dim","info_dim_data","title_opt","n_opt","info_dim_series","info_dim_serie","id2","ordered","dates","fixed_dates","createItems","elementdataFromJson","count_obj","name_obj","i_serie","data_pluma","name_opt","label_columns","table_info","nexttotitle","columnsObject","tr_title","table_info_element","colspan","alias","templateIn","_template","vvv","customdata","NaN","element_name","zorder","zeroline","showgrid","showline","ticks","showticklabels","layout_extra","minx","maxx","xmargin","data_sorted","Map","xValue","new_x","new_y","ft","fixedTime","tickvals","bordercolor","gridcolor","tickformat","fixedrange","tickmode","displayModeBar","g","trace","flechas","angle","flecha","eventdata","unhover","ed","_syncingRange","all","headers_dimensions","data_rows","rangeFrom","rangeTo","inRange","isBefore","header","layerActualDims","i_value","full_name","json_dimensions","dimData","locator_unit","replaceAll","$x","headers","numFmt","wb","ws","addWorksheet","fileName","addRows","xlsx","writeBuffer","fileExtension","blob","saveAs","variable","data_history","arrayFeatures","time_prop","has_time","i_v","single_table","fixedYears","ef_time","dim_mapping_length","id_dim2","grouped_combinations","n_op","dim_op","days_back","days_forward","round_to_days","t1_iso","t1p","t1","t2","t3","alreadyExists","DimensionControl","dimv","_options","setMap","ov","getOverlayContainerStopEvent","_value","new_value","enabled","exportar","layer_id","formato","listingFile","cargarTablas","titleAttr","from_datatable","element_type__element_class__id","element_type__id","element_type__id__in","hideSearch","hidePaging","language","dom","fixedHeader","lengthMenu","tag","pagingType","retrieve","serverSide","processing","searchDelay","listing_json","dataSrc","columnDefs","orderable","render","action_id","drawCallback","api","batch","ask_for","email_address","reportParameters","pois","verifyParameters","fp","pastDays","isInteger","past","futureDays","future","yearCalendar","cargarTabla","layers_by_report","model","new_tabla","new_id","ask_for_pois","st","et","pois_json_by_et","downloadReport","$searchBox","searchDebouncedFn","timeout","arguments","apply","debounce","debounceSearch","cargarTablaMain","colId","colIdx","paramType","pagelayer_id","table_options_for_sourcetype","column","munis","validCoords","serialize","selected_centroids","Option","select2","dropdownParent","closeOnSelect","processResults","createScopeByCoords","transformProjFromCoords","dest","cargarGraphicPage2","visible_srid","centroids","xt","yt","qGrouped","graphControls","graphControl","button_bp","scope","old_scopes","scopes_selected","elemData","newData","DMS_element","id_pois","pdf_grouped_graphicpage","pdf_graphicpage","print","generateAsync","fn","toLowerCase","modelo","dimsControlEnabled","inputs_number","spinner","numberFormat","valueAsNumber","scope_json","simulation_dialogs","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","O","chunkIds","priority","notFulfilled","fulfilled","getPrototypeOf","__esModule","def","getOwnPropertyNames","definition","defineProperty","enumerable","globalThis","Function","Symbol","toStringTag","nmd","paths","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}