{"id":1625915,"date":"2025-04-14T09:28:51","date_gmt":"2025-04-14T07:28:51","guid":{"rendered":"https:\/\/igmi.esercito.difesa.it\/aerial-photos\/"},"modified":"2026-04-24T12:04:05","modified_gmt":"2026-04-24T10:04:05","slug":"aerial-photos","status":"publish","type":"page","link":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/","title":{"rendered":"Aerial Photos"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1625915\" class=\"elementor elementor-1625915 elementor-736\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0202ff3 e-flex e-con-boxed e-con e-parent\" data-id=\"0202ff3\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5353208 e-con-full e-flex e-con e-child\" data-id=\"5353208\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8b4633b elementor-widget elementor-widget-heading\" data-id=\"8b4633b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/\">Home<\/a> \/ <a href=\"https:\/\/igmi.esercito.difesa.it\/negozio\">Negozio<\/a> \/ Foto Aeree<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-82a41ab elementor-widget elementor-widget-heading\" data-id=\"82a41ab\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Aerial Photos<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-da4a7ba e-con-full e-flex e-con e-child\" data-id=\"da4a7ba\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7a4006b e-flex e-con-boxed e-con e-parent\" data-id=\"7a4006b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-3f34a9b e-con-full e-flex e-con e-child\" data-id=\"3f34a9b\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4ff1741 elementor-widget elementor-widget-shortcode\" data-id=\"4ff1741\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\n\t\t<script>\n\t\t\t\n\t\tclass ParametriSelettoreGeografico {\n\n\t\t\t\/\/valori arbitrariamente ereditati da specifiche istanze\n\t\t\tcommon = {\n\n\t\t\t\t'parametri' : {\n\n\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t'logEnabled' : false,\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'prdSearch':{\n\n\t\t\t\t\t\t'ProductsList' : {\n\n\t\t\t\t\t\t\t'logEnabled' : false,\n\t\t\t\t\t\t\t'resultsPerPage' : 25,\n\t\t\t\t\t\t\t'backgroundLoadCallsLimit' : 500,\n\t\t\t\t\t\t\t'backgroundLoadTriesLimit' : 200,\n\n\t\t\t\t\t\t\t'WooCommerceAPIKey' : {\n\t\t\t\t\t\t\t\t'key' :  'ck_3159f9829cad8ff6b9ca01b884fe682c7ce1922c',\n\t\t\t\t\t\t\t\t'secret' : 'cs_b28ec34f3c9d8adf561b57535b11714fb2242cb6'\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'icons' : {\n\n\t\t\t\t\t\t\t\t'showProductGeometry' :  '\ud83d\uddfa\ufe0f',\n\t\t\t\t\t\t\t\t'addToCart' :  '\ud83d\uded2',\n\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'locSearch':{\n\t\t\t\t\t\t'AutoComplete' : {\n\n\t\t\t\t\t\t\t'logEnabled' : false,\n\t\t\t\t\t\t\t'minCharsInput':3,\n\t\t\t\t\t\t\t'isRequired':false,\n\t\t\t\t\t\t\t'submitOnChange': false, \n\t\t\t\t\t\t\t'formWrap':true,\n\t\t\t\t\t\t\t'geoCodingEndpoint' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t'token' : null\n\t\t\t\t\t\t\t\t,'limitResults' : 10\n\t\t\t\t\t\t\t\t,'code_EPSG' : 'EPSG:3857'\n\t\t\t\t\t\t\t\t,getUrl : function(query = 'roma'){ return  `\/porta-magna\/geocoder?n=${this.limitResults}&q=${query}`; }\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t'logEnabled' : false,\n\t\t\t\t\t\t\t'keepValue' : true,\n\t\t\t\t\t\t\t'formWrap' : true,\n\t\t\t\t\t\t\t'polygonSize' : 0.0010,\n\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'CssPopup':{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\n\t\t\t\t\t'mapSearch':{\n\n\t\t\t\t\t\t'GeoSelector' : {\n\n\t\t\t\t\t\t\t'logEnabled' : false,\n\t\t\t\t\t\t\t'spinnerEnabled' : true,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'clickedPolygonSize' : 0.007,\n\n\t\t\t\t\t\t\t'tileServerEndpoint' : {\n\t\t\t\t\t\t\t\t'token':'4242'\n\t\t\t\t\t\t\t\t,'minZoom':6\n\t\t\t\t\t\t\t\t,'maxZoom':16\n\t\t\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \n\t\t\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t\t\t,getUrl : function(){ \n\t\t\t\t\t\t\t\t\t\/\/return 'https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png';\n\t\t\t\t\t\t\t\t\t\/\/return '\/cgi-bin\/big_tiffer?iz={z}&ix={x}&iy={y}&key='+this.token;\n\t\t\t\t\t\t\t\t\treturn '\/porta-magna\/wmts\/xyz\/?iz={z}&ix={x}&iy={y}&key='+this.token; \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'polygonColors':{\n\n\t\t\t\t\t\t\t\t\/\/valorizzati in specifiche istanze\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'buttons' : {\n\n\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : true\n\t\t\t\t\t\t\t\t\t,'icon' :'\u271a'\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : true\n\t\t\t\t\t\t\t\t\t,'icon' : '\u268a'\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : true\n\t\t\t\t\t\t\t\t\t,'icon' : '\u25f0'\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : true\n\t\t\t\t\t\t\t\t\t,'icon' : '\u232b'\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t,'marker' : {\n\n\t\t\t\t\t\t\t\t'url' : '\/base64_imgs\/leaflet_marker_plain_blue.png'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t},\n\n\t\t\t\t'localizzazioni' : {\n\n\t\t\t\t\t\/\/valorizzate in specifiche istanze\n\n\t\t\t\t}\n\n\n\t\t\t};\n\n\t\t\t\/\/selettore geogarfico cartografia\n\t\t\tcartografia = {\n\n\t\t\t\t'parametri' : {\n\n\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t'logEnabled' : this.common.parametri.mainWrapper.logEnabled,\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'prdSearch':{\n\n\t\t\t\t\t\t'ProductsList' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.prdSearch.ProductsList.logEnabled,\n\n\t\t\t\t\t\t\t'WooCommerceAPIKey' : {\n\t\t\t\t\t\t\t\t'key' :  this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.key,\n\t\t\t\t\t\t\t\t'secret' : this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.secret\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'resultsPerPage' : this.common.parametri.prdSearch.ProductsList.resultsPerPage,\n\t\t\t\t\t\t\t'backgroundLoadCallsLimit' : this.common.parametri.prdSearch.ProductsList.backgroundLoadCallsLimit,\n\t\t\t\t\t\t\t'backgroundLoadTriesLimit' :this.common.parametri.prdSearch.ProductsList.backgroundLoadTriesLimit,\n\n\t\t\t\t\t\t\t'icons' : {\n\n\t\t\t\t\t\t\t\t'showProductGeometry' :  this.common.parametri.prdSearch.ProductsList.icons.showProductGeometry,\n\t\t\t\t\t\t\t\t'addToCart' :  this.common.parametri.prdSearch.ProductsList.icons.addToCart,\n\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'idProductTag' :  '243,406',\n\t\t\t\t\t\t\t'filterCatInGeometry' : true,\n\t\t\t\t\t\t\t'filterAttrInGeometry' : true,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'filterCategories' : [\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/manca categoria normale! questa \u00e8 categoria tecnica!\n\t\t\t\t\t\t\t\t\/\/\u00e8 stato necessario abilitare fetch categorie tecnice in funzione fetchCategories!\n\t\t\t\t\t\t\t\t{'id':87098,'slug':'serie-100v-e-100l-edizione-precedente','autoZoom':true,'noCart':false}, \n\t\t\t\t\t\t\t\t{'id':87095,'slug':'serie-25v-tavolette-edizione-precedente','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/ok\n\t\t\t\t\t\t\t\t{'id':176,'slug':'serie-25v-tavolette','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':177,'slug':'carta-regionale','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':178,'slug':'serie-50v','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':179,'slug':'serie-25-dbsn-automatica','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':180,'slug':'serie-25-db','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':181,'slug':'carta-ditalia','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':182,'slug':'serie-25','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':183,'slug':'plastico-200-000','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':184,'slug':'serie-50','autoZoom':true,'noCart':false}, \/\/nessun prodotto\n\t\t\t\t\t\t\t\t{'id':185,'slug':'serie-100-v-e-100-l','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':186,'slug':'il-mondo-jog-serie-250-g','autoZoom':true,'noCart':false}, \/\/no addon\n\t\t\t\t\t\t\t\t{'id':189,'slug':'serie-250-regioni','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':190,'slug':'serie-500','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':193,'slug':'serie-milione','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':559,'slug':'serie-50l','autoZoom':true,'noCart':false},\n\t\t\t\t\t\t\t\t{'id':44118,'slug':'serie-50-e-50-l','autoZoom':true,'noCart':false},\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAttributes' : [\n\n\t\t\t\t\t\t\t\t\/*\n\t\t\t\t\t\t\t\t{'id':23,'name':'scala','idLinkedCategory':174,'required':false},\n\t\t\t\t\t\t\t\t{'id':23,'name':'scala','idLinkedCategory':176,'required':false},\n\t\t\t\t\t\t\t\t{'id':23,'name':'scala','idLinkedCategory':182,'required':false},\n\t\t\t\t\t\t\t\t{'id':23,'name':'scala','idLinkedCategory':184,'required':false},\n\t\t\t\t\t\t\t\t*\/\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAddons' : [\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/no cat normale!\n\t\t\t\t\t\t\t\t{'idLinkedCategory':87098,'idAddonCategory':162,'idAddon':45,'slug':'tecnica_modalita_acquisto_cartografia_serie100_edi_prec','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':87095,'idAddonCategory':174,'idAddon':44,'slug':'tecnica_modalita_acquisto_cartografia_serie25v_edi_prec','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/ok\n\t\t\t\t\t\t\t\t{'idLinkedCategory':176,'idAddonCategory':213,'idAddon':33,'slug':'tecnica_modalita_acquisto_cartografia_serie25v','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':177,'idAddonCategory':171,'idAddon':30,'slug':'tecnica_modalita_acquisto_cartografia_regionale','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':178,'idAddonCategory':172,'idAddon':31,'slug':'tecnica_modalita_acquisto_cartografia_serie50v','noCartIndexes':[0,1]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':179,'idAddonCategory':173,'idAddon':32,'slug':'tecnica_modalita_acquisto_cartografia_serie25dbsn','noCartIndexes':[]}, \/\/no cartaceo\n\t\t\t\t\t\t\t\t{'idLinkedCategory':180,'idAddonCategory':168,'idAddon':27,'slug':'tecnica_modalita_acquisto_cartografia_serie25db','noCartIndexes':[1]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':181,'idAddonCategory':169,'idAddon':28,'slug':'tecnica_modalita_acquisto_cartografia_italia','noCartIndexes':[1]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':182,'idAddonCategory':160,'idAddon':20,'slug':'tecnica_modalita_acquisto_cartografia_serie25','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':183,'idAddonCategory':170,'idAddon':29,'slug':'tecnica_modalita_acquisto_cartografia_plastico','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':184,'idAddonCategory':161,'idAddon':21,'slug':'tecnica_modalita_acquisto_cartografia_serie50','noCartIndexes':[0]}, \/\/nessun prodotto\n\t\t\t\t\t\t\t\t{'idLinkedCategory':185,'idAddonCategory':163,'idAddon':22,'slug':'tecnica_modalita_acquisto_cartografia_serie100','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':186,'idAddonCategory':164,'idAddon':23,'slug':'tecnica_modalita_acquisto_cartografia_serie250g','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':189,'idAddonCategory':165,'idAddon':24,'slug':'tecnica_modalita_acquisto_cartografia_serie250_regioni','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':190,'idAddonCategory':166,'idAddon':25,'slug':'tecnica_modalita_acquisto_cartografia_serie500','noCartIndexes':[0]},\t\n\t\t\t\t\t\t\t\t{'idLinkedCategory':193,'idAddonCategory':167,'idAddon':26,'slug':'tecnica_modalita_acquisto_cartografia_serie_milione','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t{'idLinkedCategory':559,'idAddonCategory':558,'idAddon':41,'slug':'tecnica_modalita_acquisto_cartografia_serie50l','noCartIndexes':[]}, \/\/no cartaceo\n\t\t\t\t\t\t\t\t{'idLinkedCategory':44118,'idAddonCategory':161,'idAddon':21,'slug':'tecnica_modalita_acquisto_cartografia_serie50','noCartIndexes':[0]},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t'productListAttributeSlugs':[\t\t\t\t\t\t\n\t\n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':87098,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':87095,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':176,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':177,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':178,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':179,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':180,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':181,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':182,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':183,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':184,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':185,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':186,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':189,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':190,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':193,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':559,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\t\t\t\t\t\t\t\t{'slug':'anno versione','idLinkedCategory':44118,'fixName':(n)=>{return n.replace(\/\\bversione\\b\/gi,'').replace(\/\\bversion\\b\/gi,'').replace(\/\\s{2,}\/g, ' ').trim();}}, \n\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'layerCategories':[\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/slugAttribute *: tutti gli attributi (TODO)\n\t\t\t\t\t\t\t\t\/\/valueAttribute *: tutti i valori dell' attributo (TODO)\n\t\t\t\t\t\t\t\t\/\/i valori tra gli array sono considerati in colonna (1:1)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 87098,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 87095,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 176,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 177,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 178,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 179,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 180,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 181,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 182,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 183,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 184,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 185,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 186,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 189,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 190,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 193,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 559,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory': 44118,\n\t\t\t\t\t\t\t\t\t'slugAttribute': '*',\n\t\t\t\t\t\t\t\t\t'valueAttributeOption': '*',\n\t\t\t\t\t\t\t\t\t'data': {\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom': false,\n\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [null],\n\t\t\t\t\t\t\t\t\t\t'iconUrls': [false],\n\t\t\t\t\t\t\t\t\t\t'iconSizes': [false],\n\t\t\t\t\t\t\t\t\t\t'iconAnchors': [false],\n\t\t\t\t\t\t\t\t\t\t'stretchOnPolygon': [true],\n\t\t\t\t\t\t\t\t\t\t'drawProductList': false,\n\t\t\t\t\t\t\t\t\t\t'ausiliaryAttributes': [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'areAttributesCustom': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'valuesAttribute': [],\n\t\t\t\t\t\t\t\t\t\t\t\t'operatorsAttribute': []\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'locSearch':{\n\n\t\t\t\t\t\t'AutoComplete' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.locSearch.AutoComplete.logEnabled,\n\t\t\t\t\t\t\t'minCharsInput':this.common.parametri.locSearch.AutoComplete.minCharsInput,\n\t\t\t\t\t\t\t'isRequired':this.common.parametri.locSearch.AutoComplete.isRequired,\n\t\t\t\t\t\t\t'submitOnChange': this.common.parametri.locSearch.AutoComplete.submitOnChange, \n\t\t\t\t\t\t\t'formWrap':this.common.parametri.locSearch.AutoComplete.formWrap,\n\t\t\t\t\t\t\t'geoCodingEndpoint' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t'token' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.token\n\t\t\t\t\t\t\t\t,'limitResults' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.limitResults\n\t\t\t\t\t\t\t\t,'code_EPSG' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.code_EPSG\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.getUrl\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\t\n\t\t\t\t\t},\n\n\t\t\t\t\t'crdSearch':{\n\n\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.crdSearch.CoordinatesParser.logEnabled,\n\t\t\t\t\t\t\t'keepValue' : this.common.parametri.crdSearch.CoordinatesParser.keepValue,\n\t\t\t\t\t\t\t'formWrap' : this.common.parametri.crdSearch.CoordinatesParser.formWrap,\n\t\t\t\t\t\t\t'polygonSize' : this.common.parametri.crdSearch.CoordinatesParser.polygonSize,\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'mapSearch':{\n\n\t\t\t\t\t\t'GeoSelector' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.mapSearch.GeoSelector.logEnabled,\n\t\t\t\t\t\t\t'spinnerEnabled' :  this.common.parametri.mapSearch.GeoSelector.spinnerEnabled,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'clickedPolygonSize' : this.common.parametri.mapSearch.GeoSelector.clickedPolygonSize,\n\n\t\t\t\t\t\t\t'tileServerEndpoint' : {\n\t\t\t\t\t\t\t\t'token': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.token\n\t\t\t\t\t\t\t\t,'minZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.minZoom\n\t\t\t\t\t\t\t\t,'maxZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxZoom\n\t\t\t\t\t\t\t\t,'maxBounds' : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxBounds\n\t\t\t\t\t\t\t\t,'centerCoordinates': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.centerCoordinates\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.getUrl\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'polygonColors':{\n\n\t\t\t\t\t\t\t\t'user' : {'line':'red','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'locations' : {'line':'yellow','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'products' : {'line':'white','fill':'white'}\n\t\t\t\t\t\t\t\t,'listed' : {'line':'blue','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'collection' : {'line':'#a4a4e4','fill':'#00ff0026'}\n\t\t\t\t\t\t\t\t,'layer' : {'line':'#d0d0d057','fill':'#0000f83d'}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'buttons' : {\n\n\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t,'marker' : {\n\n\t\t\t\t\t\t\t\t'url' : this.common.parametri.mapSearch.GeoSelector.marker.url\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t},\n\n\t\t\t\t'localizzazioni' : {\n\t\t\t\t\n\t\t\t\t\t'it-IT' : {\n\n\t\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t\t'lblSelectArea': 'Seleziona Area Geografica',\n\t\t\t\t\t\t\t'btnDrawPoint':'Seleziona Punto',\n\t\t\t\t\t\t\t'btnDrawPolygon':'Seleziona Area',\n\t\t\t\t\t\t\t'DrawRequired':'Richiesta selezione area geografica',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Stato Selezione Geografica',\n\t\t\t\t\t\t\t'noAreaSelected' : 'nessuna selezione effettuata, utilizzare gli strumenti di selezione',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Scegli una di queste opzioni',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selezione effettuata (poligono)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selezione effettuata (punto)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selezione effettuata (localit\u00e0)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selezione effettuata (coordinate)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch':{\n\t\t\t\t\t\t\t'ProductsList':{\n\t\t\t\t\t\t\t\t'noResult': 'Nessun Risultato', \n\t\t\t\t\t\t\t\t'startSearch':'Premi \"Effettua ricerca\" per visualizzare i risultati',\n\t\t\t\t\t\t\t\t'loadingSearch':  '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Caricamento collezione...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Effettua Ricerca',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading' : 'Caricamento\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Seleziona tipologia di prodotto',\n\t\t\t\t\t\t\t\t'selectCategory': 'Seleziona serie',\n\t\t\t\t\t\t\t\t'selectsAttribute': [{'idAttribute':23,'text':'Seleziona scala'}],\n\t\t\t\t\t\t\t\t'showProductGeometry' : 'Visualizza su Mappa',\n\t\t\t\t\t\t\t\t'addToCart' :  'Aggiungi al Carrello',\n\t\t\t\t\t\t\t\t'all' : 'Tutto',\n\t\t\t\t\t\t\t\t'resetResult' : 'Reset in corso, attendere.',\n\t\t\t\t\t\t\t\t'addonNoCart' : 'Variante non acquistabile.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'ANTEPRIMA A BASSA RISOLUZIONE DEL FILE ORIGINALE E COPERTA DA FILIGRANA',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Tipologia'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'chiudi'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch':{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'AutoComplete':{\n\n\t\t\t\t\t\t\t\t'label' :  'Ricerca Localit\u00e0'\n\t\t\t\t\t\t\t\t,'description':'Digitare il nome della localit\u00e0 che si intende cercare.'\t\n\t\t\t\t\t\t\t\t,'submit' :  'Applica'\n\t\t\t\t\t\t\t\t,'placeholder' : 'San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t,'searching' : 'Ricerca in corso...'\n\t\t\t\t\t\t\t\t,'select_option' : 'Seleziona la localit\u00e0 dall\\'elenco'\n\t\t\t\t\t\t\t\t,'no_options_found' : 'Nessuna localit\u00e0 trovata'\n\t\t\t\t\t\t\t\t,'no_option_selected' : 'Nessuna localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_selected' : 'Localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_removed' : 'Localit\u00e0 rimossa'\n\t\t\t\t\t\t\t\t,'min_chars' : 'il numero minimo di caratteri \u00e8'\n\t\t\t\t\t\t\t\t,'loading' : 'Caricamento...'\n                \n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca localit\u00e0',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Localit\u00e0',\n\t\t\t\t\t\t\t\t'description' : 'Digita la localit\u00e0 desiderata, seguita da provincia, comune e regione, separati da virgole o punto e virgola. \\nEs. San Casciano, Firenze\\nEs. San Casciano, Toscana\\nEs. San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t\t 'label' :  ''\n\t\t\t\t\t\t\t\t,'submit' :  'Cerca'\n\t\t\t\t\t\t\t\t,'description' : 'Digita le coordinate desiderate'\n\t\t\t\t\t\t\t\t,'placeholder_lat' : 'Latitudine'\n\t\t\t\t\t\t\t\t,'placeholder_lon' : 'Longitudine'\n\t\t\t\t\t\t\t\t,'processing' : 'Elaborazione in corso...'\n\t\t\t\t\t\t\t\t,'coords_not_valid' : 'Coordinate non valide'\n\t\t\t\t\t\t\t\t,'coords_processed' : 'Coordinate elaborate'\n\t\t\t\t\t\t\t\t,'coords_removed' : 'Coordinate rimosse'\n\t\t\t\t\t\t\t\t,'error_parsing' : 'Errore durante il parsing'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'description':'Digitare le coordinate con le quali effettuare la ricerca. I formati ammessi sono: \\nETRF2000 DD (Gradi decimali) \\nEs. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Gradi, minuti e secondi) \\nEs. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch':{\n\n\n\t\t\t\t\t\t\t'GeoSelector' :{\n\n\n\t\t\t\t\t\t\t\t'buttons' : {\n\n\t\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Aumenta Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Riduci Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Disegna Rettangolo',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Clicca e trascina per disegnare un\\'area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Rilasica per disegnare un\\'area'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Rimuovi tutto'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t'en-US' : {\n\n\t\t\t\t\t\t'mainWrapper' : {\n\t\t\t\t\t\t\t'lblSelectArea': 'Select Geographic Area',\n\t\t\t\t\t\t\t'btnDrawPoint': 'Select Point',\n\t\t\t\t\t\t\t'btnDrawPolygon': 'Select Area',\n\t\t\t\t\t\t\t'DrawRequired': 'Geographic area selection required',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Geographic Selection Status',\n\t\t\t\t\t\t\t'noAreaSelected' : 'no selection made, please use the selection tools',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Use one of theese tools',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selection made (polygon)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selection made (point)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selection made (location)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selection made (coordinates)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch': {\n\t\t\t\t\t\t\t'ProductsList': {\n\t\t\t\t\t\t\t\t'noResult': 'No Results',\n\t\t\t\t\t\t\t\t'startSearch': 'Click \"Search\" to view results',\n\t\t\t\t\t\t\t\t'loadingSearch': '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Loading collection...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Search',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading': 'Loading\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Select product type',\n\t\t\t\t\t\t\t\t'selectCategory': 'Select series',\n\t\t\t\t\t\t\t\t'selectsAttribute': [{'idAttribute':23,'text':'Select scale'}],\n\t\t\t\t\t\t\t\t'showProductGeometry': 'Show Perimeter',\n\t\t\t\t\t\t\t\t'addToCart': 'Add to Cart',\n\t\t\t\t\t\t\t\t'all': 'All',\n\t\t\t\t\t\t\t\t'resetResult': 'Reset in progress, please wait.',\n\t\t\t\t\t\t\t\t'addonNoCart': 'Variant not purchasable.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'WATERMARKED LOW RESOLUTION PREVIEW OF THE ORIGINAL FILE COVERED',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Type'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'close'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch': {\n\t\t\t\t\t\t\t'AutoComplete': {\n\t\t\t\t\t\t\t\t'label': 'Location Search',\n\t\t\t\t\t\t\t\t'description': 'Enter the name of the location you want to search for.',\n\t\t\t\t\t\t\t\t'submit': 'Apply',\n\t\t\t\t\t\t\t\t'placeholder': 'San Casciano, Firenze, Toscana',\n\t\t\t\t\t\t\t\t'searching': 'Searching...',\n\t\t\t\t\t\t\t\t'select_option': 'Select location from list',\n\t\t\t\t\t\t\t\t'no_options_found': 'No locations found',\n\t\t\t\t\t\t\t\t'no_option_selected': 'No location selected',\n\t\t\t\t\t\t\t\t'option_selected': 'Location selected',\n\t\t\t\t\t\t\t\t'option_removed': 'Location removed',\n\t\t\t\t\t\t\t\t'min_chars': 'minimum number of characters is',\n\t\t\t\t\t\t\t\t'loading' : 'Loading...'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Location Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Location Search',\n\t\t\t\t\t\t\t\t'description' : 'Type the desired location, followed by province, municipality and region, separated by commas or semicolons. \\nExample: San Casciano, Florence\\nExample: San Casciano, Tuscany\\nExample: San Casciano, Florence, Tuscany'\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch': {\n\t\t\t\t\t\t\t'CoordinatesParser': {\n\t\t\t\t\t\t\t\t'label': '',\n\t\t\t\t\t\t\t\t'submit': 'Search',\n\t\t\t\t\t\t\t\t'description': 'Enter desired coordinates',\n\t\t\t\t\t\t\t\t'placeholder_lat': 'Latitude',\n\t\t\t\t\t\t\t\t'placeholder_lon': 'Longitude', \n\t\t\t\t\t\t\t\t'processing': 'Processing...',\n\t\t\t\t\t\t\t\t'coords_not_valid': 'Invalid coordinates',\n\t\t\t\t\t\t\t\t'coords_processed': 'Coordinates processed',\n\t\t\t\t\t\t\t\t'coords_removed': 'Coordinates removed',\n\t\t\t\t\t\t\t\t'error_parsing': 'Error while parsing'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'description': 'Enter coordinates to search. Accepted formats are:\\nETRF2000 DD (Decimal degrees)\\nEx. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Degrees, minutes and seconds)\\nEx. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch': {\n\t\t\t\t\t\t\t'GeoSelector': {\n\t\t\t\t\t\t\t\t'buttons': {\n\t\t\t\t\t\t\t\t\t'zoomIn': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom In'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'zoomOut': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom Out'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'drawRectangle': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Draw Rectangle',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Click and drag to draw an area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Release to draw an area'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'removeAll': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Remove All'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\t\/\/selettore geogarfico foto aeree\n\t\t\tfoto_aeree = {\n\n\t\t\t\t'parametri' : {\n\n\n\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t'logEnabled' : this.common.parametri.mainWrapper.logEnabled,\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'prdSearch':{\n\n\t\t\t\t\t\t'ProductsList' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.prdSearch.ProductsList.logEnabled,\n\n\t\t\t\t\t\t\t'WooCommerceAPIKey' : {\n\t\t\t\t\t\t\t\t'key' :  this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.key,\n\t\t\t\t\t\t\t\t'secret' : this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.secret\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'resultsPerPage' : this.common.parametri.prdSearch.ProductsList.resultsPerPage,\n\t\t\t\t\t\t\t'backgroundLoadCallsLimit' : this.common.parametri.prdSearch.ProductsList.backgroundLoadCallsLimit,\n\t\t\t\t\t\t\t'backgroundLoadTriesLimit' :this.common.parametri.prdSearch.ProductsList.backgroundLoadTriesLimit,\n\n\t\t\t\t\t\t\t'icons' : {\n\n\t\t\t\t\t\t\t\t'showProductGeometry' :  this.common.parametri.prdSearch.ProductsList.icons.showProductGeometry,\n\t\t\t\t\t\t\t\t'addToCart' :  this.common.parametri.prdSearch.ProductsList.icons.addToCart,\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'idProductTag' :  356,\n\t\t\t\t\t\t\t'filterCatInGeometry' : false,\n\t\t\t\t\t\t\t'filterAttrInGeometry' : true,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'filterCategories' : [\n\n\t\t\t\t\t\t\t\t{'id':175,'slug':'foto-aeree','autoZoom':true}\n\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAttributes' : [\n\n\t\t\t\t\t\t\t\t{'id':13,'name':'anno','idLinkedCategory':175,'required':true,'startNumberValue':1935} \/\/startNumberValue solo se valori sono numeri\n\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAddons' : [\n\n\t\t\t\t\t\t\t\t{'idAddon':34,'idAddonCategory':214,'slug':'tecnica_variazioni_formato_foto_aerea','idLinkedCategory':175,'noCartIndexes':[]}\n\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'productListAttributeSlugs':[\n\n\t\t\t\t\t\t\t\t{'slug':'anno','idLinkedCategory':175,'fixName':(name)=>{return name;}}\n\t\t\t\t\t\t\t\t,{'slug':'quota','idLinkedCategory':175,'fixName':(name)=>{return name;}}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'layerCategories':[\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/slugAttribute *: tutti gli attributi (TODO)\n\t\t\t\t\t\t\t\t\/\/valueAttribute *: tutti i valori dell' attributo (TODO)\n\t\t\t\t\t\t\t\t\/\/i valori tra gli array sono considerati in colonna (1:1)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':175\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_anno'\n\t\t\t\t\t\t\t\t\t,get valueAttributeOption(){return igmGeoSelector.prdSearch.productsList.lastVisibleAttrSelVals.filter(a => a.nameAttribute == 'pa_anno')[0]?.value ?? 'xxx'}\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[{get value(){ return igmGeoSelector.prdSearch.productsList.lastVisibleAttrSelVals.filter(a => a.nameAttribute == 'pa_anno')[0]?.value ?? 'xxx' }}]\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':[false]\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[false]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[false]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[true] \/\/abilita poligono o immagine estesa su poligono (iconurl non false)\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':[] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'locSearch':{\n\n\t\t\t\t\t\t'AutoComplete' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.locSearch.AutoComplete.logEnabled,\n\t\t\t\t\t\t\t'minCharsInput':this.common.parametri.locSearch.AutoComplete.minCharsInput,\n\t\t\t\t\t\t\t'isRequired':this.common.parametri.locSearch.AutoComplete.isRequired,\n\t\t\t\t\t\t\t'submitOnChange': this.common.parametri.locSearch.AutoComplete.submitOnChange, \n\t\t\t\t\t\t\t'formWrap':this.common.parametri.locSearch.AutoComplete.formWrap,\n\t\t\t\t\t\t\t'geoCodingEndpoint' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t'token' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.token\n\t\t\t\t\t\t\t\t,'limitResults' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.limitResults\n\t\t\t\t\t\t\t\t,'code_EPSG' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.code_EPSG\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.getUrl\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\t\n\t\t\t\t\t},\n\n\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t\n\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.crdSearch.CoordinatesParser.logEnabled,\n\t\t\t\t\t\t\t'keepValue' : this.common.parametri.crdSearch.CoordinatesParser.keepValue,\n\t\t\t\t\t\t\t'formWrap' : this.common.parametri.crdSearch.CoordinatesParser.formWrap,\n\t\t\t\t\t\t\t'polygonSize' : this.common.parametri.crdSearch.CoordinatesParser.polygonSize,\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'mapSearch':{\n\n\t\t\t\t\t\t'GeoSelector' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.mapSearch.GeoSelector.logEnabled,\n\t\t\t\t\t\t\t'spinnerEnabled' :  this.common.parametri.mapSearch.GeoSelector.spinnerEnabled,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'clickedPolygonSize' : this.common.parametri.mapSearch.GeoSelector.clickedPolygonSize,\n\n\t\t\t\t\t\t\t'tileServerEndpoint' : {\n\t\t\t\t\t\t\t\t'token': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.token\n\t\t\t\t\t\t\t\t,'minZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.minZoom\n\t\t\t\t\t\t\t\t,'maxZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxZoom\n\t\t\t\t\t\t\t\t,'maxBounds' : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxBounds\n\t\t\t\t\t\t\t\t,'centerCoordinates': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.centerCoordinates\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.getUrl\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'polygonColors':{\n\n\t\t\t\t\t\t\t\t'user' : {'line':'red','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'locations' : {'line':'yellow','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'products' : {'line':'#00ff00','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'listed' : {'line':'blue','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'collection' : {'line':'white','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'layer' : {'line':'#d0d0d057','fill':'#0000f83d'}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'buttons' : {\n\n\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t,'marker' : {\n\n\t\t\t\t\t\t\t\t'url' : this.common.parametri.mapSearch.GeoSelector.marker.url\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t},\n\n\t\t\t\t'localizzazioni' : {\n\n\t\t\t\t\t'it-IT' : {\n\n\t\t\t\t\t\t 'mainWrapper' : {\n\n\t\t\t\t\t\t\t'lblSelectArea': 'Seleziona Area Geografica',\n\t\t\t\t\t\t\t'btnDrawPoint':'Seleziona Punto',\n\t\t\t\t\t\t\t'btnDrawPolygon':'Seleziona Area',\n\t\t\t\t\t\t\t'DrawRequired':'Richiesta selezione area geografica',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Stato Selezione Geografica',\n\t\t\t\t\t\t\t'noAreaSelected' : 'nessuna selezione effettuata, utilizzare gli strumenti di selezione',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Scegli una di queste opzioni',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selezione effettuata (poligono)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selezione effettuata (punto)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selezione effettuata (localit\u00e0)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selezione effettuata (coordinate)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch':{\n\n\t\t\t\t\t\t\t'ProductsList':{\n\n\t\t\t\t\t\t\t\t'noResult': 'Nessun Risultato', \n\t\t\t\t\t\t\t\t'startSearch':'Premi \"Effettua ricerca\" per visualizzare i risultati',\n\t\t\t\t\t\t\t\t'loadingSearch':  '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Caricamento strisciata...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Effettua Ricerca',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading' : 'Caricamento\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Seleziona tipologia di prodotto',\n\t\t\t\t\t\t\t\t'selectCategory': 'Seleziona categoria',\n\t\t\t\t\t\t\t\t'selectsAttribute': [\n\t\t\t\t\t\t\t\t\t{'idAttribute':13,'text':'Seleziona anno'}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t'showProductGeometry' : 'Visualizza su Mappa',\n\t\t\t\t\t\t\t\t'addToCart' :  'Aggiungi al Carrello',\n\t\t\t\t\t\t\t\t'all' : 'Tutto',\n\t\t\t\t\t\t\t\t'resetResult' : 'Reset in corso, attendere.',\n\t\t\t\t\t\t\t\t'addonNoCart' : 'Variante non acquistabile.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'ANTEPRIMA A BASSA RISOLUZIONE DEL FILE ORIGINALE E COPERTA DA FILIGRANA',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Tipologia'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'chiudi'\n\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch':{\n\t\t\t\t\t\t\t'AutoComplete':{\n\n\t\t\t\t\t\t\t\t'label' :  'Ricerca Localit\u00e0'\n\t\t\t\t\t\t\t\t,'description':'Digitare il nome della localit\u00e0 che si intende cercare.'\n\t\t\t\t\t\t\t\t,'submit' :  'Applica'\n\t\t\t\t\t\t\t\t,'placeholder' : 'San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t,'searching' : 'Ricerca in corso...'\n\t\t\t\t\t\t\t\t,'select_option' : 'Seleziona la localit\u00e0 dall\\'elenco'\n\t\t\t\t\t\t\t\t,'no_options_found' : 'Nessuna localit\u00e0 trovata'\n\t\t\t\t\t\t\t\t,'no_option_selected' : 'Nessuna localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_selected' : 'Localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_removed' : 'Localit\u00e0 rimossa'\n\t\t\t\t\t\t\t\t,'min_chars' : 'il numero minimo di caratteri \u00e8'\n                \t\t\t\t,'loading' : 'Caricamento...'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca localit\u00e0',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Localit\u00e0',\n\t\t\t\t\t\t\t\t'description' : 'Digita la localit\u00e0 desiderata, seguita da provincia, comune e regione, separati da virgole o punto e virgola. \\nEs. San Casciano, Firenze\\nEs. San Casciano, Toscana\\nEs. San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t\t'label' :  'Ricerca Coordinate'\n\t\t\t\t\t\t\t\t,'submit' :  'Cerca'\n\t\t\t\t\t\t\t\t,'description' : 'Digita le coordinate desiderate'\n\t\t\t\t\t\t\t\t,'placeholder_lat' : 'Latitudine'\n\t\t\t\t\t\t\t\t,'placeholder_lon' : 'Longitudine'\n\t\t\t\t\t\t\t\t,'processing' : 'Elaborazione in corso...'\n\t\t\t\t\t\t\t\t,'coords_not_valid' : 'Coordinate non valide'\n\t\t\t\t\t\t\t\t,'coords_processed' : 'Coordinate elaborate'\n\t\t\t\t\t\t\t\t,'coords_removed' : 'Coordinate rimosse'\n\t\t\t\t\t\t\t\t,'error_parsing' : 'Errore durante il parsing'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'description':'Digitare le coordinate con le quali effettuare la ricerca. I formati ammessi sono: \\nETRF2000 DD (Gradi decimali) \\nEs. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Gradi, minuti e secondi) \\nEs. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch':{\n\n\n\t\t\t\t\t\t\t'GeoSelector' :{\n\n\n\t\t\t\t\t\t\t\t'buttons' : {\n\n\t\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Aumenta Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Riduci Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Disegna Rettangolo',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Clicca e trascina per disegnare un\\'area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Rilasica per disegnare un\\'area'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Rimuovi tutto',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Clicca e trascina per disegnare un\\'area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Rilasica per disegnare un\\'area'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'en-US' : {\n\n\t\t\t\t\t\t'mainWrapper': {\n\t\t\t\t\t\t\t'lblSelectArea': 'Select Geographic Area',\n\t\t\t\t\t\t\t'btnDrawPoint': 'Select Point', \n\t\t\t\t\t\t\t'btnDrawPolygon': 'Select Area',\n\t\t\t\t\t\t\t'DrawRequired': 'Geographic area selection required',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Geographic Selection Status',\n\t\t\t\t\t\t\t'noAreaSelected' : 'no selection made, please use the selection tools',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Use one of theese tools',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selection made (polygon)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selection made (point)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selection made (location)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selection made (coordinates)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch': {\n\t\t\t\t\t\t\t'ProductsList': {\n\t\t\t\t\t\t\t\t'noResult': 'No Results',\n\t\t\t\t\t\t\t\t'startSearch': 'Click \"Search\" to view results', \n\t\t\t\t\t\t\t\t'loadingSearch': '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Loading swipe...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Search',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading': 'Loading\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Select product type',\n\t\t\t\t\t\t\t\t'selectCategory': 'Select category',\n\t\t\t\t\t\t\t\t'selectsAttribute': [\n\t\t\t\t\t\t\t\t\t{'idAttribute':13,'text':'Select year'}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t'showProductGeometry': 'Show Perimeter',\n\t\t\t\t\t\t\t\t'addToCart': 'Add to Cart',\n\t\t\t\t\t\t\t\t'all': 'All',\n\t\t\t\t\t\t\t\t'resetResult': 'Reset in progress, please wait.',\n\t\t\t\t\t\t\t\t'addonNoCart': 'Variant not purchasable.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'WATERMARKED LOW RESOLUTION PREVIEW OF THE ORIGINAL FILE COVERED',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Type'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'close'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch': {\n\t\t\t\t\t\t\t'AutoComplete': {\n\t\t\t\t\t\t\t\t'label': 'Location Search',\n\t\t\t\t\t\t\t\t'description': 'Enter the name of the location you want to search for.',\n\t\t\t\t\t\t\t\t'submit': 'Apply',\n\t\t\t\t\t\t\t\t'placeholder': 'San Casciano, Firenze, Toscana',\n\t\t\t\t\t\t\t\t'searching': 'Searching...',\n\t\t\t\t\t\t\t\t'select_option': 'Select location from list',\n\t\t\t\t\t\t\t\t'no_options_found': 'No locations found',\n\t\t\t\t\t\t\t\t'no_option_selected': 'No location selected', \n\t\t\t\t\t\t\t\t'option_selected': 'Location selected',\n\t\t\t\t\t\t\t\t'option_removed': 'Location removed',\n\t\t\t\t\t\t\t\t'min_chars': 'minimum number of characters is',\n\t\t\t\t\t\t\t\t'loading' : 'Loading...'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Location Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Location Search',\n\t\t\t\t\t\t\t\t'description' : 'Type the desired location, followed by province, municipality and region, separated by commas or semicolons. \\nExample: San Casciano, Florence\\nExample: San Casciano, Tuscany\\nExample: San Casciano, Florence, Tuscany'\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch': {\n\t\t\t\t\t\t\t'CoordinatesParser': {\n\t\t\t\t\t\t\t\t'label': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'submit': 'Search',\n\t\t\t\t\t\t\t\t'description': 'Enter desired coordinates',\n\t\t\t\t\t\t\t\t'placeholder_lat': 'Latitude',\n\t\t\t\t\t\t\t\t'placeholder_lon': 'Longitude', \n\t\t\t\t\t\t\t\t'processing': 'Processing...',\n\t\t\t\t\t\t\t\t'coords_not_valid': 'Invalid coordinates',\n\t\t\t\t\t\t\t\t'coords_processed': 'Coordinates processed',\n\t\t\t\t\t\t\t\t'coords_removed': 'Coordinates removed',\n\t\t\t\t\t\t\t\t'error_parsing': 'Error while parsing'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'description': 'Enter coordinates to search. Accepted formats are:\\nETRF2000 DD (Decimal degrees)\\nEx. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Degrees, minutes and seconds)\\nEx. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch': {\n\t\t\t\t\t\t\t'GeoSelector': {\n\t\t\t\t\t\t\t\t'buttons': {\n\t\t\t\t\t\t\t\t\t'zoomIn': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom In'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'zoomOut': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom Out'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'drawRectangle': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Draw Rectangle',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Click and drag to draw an area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Release to draw an area'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'removeAll': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Remove All'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t\/\/selettore geografico elementi geodetici\n\t\t\telementi_geodetici = {\n\n\t\t\t\t'parametri' : {\n\n\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t'logEnabled' : this.common.parametri.mainWrapper.logEnabled,\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'prdSearch':{\n\n\t\t\t\t\t\t'ProductsList' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.prdSearch.ProductsList.logEnabled,\n\n\t\t\t\t\t\t\t'WooCommerceAPIKey' : {\n\t\t\t\t\t\t\t\t'key' :  this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.key,\n\t\t\t\t\t\t\t\t'secret' : this.common.parametri.prdSearch.ProductsList.WooCommerceAPIKey.secret\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'resultsPerPage' : this.common.parametri.prdSearch.ProductsList.resultsPerPage,\n\t\t\t\t\t\t\t'backgroundLoadCallsLimit' : this.common.parametri.prdSearch.ProductsList.backgroundLoadCallsLimit,\n\t\t\t\t\t\t\t'backgroundLoadTriesLimit' :this.common.parametri.prdSearch.ProductsList.backgroundLoadTriesLimit,\n\n\t\t\t\t\t\t\t'icons' : {\n\n\t\t\t\t\t\t\t\t'showProductGeometry' :  this.common.parametri.prdSearch.ProductsList.icons.showProductGeometry,\n\t\t\t\t\t\t\t\t'addToCart' :  this.common.parametri.prdSearch.ProductsList.icons.addToCart,\n\t\t\t\t\t\t\t},\n\n\n\t\t\t\t\t\t\t'idProductTag' :  388,\n\t\t\t\t\t\t\t'filterCatInGeometry' : false,\n\t\t\t\t\t\t\t'filterAttrInGeometry' : true,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'filterCategories' : [\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t \/\/NB: \u00e8 possibile indicare un tag diverso con idCustomTag\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{'id':187,'slug':'grigliati_punto','autoZoom':true},\n\t\t\t\t\t\t\t\t{'id':188,'slug':'grigliati_foglio','autoZoom':true},\n\t\t\t\t\t\t\t\t{'id':203,'slug':'capisaldi-livellazione','autoZoom':false},\n\t\t\t\t\t\t\t\t{'id':219,'slug':'igm95','autoZoom':false},\n\t\t\t\t\t\t\t\t{'id':220,'slug':'vertici-trigonometrici','autoZoom':false}\n\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAttributes' : [\n\n\t\t\t\t\t\t\t\t{ 'id':32,'name':'Tipo di rete','slug':'pa_tipo-di-rete','idLinkedCategory':219,'required':false },\n\t\t\t\t\t\t\t\t{'id':34,'name':'Tipo di vertice','slug':'pa_tipo-di-vertice','idLinkedCategory':220,'required':false}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t'filterAddons' : [\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{'idAddon':36,'idAddonCategory':216,'slug':'tecnica_sistema_proiezione_grigliati_foglio','idLinkedCategory':188,'noCartIndexes':[]},\n\t\t\t\t\t\t\t\t{'idAddon':37,'idAddonCategory':217,'slug':'tecnica_sistema_proiezione_grigliati_punto','idLinkedCategory':187,'noCartIndexes':[]},\n\t\t\t\t\t\t\t\t{'idAddon':38,'idAddonCategory':218,'slug':'tecnica_prezzo_caposaldi_livellazione','idLinkedCategory':203,'noCartIndexes':[]}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t],\n\n\t\t\t\t\t\t\t\/*attributi mostrati in elenco prodotti*\/\n\t\t\t\t\t\t\t'productListAttributeSlugs':[\n\n\n\t\t\t\t\t\t\t\t\/*{'slug':'info ausiliarie','idLinkedCategory':220},*\/\n\t\t\t\t\t\t\t\t\/*{'slug':'progressiva km','idLinkedCategory':203},*\/\n\t\t\t\t\t\t\t\t\/*{'slug':'ultima ricognizione','idLinkedCategory':203},*\/\n\t\t\t\t\t\t\t\t{'slug':'pa_tipo-di-rete','idLinkedCategory':219,'fixName':(name)=>{return name;}},\n\t\t\t\t\t\t\t\t{'slug':'pa_tipo-di-vertice','idLinkedCategory':220,'fixName':(name)=>{return name;}}\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'layerCategories':[\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/slugAttribute *: tutti gli attributi (TODO)\n\t\t\t\t\t\t\t\t\/\/valueAttribute *: tutti i valori dell' attributo (TODO)\n\t\t\t\t\t\t\t\t\/\/i valori tra gli array sono considerati in colonna (1:1)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':219\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-rete'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'Rete Primaria'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false \/\/TODO: attributo principale custom, non registrare\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Rete Primaria','Rete Primaria']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/vertice_igm95_rete_primaria.png','\/base64_imgs\/vertice_igm95_rete_primaria_quotato_livellazione.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12],[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6],[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false,false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[ \/\/1 oggetto per ogni valuesAttribute\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['NOT LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':219\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-rete'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'Rete di Raffittimento'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Rete di Raffittimento','Rete di Raffittimento']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/vertice_igm95_rete_raffittimento.png','\/base64_imgs\/vertice_igm95_rete_raffittimento_quotato_livellazione.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12],[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6],[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false,false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['NOT LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} ,\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':219\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-rete'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'A'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Rete Primaria','Rete Primaria','Rete di Raffittimento','Rete di Raffittimento']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':[\n\t\t\t\t\t\t\t\t\t\t\t'\/base64_imgs\/vertice_igm95_rete_primaria.png'\n\t\t\t\t\t\t\t\t\t\t\t,'\/base64_imgs\/vertice_igm95_rete_primaria_quotato_livellazione.png'\n\t\t\t\t\t\t\t\t\t\t\t,'\/base64_imgs\/vertice_igm95_rete_raffittimento.png'\n\t\t\t\t\t\t\t\t\t\t\t,'\/base64_imgs\/vertice_igm95_rete_raffittimento_quotato_livellazione.png'\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12],[12, 12],[12, 12],[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6],[6,6],[6,6],[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false,false,false,false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['NOT LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['NOT LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} ,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':220\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-vertice'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'Vertici di incerta definizione'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Vertici di incerta definizione']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/vertice_trigonometrico_definizione_incerta.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':[] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':220\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-vertice'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'Vertici di certa definizione'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Vertici di certa definizione']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/vertice_trigonometrico_definizione_certa.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':[] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':220\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'pa_tipo-di-vertice'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'A'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':['Vertici di certa definizione','Vertici di incerta definizione']\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/vertice_trigonometrico_definizione_certa.png','\/base64_imgs\/vertice_trigonometrico_definizione_incerta.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12],[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6],[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false,false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':[] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':[] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':203\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'*'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'*'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[null]\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/caposaldo_livellazione_post_1996.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[12, 12]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[6,6]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[false]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':187\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'*'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'*'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[null]\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':['\/base64_imgs\/grigliati_punto.png']\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[[80, 80]]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[[40,40]]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[true]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'idLinkedCategory':188\n\t\t\t\t\t\t\t\t\t,'slugAttribute':'*'\n\t\t\t\t\t\t\t\t\t,'valueAttributeOption':'*'\n\t\t\t\t\t\t\t\t\t,'data':{\n\t\t\t\t\t\t\t\t\t\t'isAttributeCustom':false\n\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[null]\n\t\t\t\t\t\t\t\t\t\t,'iconUrls':[false] \/\/false usa colori poligono listed\n\t\t\t\t\t\t\t\t\t\t,'iconSizes':[false]\n\t\t\t\t\t\t\t\t\t\t,'iconAnchors':[false]\n\t\t\t\t\t\t\t\t\t\t,'stretchOnPolygon':[true]\n\t\t\t\t\t\t\t\t\t\t,'drawProductList':false\n\t\t\t\t\t\t\t\t\t\t,'ausiliaryAttributes':[\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t'slugsAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'areAttributesCustom':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'valuesAttribute':[]\n\t\t\t\t\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/ '=', '<>', 'LIKE', 'NOT LIKE'\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'locSearch':{\n\n\t\t\t\t\t\t'AutoComplete' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.locSearch.AutoComplete.logEnabled,\n\t\t\t\t\t\t\t'minCharsInput':this.common.parametri.locSearch.AutoComplete.minCharsInput,\n\t\t\t\t\t\t\t'isRequired':this.common.parametri.locSearch.AutoComplete.isRequired,\n\t\t\t\t\t\t\t'submitOnChange': this.common.parametri.locSearch.AutoComplete.submitOnChange, \n\t\t\t\t\t\t\t'formWrap':this.common.parametri.locSearch.AutoComplete.formWrap,\n\t\t\t\t\t\t\t'geoCodingEndpoint' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t'token' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.token\n\t\t\t\t\t\t\t\t,'limitResults' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.limitResults\n\t\t\t\t\t\t\t\t,'code_EPSG' : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.code_EPSG\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.locSearch.AutoComplete.geoCodingEndpoint.getUrl\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\t\n\t\t\t\t\t},\n\n\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t\n\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.crdSearch.CoordinatesParser.logEnabled,\n\t\t\t\t\t\t\t'keepValue' : this.common.parametri.crdSearch.CoordinatesParser.keepValue,\n\t\t\t\t\t\t\t'formWrap' : this.common.parametri.crdSearch.CoordinatesParser.formWrap,\n\t\t\t\t\t\t\t'polygonSize' : this.common.parametri.crdSearch.CoordinatesParser.polygonSize,\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'CssPopup':{}\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'mapSearch':{\n\n\t\t\t\t\t\t'GeoSelector' : {\n\n\t\t\t\t\t\t\t'logEnabled' : this.common.parametri.mapSearch.GeoSelector.logEnabled,\n\t\t\t\t\t\t\t'spinnerEnabled' :  this.common.parametri.mapSearch.GeoSelector.spinnerEnabled,\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'clickedPolygonSize' : this.common.parametri.mapSearch.GeoSelector.clickedPolygonSize,\n\n\t\t\t\t\t\t\t'tileServerEndpoint' : {\n\t\t\t\t\t\t\t\t'token': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.token\n\t\t\t\t\t\t\t\t,'minZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.minZoom\n\t\t\t\t\t\t\t\t,'maxZoom': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxZoom\n\t\t\t\t\t\t\t\t,'maxBounds' : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.maxBounds\n\t\t\t\t\t\t\t\t,'centerCoordinates': this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.centerCoordinates\n\t\t\t\t\t\t\t\t,getUrl : this.common.parametri.mapSearch.GeoSelector.tileServerEndpoint.getUrl\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'polygonColors':{\n\n\t\t\t\t\t\t\t\t'user' : {'line':'red','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'locations' : {'line':'yellow','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'products' : {'line':'white','fill':'white'}\n\t\t\t\t\t\t\t\t,'listed' : {'line':'blue','fill':'transparent'}\n\t\t\t\t\t\t\t\t,'collection' : {'line':'#a4a4e4','fill':'#00ff0026'}\n\t\t\t\t\t\t\t\t,'layer' : {'line':'#d0d0d057','fill':'#0000f83d'}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'buttons' : {\n\n\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomIn.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.zoomOut.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.drawRectangle.icon\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t'enable' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.enable\n\t\t\t\t\t\t\t\t\t,'icon' : this.common.parametri.mapSearch.GeoSelector.buttons.removeAll.icon\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t,'marker' : {\n\n\t\t\t\t\t\t\t\t'url' : this.common.parametri.mapSearch.GeoSelector.marker.url\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\n\t\t\t\t},\n\n\t\t\t\t'localizzazioni' : {\n\n\t\t\t\t\t'it-IT' : {\n\n\t\t\t\t\t\t'mainWrapper' : {\n\n\t\t\t\t\t\t\t'lblSelectArea': 'Seleziona Area Geografica',\n\t\t\t\t\t\t\t'btnDrawPoint':'Seleziona Punto',\n\t\t\t\t\t\t\t'btnDrawPolygon':'Seleziona Area',\n\t\t\t\t\t\t\t'DrawRequired':'Richiesta selezione area geografica',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Stato Selezione Geografica',\n\t\t\t\t\t\t\t'noAreaSelected' : 'nessuna selezione effettuata, utilizzare gli strumenti di selezione',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Scegli una di queste opzioni',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selezione effettuata (poligono)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selezione effettuata (punto)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selezione effettuata (localit\u00e0)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selezione effettuata (coordinate)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch':{\n\t\t\t\t\t\t\t'ProductsList':{\n\t\t\t\t\t\t\t\t'noResult': 'Nessun Risultato', \n\t\t\t\t\t\t\t\t'startSearch':'Premi \"Effettua ricerca\" visualizzare i risultati',\n\t\t\t\t\t\t\t\t'loadingSearch':  '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Caricamento collezione...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Effettua Ricerca',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading' : 'Caricamento\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Seleziona tipologia di prodotto',\n\t\t\t\t\t\t\t\t'selectCategory': 'Seleziona El. Geodetico',\n\t\t\t\t\t\t\t\t'selectsAttribute': [\n\t\t\t\t\t\t\t\t\t{'idAttribute':32,'text':'Seleziona tipo di rete','all':'Rete IGM95'},\n\t\t\t\t\t\t\t\t\t{'idAttribute':34,'text':'Seleziona tipo di vertice','all':'Vertici trigonometrici'}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t'showProductGeometry' : 'Visualizza su Mappa',\n\t\t\t\t\t\t\t\t'addToCart' :  'Aggiungi al Carrello',\n\t\t\t\t\t\t\t\t'all' : 'Tutto',\n\t\t\t\t\t\t\t\t'resetResult' : 'Reset in corso, attendere.',\n\t\t\t\t\t\t\t\t'addonNoCart' : 'Variante non acquistabile.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'ANTEPRIMA A BASSA RISOLUZIONE DEL FILE ORIGINALE E COPERTA DA FILIGRANA',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Tipologia'\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'chiudi'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch':{\n\n\t\t\t\t\t\t\t'AutoComplete':{\n\n\t\t\t\t\t\t\t\t'label' :  'Ricerca Localit\u00e0'\n\t\t\t\t\t\t\t\t,'description':'Digitare il nome della localit\u00e0 che si intende cercare.'\t\n\t\t\t\t\t\t\t\t,'submit' :  'Applica'\n\t\t\t\t\t\t\t\t,'placeholder' : 'San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t,'searching' : 'Ricerca in corso...'\n\t\t\t\t\t\t\t\t,'select_option' : 'Seleziona la localit\u00e0 dall\\'elenco'\n\t\t\t\t\t\t\t\t,'no_options_found' : 'Nessuna localit\u00e0 trovata'\n\t\t\t\t\t\t\t\t,'no_option_selected' : 'Nessuna localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_selected' : 'Localit\u00e0 selezionata'\n\t\t\t\t\t\t\t\t,'option_removed' : 'Localit\u00e0 rimossa'\n\t\t\t\t\t\t\t\t,'min_chars' : 'il numero minimo di caratteri \u00e8'\n\t\t\t\t\t\t\t\t,'loading' : 'Caricamento...'\n\n\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca localit\u00e0',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Localit\u00e0',\n\t\t\t\t\t\t\t\t'description' : 'Digita la localit\u00e0 desiderata, seguita da provincia, comune e regione, separati da virgole o punto e virgola. \\nEs. San Casciano, Firenze\\nEs. San Casciano, Toscana\\nEs. San Casciano, Firenze, Toscana'\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch':{\n\t\t\t\t\t\t\t'CoordinatesParser':{\n\n\t\t\t\t\t\t\t\t'label' :  ''\n\t\t\t\t\t\t\t\t,'submit' :  'Cerca'\n\t\t\t\t\t\t\t\t,'description' : 'Digita le coordinate desiderate'\n\t\t\t\t\t\t\t\t,'placeholder_lat' : 'Latitudine'\n\t\t\t\t\t\t\t\t,'placeholder_lon' : 'Longitudine'\n\t\t\t\t\t\t\t\t,'processing' : 'Elaborazione in corso...'\n\t\t\t\t\t\t\t\t,'coords_not_valid' : 'Coordinate non valide'\n\t\t\t\t\t\t\t\t,'coords_processed' : 'Coordinate elaborate'\n\t\t\t\t\t\t\t\t,'coords_removed' : 'Coordinate rimosse'\n\t\t\t\t\t\t\t\t,'error_parsing' : 'Errore durante il parsing'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\t\t\t\t\t\t\t\t'buttonOpen':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'buttonClose':'chiudi',\n\t\t\t\t\t\t\t\t'title':'Ricerca Coordinate',\n\t\t\t\t\t\t\t\t'description':'Digitare le coordinate con le quali effettuare la ricerca. I formati ammessi sono: \\nETRF2000 DD (Gradi decimali) \\nEs. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Gradi, minuti e secondi) \\nEs. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch':{\n\n\n\t\t\t\t\t\t\t'GeoSelector' :{\n\n\n\t\t\t\t\t\t\t\t'buttons' : {\n\n\t\t\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Aumenta Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Riduci Zoom'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Disegna Rettangolo',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Clicca e trascina per disegnare un\\'area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Rilasica per disegnare un\\'area'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t\t\t'title' : 'Rimuovi tutto'\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t},\n\n\t\t\t\t\t'en-US' : {\n\n\t\t\t\t\t\t'mainWrapper': {\n\t\t\t\t\t\t\t'lblSelectArea': 'Select Geographic Area',\n\t\t\t\t\t\t\t'btnDrawPoint': 'Select Point',\n\t\t\t\t\t\t\t'btnDrawPolygon': 'Select Area', \n\t\t\t\t\t\t\t'DrawRequired': 'Geographic area selection required',\n\t\t\t\t\t\t\t'lblSelectedArea' : 'Geographic Selection Status',\n\t\t\t\t\t\t\t'noAreaSelected' : 'no selection made, please use the selection tools',\n\t\t\t\t\t\t\t'useAreaSelectionTools' : 'Use one of theese tools',\n\t\t\t\t\t\t\t'polygonAreaSelected' : 'selection made (polygon)',\n\t\t\t\t\t\t\t'markerAreaSelected' : 'selection made (point)',\n\t\t\t\t\t\t\t'locationAreaSelected' : 'selection made (location)',\n\t\t\t\t\t\t\t'coordinatesAreaSelected' : 'selection made (coordinates)',\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'prdSearch': {\n\t\t\t\t\t\t\t'ProductsList': {\n\t\t\t\t\t\t\t\t'noResult': 'No Results',\n\t\t\t\t\t\t\t\t'startSearch': 'Click \"Search\" to view results',\n\t\t\t\t\t\t\t\t'loadingSearch': '...',\n\t\t\t\t\t\t\t\t'loadingCollection':  'Loading collection...',\n\t\t\t\t\t\t\t\t'filtersSubmit':'Search',\n\t\t\t\t\t\t\t\t'filtersReset':'Reset',\n\t\t\t\t\t\t\t\t'loading': 'Loading\u2026',\n\t\t\t\t\t\t\t\t'selectVariation': 'Select product type', \n\t\t\t\t\t\t\t\t'selectCategory': 'Select Geodetic El.',\n\t\t\t\t\t\t\t\t'selectsAttribute': [\n\t\t\t\t\t\t\t\t\t{'idAttribute':32,'text':'Select network type','all':'IGM95 Network'},\n\t\t\t\t\t\t\t\t\t{'idAttribute':34,'text':'Select vertex type','all':'Trigonometric Vertexes'}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t'showProductGeometry': 'Show Perimeter',\n\t\t\t\t\t\t\t\t'addToCart': 'Add to Cart',\n\t\t\t\t\t\t\t\t'all': 'All',\n\t\t\t\t\t\t\t\t'resetResult': 'Reset in progress, please wait.',\n\t\t\t\t\t\t\t\t'addonNoCart': 'Variant not purchasable.',\n\t\t\t\t\t\t\t\t'lowQualityImage' : 'WATERMARKED LOW RESOLUTION PREVIEW OF THE ORIGINAL FILE COVERED',\n\t\t\t\t\t\t\t\t'detailSelectedVariation' : 'Type'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup':{\n\n\t\t\t\t\t\t\t\t'buttonClose' : 'close'\n\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'locSearch': {\n\t\t\t\t\t\t\t'AutoComplete': {\n\t\t\t\t\t\t\t\t'label': 'Location Search',\n\t\t\t\t\t\t\t\t'description': 'Enter the name of the location you want to search for.',\n\t\t\t\t\t\t\t\t'submit': 'Apply',\n\t\t\t\t\t\t\t\t'placeholder': 'San Casciano, Firenze, Toscana',\n\t\t\t\t\t\t\t\t'searching': 'Searching...',\n\t\t\t\t\t\t\t\t'select_option': 'Select location from list',\n\t\t\t\t\t\t\t\t'no_options_found': 'No locations found',\n\t\t\t\t\t\t\t\t'no_option_selected': 'No location selected',\n\t\t\t\t\t\t\t\t'option_selected': 'Location selected',\n\t\t\t\t\t\t\t\t'option_removed': 'Location removed',\n\t\t\t\t\t\t\t\t'min_chars': 'minimum number of characters is',\n\t\t\t\t\t\t\t\t'loading' : 'Loading...'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Location Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Location Search',\n\t\t\t\t\t\t\t\t'description' : 'Type the desired location, followed by province, municipality and region, separated by commas or semicolons. \\nExample: San Casciano, Florence\\nExample: San Casciano, Tuscany\\nExample: San Casciano, Florence, Tuscany'\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'crdSearch': {\n\t\t\t\t\t\t\t'CoordinatesParser': {\n\t\t\t\t\t\t\t\t'label': '',\n\t\t\t\t\t\t\t\t'submit': 'Search',\n\t\t\t\t\t\t\t\t'description': 'Enter desired coordinates',\n\t\t\t\t\t\t\t\t'placeholder_lat': 'Latitude',\n\t\t\t\t\t\t\t\t'placeholder_lon': 'Longitude', \n\t\t\t\t\t\t\t\t'processing': 'Processing...',\n\t\t\t\t\t\t\t\t'coords_not_valid': 'Invalid coordinates',\n\t\t\t\t\t\t\t\t'coords_processed': 'Coordinates processed',\n\t\t\t\t\t\t\t\t'coords_removed': 'Coordinates removed',\n\t\t\t\t\t\t\t\t'error_parsing': 'Error while parsing'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'CssPopup': {\n\t\t\t\t\t\t\t\t'buttonOpen': 'Coordinates Search',\n\t\t\t\t\t\t\t\t'buttonClose': 'close',\n\t\t\t\t\t\t\t\t'title': 'Coordinates Search', \n\t\t\t\t\t\t\t\t'description': 'Enter coordinates to search. Accepted formats are:\\nETRF2000 DD (Decimal degrees)\\nEx. 41.89225468822697 12.49523162841797\\nETRF2000 DMS (Degrees, minutes and seconds)\\nEx. 41\u00b053\\'32.12\"N 12\u00b029\\'42.83\"E'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\t'mapSearch': {\n\t\t\t\t\t\t\t'GeoSelector': {\n\t\t\t\t\t\t\t\t'buttons': {\n\t\t\t\t\t\t\t\t\t'zoomIn': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom In'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'zoomOut': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Zoom Out' \n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'drawRectangle': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Draw Rectangle',\n\t\t\t\t\t\t\t\t\t\t'start' : 'Click and drag to draw an area',\n\t\t\t\t\t\t\t\t\t\t'end': 'Release to draw an area'\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t'removeAll': {\n\t\t\t\t\t\t\t\t\t\t'title': 'Remove All'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\n\t\t\t};\n\t\t\n\t\t}\n\n\t\tconst parametriSelettoreGeografico = new ParametriSelettoreGeografico();\n\t\t\n\t\t<\/script>\n\t\t\t\t\t\n\t\t<!-- LIBRERIE CDN -->\n\t\t<style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/select2\/select2.min.css\";<\/style>\n\t\t<style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/leaflet\/leaflet.draw.css\";<\/style>\n\t\t<style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/leaflet\/leaflet.css\";<\/style>\n\t\t<style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/markercluster\/MarkerCluster.css\";<\/style>\n\t\t<style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/markercluster\/MarkerCluster.Default.css\";<\/style>\n\t\t\t\t\t\n\t\t<style>\n\n\t\t\t.noinput {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_area input[type=\"text\"] {\n\t\t\t\tborder: 0;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tline-height: 0;\n\t\t\t\tcolor: #404040;\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_area textarea {\n\t\t\t\tborder: 0;\n\t    \t\tpadding: 2px 3px;\n\t\t\t}\n\n\t\t\t#geoselector_res_area textarea:focus, #geoselector_res_area textarea:focus-visible {\n\t\t\t\toutline: 0;\n\t\t\t}\n\n\t\t\ttextarea[tabindex=\"-1\"] {\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t#use_area_selection_tools {\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: max-content;\n\t\t\t\tbottom: -35px;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tmargin: auto;\n\t\t\t\tz-index: 1;\n\t\t\t\tbackground: #406ea0;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: white;\n\t\t\t\tborder-radius: 5px;\n\t\t\t\tpadding: 5px 10px;\n\t\t\t}\n\n\t\t\t#use_area_selection_tools:before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tbackground: linear-gradient(136deg, #406ea0 50%, transparent 50%);\n\t\t\t\ttop: -10px;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tmargin: auto;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t\tz-index: 0;\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\t#geoselector_wrap button:focus-visible {\n\t\t\t\toutline: -webkit-focus-ring-color auto 1px;\n\t\t\t}\n\n\n\t\t\t#geoselector_wrap .leaflet-control-attribution {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\n\t\t\t#geoselector_wrap .leaflet-bar {\n\t\t\t\tbox-shadow: none !important;\n\t\t\t}\n\n\t\t\t#geoselector_wrap .leaflet-bar a {\n\t\t\t\ttext-decoration: none !important;\n\t\t\t\tbackground: #5e6c77 !important;\n\t\t\t\tcolor: white;\n\t\t\t\theight: 30px;\n\t\t\t\twidth: 30px;\n\t\t\t\tfont-size: 22px;\n\t\t\t\tline-height: 22px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\n\t\t\t#geoselector_wrap .leaflet-bar a:hover {\n\n\t\t\t\tbackground:rgb(255, 255, 255) !important;\n\t\t\t\tcolor:#5e6c77;\n\t\t\t}\n\n\t\t\t#geoselector_wrap {\n\t\t\t\twidth: 100%;\n\t\t\t\tmin-width: 200px;\n\t\t\t\tdisplay: flex ;\n\t\t\t\tflex-direction: row;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tmargin: 50px auto;\n\t\t\t\t\/* gap: 5px; *\/\n\t\t\t\t\/* height: clamp(500px, 40vw, 1000px); *\/\n\t\t\t\tjustify-content: flex-end;\n\t\t\t\tbackground: #ececec;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\t\n\n\t\t\t#geoselector_map {\n\t\t\t\theight: clamp(700px,40vw,1000px);\n\t\t\t\tmin-width: 320px;\n\t\t\t\tflex: 1 1 30%;\n\t\t\t\tdisplay: block;\n\t\t\t\t\/* min-width: 250px; *\/\n\t\t\t\tz-index: 0;\n\t\t\t\t\/* flex: 50%; *\/\n\t\t\t\tborder-radius: 4px;\n\t\t\t\t\/* overflow: hidden; *\/\n\t\t\t\tbackground: #f5f5f5;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t#geoselector_res {\n\t\t\t\tdisplay: flex;\n\t\t\t\t\/* flex-wrap: nowrap; *\/\n\t\t\t\t\/* width: clamp(200px, 32vw, 400px) !important; *\/\n\t\t\t\theight: clamp(700px,40vw,1000px);\n\t\t\t\t\/* overflow: hidden; *\/\n\t\t\t\t\/* flex: 30%; *\/\n\t\t\t\t\/* border-radius: 4px; *\/\n\t\t\t\t\/* border: 1px solid #d1d5db; *\/\n\t\t\t\tpadding: 10px 10px 10px 10px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\/* align-items: flex-start; *\/\n\t\t\t\tgap: 5px;\n\t\t\t\t\/* position: absolute; *\/\n\t\t\t\tflex-direction: column;\n\t\t\t\t\/* height: inherit; *\/\n\t\t\t\tflex: 1 1;\n\t\t\t\tmin-width: 320px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\t#geoselector_res.backdrop:not(:has(.cssPopup_open)){\n\n\t\t\t\tbackground: #00000014;\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\t-webkit-backdrop-filter: blur(10px);\n\n\t\t\t}\n\n\n\t\t\tdiv#geoselector_res:not(:has(.geoselector_res_el)) {\n\t\t\t\t\/* height: max-content; *\/\n\t\t\t\t\/* border-bottom-left-radius: 4px; *\/\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_num {\n\t\t\t\t\/* border: 1px solid #d1d5db; *\/\n\t\t\t\tpadding: 5px 10px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t\tbackground: #efefef;\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_cats {\n\t\t\t\twidth: 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t#geoselector_res_els {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tmin-height: 100px;\n\t\t\t\toverflow: auto;\n\t\t\t\tdisplay: flex;\n\t\t\t\t\/* padding: 10px; *\/\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\/* gap: 20px; *\/\n\t\t\t\tbackground: #f5f5f5;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\t\/*border: 1px solid #d0d0d0;*\/\n\t\t\t\tflex-direction: column;\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t\tmargin-top: 0px;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.geoselector_res_el.collection {\n\t\t\t\tbackground: linear-gradient(to right, #8a8f9e 3px, transparent 3px) #d0dceb;\n\t\t\t}\n\n\t\t\t#geoselector_res_els:not(:has(.geoselector_res_el)):after\n\t\t\t,#geoselector_res_els.processing:after {\n\t\t\t\tcontent: attr(data-msg);\n\t\t\t\tdisplay: flex;position: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tflex-direction: row;\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: #5c5c5c;\n\t\t\t\tbackground: #f5f5f5c2;\n\t\t\t\tpadding: 20px 10px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\ttransform: translateY(var(--scroll-offset, 0px));\n\t\t\t\tbackdrop-filter: blur(5px);\n\t\t\t\t-webkit-backdrop-filter: blur(5px);\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_els.processing {\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t#geoselector_res_els.warning:after {\n\t\t\t\tcolor: #c38c57;\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t#geoselector_res:not(.processing) #geoselector_res_els.error:after {\n\t\t\t\tcontent: \"\ud83d\udfae \" attr(data-msg) !important;\n\t\t\t\tcolor: #ff3100;\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\n\t\t\t#geoselector_wrap:has(.processing) select,#geoselector_wrap:has(.processing) button,\n\t\t\t#geoselector_wrap:has(.processing) .leaflet-control a {\n\t\t\t\tpointer-events: none;\n\t\t\t\topacity: 0.7;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.geoselector_res_el {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tpadding: 7px 7px;\n\t\t\t\talign-items: stretch;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: 3px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.geoselector_res_el:hover\n\t\t\t,.geoselector_res_el:focus-visible {\n\t\t\t\t\/* outline: 1px solid #333333; *\/\n\t\t\t\t\/* background: #f7f7f7; *\/\n\t\t\t}\n\n\t\t\t.geoselector_res_img {\n\t\t\t\tflex: 1 0 100%;\n\t\t\t\tmax-width: 80px;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\taspect-ratio: 1 \/ 1.3;\n\t\t\t\tbackground-position: center !important;\n\t\t\t\tbackground-size: cover !important;\n\t\t\t\tbackground-repeat: no-repeat !important;\n\t\t\t\tborder: 0.7px solid #dcdcdc;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t.geoselector_res_desc {\n\t\t\t\t\/* width: 35%; *\/\n\t\t\t\t\/* min-width: 100px; *\/\n\t\t\t\t\/* margin-right: auto; *\/\n\t\t\t\tflex: 1 0 100%;\n\t\t\t\tfont-weight: bold;\n\t\t\t\t\/* line-height: calc(clamp(13px,1vw,30px) + 3px); *\/\n\t\t\t\t\/* font-size: clamp(13px,1vw,30px); *\/\n\t\t\t}\n\n\n\n\t\t\tdiv#geoselector_src_sug {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc(100% + 3px);\n\t\t\t\tleft:0;\n\t\t\t\tdisplay: none;\n\t\t\t\tz-index: 37;\n\t\t\t\tbackground: white;\n\t\t\t\tborder-width: 0px 1px 1px 1px;\n\t\t\t\tborder-color: #d1d5db;\n\t\t\t\tborder-style: solid;\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-bottom-left-radius: 4px;\n\t\t\t\tborder-bottom-right-radius: 4px;\n\t\t\t}\n\n\n\t\t\t.geoselector_res_cart_nobuy:after {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: -1px;\n\t\t\t\tleft: 1px;\n\t\t\t\twidth: calc(100% * 1.37);\n\t\t\t\theight: 2px;\n\t\t\t\tbackground: #c96565;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t\ttransform-origin: top left;\n\t\t\t}\n\n\t\t\t.geoselector_res_cart_nobuy {\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.geoselector_res_btns_row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tjustify-content: flex-start;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t\n\n\t\t\t.geoselector_res_wrp input {\n\t\t\t\tmargin: 0;\n\t\t\t\tflex: 1 1 70%;\n\t\t\t}\n\n\t\t\t\n\t\t\t.geoselector_res_wrp {\n\t\t\t\twidth: 100%;\n\t\t\t\tcursor: pointer;\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: flex-start;\n\t\t\t\tflex-direction: row;\n    \t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: stretch;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\t\t\t\n\t\t\t.geoselector_res_wrp label\n\t\t\t, .geoselector_res_wrp small {\n\t\t\t\tflex: 1 0 100%;\n\t\t\t}\n\n\n\t\t\t#geoselector_wrap button.active_btn,\n\t\t\t#geoselector_wrap button:hover {\n\t\t\t\tbackground: #5e6c77;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\t#geoselector_wrap button {\n\t\t\t\tbackground: white;\n\t\t\t\tcolor: #0160be;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t\tborder: 0;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 2px 5px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tflex : 1 1 48%;\n\t\t\t}\n\n\n\t\t\t#geoselector_wrap .cssPopup_open button {\n\t\t\t\tflex: 0;\n\t\t\t\tmargin : 0;\n\t\t\t\tborder: 1px solid #666;\n\t\t\t\tborder-radius: initial;\n\t\t\t}\n\n\t\t\t\/* form in popup *\/\n\t\t\tdiv#geoselector_src.cssPopup_open,\n\t\t\tdiv#geoselector_crd.cssPopup_open {\n\t\t\t\tgap: 10px;\n\t\t\t\twidth: 20vw !important;\n\t\t\t}\n\n\t\t\t.cssPopup_closed {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.geoselector_res_img_popup {\n\t\t\t\twidth: clamp(45vw, 45vw, 1500px);\n\t\t\t\tbackground-size: contain !important;\n\t\t\t\tbackground-position : center !important;\n\t\t\t\tbackground-repeat: no-repeat !important;\n\t\t\t\tmax-width: none;\n\t\t\t\tborder: 0;\n\t\t\t\theight: auto;\n    \t\t\taspect-ratio: 1 !important;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\tsmall[data-alert-level=\"error\"] {\n\t\t\t\tcolor: red !important;\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\tsmall[data-alert-level=\"warning\"] {\n\t\t\t\tcolor: #b06a3b !important;\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\n\t\t\tsmall[data-alert-level=\"error\"]:before {\n\t\t\t\tcontent: \"\ud83d\udfae \";\n\t\t\t\tfont-weight: 100;\n\t\t\t\tline-height: inherit;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\tdiv:has(small[data-alert-level=\"success\"]) .select2-selection__placeholder {\n\t\t\t\tfont-weight: 500;\n\t\t\t\tcolor: black !important;\n\t\t\t}\n\n\n\t\t\t#geoselector_crd form,#geoselector_src form {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 5px;\n\t\t\t}\n\n\t\t\t.geoselector_res_cnt {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: 5px;\n\t\t\t\tflex: 1 1;\n\t\t\t\twidth: 100%;\n\t\t\t\tbackground: #ffffff;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 3px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tborder: 1px solid #e1e1e1;\n\t\t\t}\n\n\t\t\t.geoselector_res_data,.geoselector_res_btns {\n\t\t\t\t\/* width: 49%; *\/\n\t\t\t\t\/* min-width: min-content; *\/\n\t\t\t\t\/* max-width: max-content; *\/\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-start;\n\t\t\t\t\/* gap: 3px; *\/\n\t\t\t    justify-content: flex-start;\n\t\t\t}\n\n\t\t\t#geoselector_wrap .geoselector_res_btn {\n\t\t\t\tborder: 1px solid #dcdcdc;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: clamp(7px,1vw,10px);\n\t\t\t\twidth: 100%;\n\t\t\t\tfont-size: inherit;\n\t\t\t\tfont-weight: inherit;\n\t\t\t\tmargin: 0 !important;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: #ffffff;\n\t\t\t}\n\n\t\t\t#geoselector_wrap .geoselector_res_btn .value {\n\t\t\t\twhite-space: normal;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 13px !important;\n\t\t\t}\n\n\t\t\t.geoselector_res_data {\n\t\t\t\tflex: 0 1 80%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t\t.geoselector_res_cnt > * {\n\t\t\t\tline-height: calc(clamp(13px, 0.9vw, 17px) + 3px);\n\t\t\t\tfont-size: clamp(13px, 0.9vw, 17px);\n\t\t\t}\n\n\n\n\t\t\t.geoselector_res_btns {\n\t\t\t\tgap: 3px;\n\t\t\t\tflex: 1 0 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: flex-start;\n\t\t\t}\n\n\n\t\t\t#geoselector_res button.processing {\n\t\t\t\tpointer-events: none !important;\n\t\t\t\tcursor: progress;\n\t\t\t\t\/* opacity: 0.8; *\/\n\t\t\t\tbackground: #fffdeb;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t#geoselector_res button.processing:after {\n\t\t\t\tcontent: \"\u231b\";\n\t\t\t\t\/*animation: gira 2s linear infinite;*\/\n\t\t\t\tanimation: blink 500ms ease-in-out infinite alternate;\n\t\t\t\ttransform-origin: center;\n\t\t\t\tdisplay: flex;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: -9px;\n\t\t\t\tright: -5px;\n\t\t\t\twidth: 2px;\n\t\t\t\theight: 2px;\n\t\t\t\tline-height: 0;\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tbackground: #fcfbee;\n\t\t\t\tpadding: 8px;\n\t\t\t\tbox-sizing: content-box;\n\t\t\t\tcolor: black;\n\t\t\t\tborder: 1px solid #b7b7b7;\n\t\t\t\t\tborder-radius: 50px;\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-content: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t@keyframes gira {\n\t\t\t\t0% { transform: rotate(0deg); }\n\t\t\t\t100% { transform: rotate(360deg); }\n\t\t\t}\n\n\t\t\t@keyframes blink {\n\t\t\t\t0%, 20% { opacity: 1; }\n\t\t\t\t20%, 40% { opacity: 0.8; }\n\t\t\t\t40%, 70% { opacity: 0.6; }\n\t\t\t\t70%, 80% { opacity: 0.4; }\n\t\t\t\t80%, 100% {  opacity: 0.2; }\n\t\t\t}\n\n\t\t\t#geoselector_res button.processed {\n\t\t\t\tpointer-events: none !important;\n\t\t\t\tcursor: progress;\n\t\t\t\t\/* opacity: 0.8; *\/\n\t\t\t\tbackground: #ebffee;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t\n\n\t\t\t#geoselector_res button.processed:after {\n\t\t\t\tcontent: \"\u2713\";\n\t\t\t\tdisplay: flex;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: -9px;\n\t\t\t\tright: -5px;\n\t\t\t\twidth: 2px;\n\t\t\t\theight: 2px;\n\t\t\t\tline-height: 0;\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tbackground: #eefcf0;\n\t\t\t\tpadding: 8px;\n\t\t\t\tbox-sizing: content-box;\n\t\t\t\tcolor: black;\n\t\t\t\tborder: 1px solid #b7b7b7;\n\t\t\t\tborder-radius: 50px;\n\t\t\t\t\/* animation: gira 2s linear infinite; *\/\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-content: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t#geoselector_res button.not_processed {\n\t\t\t\tpointer-events: none !important;\n\t\t\t\tcursor: progress;\n\t\t\t\t\/* opacity: 0.8; *\/\n\t\t\t\tbackground: #ffebeb;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\n\t\t\t#geoselector_wrap button[disabled] {\n\t\t\t\topacity: 0.5;\n\t\t\t}\n\n\n\t\t\t#geoselector_res_attrs:not(:has(select))\n\t\t\t,#geoselector_res_cats:not(:has(select))\n\t\t\t,#geoselector_res_addons:not(:has(select)) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t#geoselector_res select {\n    \t\t\tborder: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 2px 3px;\n\t\t\t}\n\n\t\t\t#geoselector_res label {\n\t\t\t\tcolor: #5e5e5e;\n\t\t\t\tfont-weight: normal;\n\t\t\t\ttext-indent: 2px;\n\t\t\t\tmargin-bottom: 3px;\n\t\t\t}\n\n\t\t\t.geoselector_res_wrp .select2 {\n\t\t\t\twidth: 100% !important;\n\t\t\t}\n\n\n\n\t\t\t.geoselector_res_wrp .select2-selection {\n\t\t\t\theight: auto !important;\n\t\t\t}\n\n\t\t\tdiv#geoselector_res_tools,#geoselector_res_cats, #geoselector_res_addons, #geoselector_res_attrs, #geoselector_res_area {\n\t\t\t\tposition: relative;\n\t\t\t\t\/*border: 1px solid #dadada;*\/\n\t\t\t\tbackground: #f5f5f5;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 6px;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 3px;\n\t\t\t}\n\n\t\t\t\/* Scrollbar trasparente *\/\n\t\t\t#geoselector_res_els::-webkit-scrollbar {\n\t\t\t\twidth: 8px;\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t\/* Thumb (parte scorrevole) *\/\n\t\t\t#geoselector_res_els::-webkit-scrollbar-thumb {\n\t\t\t\tbackground-color: rgb(196 196 196); \/* oppure transparent *\/\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\t\/* Rimuove le freccette *\/\n\t\t\t#geoselector_res_els::-webkit-scrollbar-button {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\n\n\t\t\t\/*firefox scrollbar *\/\n\n\t\t\t#geoselector_res_els {\n\t\t\t\tscrollbar-width: auto;\n\t\t\t\tscrollbar-color: rgb(0 83 173) #e0000000;\n\t\t\t}\n\n\t\t\t.highlighted-marker {\n\t\t\t\tfilter: brightness(1.7) hue-rotate(-20deg);\n\t\t\t\tz-index: 999 !important;\n\t\t\t}\n\n\n\t\t\t\/* map spinner *\/\n\t\t\t#geoselector_wrap:has(.processing) #geoselector_map.spinner-enabled:before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 5px;\n\t\t\t\tright: 5px;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\tbackground: #ffffffe0;\n\t\t\t\tz-index: 5;\n\t\t\t\tpointer-events: none;\n\t\t\t\tborder-radius: 11px;\n\t\t\t}\n\n\t\t\t#geoselector_wrap:has(.processing) #geoselector_map.spinner-enabled:after {\n\t\t\t\tcontent: \"\";\n\t\t\t\tgira 2s linear animation-iteration-count: infinite;\n\t\t\t\tdisplay: block;\n\t\t\t\tanimation: gira 2s linear infinite;\n\t\t\t\twidth: 50px;\n\t\t\t\theight: 50px;\n\t\t\t\tborder-left: 5px solid black;\n\t\t\t\tborder-right: 5px solid black;\n\t\t\t\tborder-top: 5px solid transparent;\n\t\t\t\tborder-bottom: 5px solid transparent;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 30px;\n\t\t\t\t\/* bottom: 0; *\/\n\t\t\t\t\/* left: 0; *\/\n\t\t\t\tright: 30px;\n\t\t\t\tmargin: auto;\n\t\t\t\tz-index: 6;\n\t\t\t\tborder-radius: 100%;\n\t\t\t}\n\n\t\t\n\n\t\t\t\/*select senza opzioni non in stato processing*\/\n\t\t\t\/*#geoselector_res:not(:has(.processing)) select:has(option[value=\"\"][disabled]):has(option[value=\"\"][disabled]:nth-child(2)):not(:has(option:nth-child(3)))*\/\n\t\t\t#geoselector_res:not(:has(.processing)) select:has(option.no-result)\n\t\t\t{\n\t\t\t\tbackground:#ffdbc2;\n\t\t\t}\n\n\t\t\t.geoselector_res_img_popup_low_quality_note {\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\n\t\t\t.progress-bar {\n\t\t\t\twidth: 100%;\n\t\t\t\tbackground-color: #f4f4f4;\n\t\t\t\tborder-radius: 3px;\n\t\t\t\tbox-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);\n\t\t\t\tmargin: 3px 0;\n\t\t\t}\n\t\t\t\n\t\t\t.progress-bar-fill {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 7px;\n    \t\t\tbackground-color: #9ed498;\n\t\t\t\tborder-radius: 3px;\n\t\t\t\ttransition: width 500ms ease-in-out;\n\t\t\t\ttransition: width 500ms ease-in-out;\n\t\t\t}\n\n\n\n\t\t\t\/*CSS_POPUP*\/\n\n\t\t\thtml:has(.cssPopup_open), body:has(.cssPopup_open) {\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t\t\n\t\t\t.cssPopup_popup.cssPopup_open {\n\t\t\t\tposition: fixed !important;\n\t\t\t\twidth: max-content !important;\n\t\t\t\theight: max-content !important;\n\t\t\t\tmin-width: 300px;\n\t\t\t\tmax-width: clamp(50vw, 50vw, 1500px);\n\t\t\t\tmin-height: 250px;\n\t\t\t\tmax-height: clamp(80svh, 80svh, 1200px);\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tmargin: auto;\n\t\t\t\tbackground: #ffffff !important;\n\t\t\t\toverflow: auto;\n\t\t\t\tz-index: 6 !important;\n\t\t\t\tpadding: 0px 20px 20px 20px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tborder-radius: 5px;\n\t\t\t\tflex-direction: column;\n    \t\t\tflex-wrap: nowrap;\n\t\t\t}\n\n\t\t\t.cssPopup_popup.cssPopup_open > * {\n\t\t\t\tflex: 0 0 auto !important;\n\t\t\t}\n\n\t\t\t.cssPopup_popup.cssPopup_open .cssPopup_description {\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\n\t\t\t.cssPopup_popup.cssPopup_open {\n\t\t\t\tdisplay: flex !important;\n\t\t\t}\n\n\t\t\t.cssPopup_popup.cssPopup_closed {\n\t\t\t\tdisplay: none !important;\n\t\t\t}\n\n\n\n\t\t\t.cssPopup_overlay.cssPopup_open {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: #000000ab;\n\t\t\t\tz-index: 5;\n\t\t\t\tbackdrop-filter: blur(4px);\n\t\t\t}\n\n\t\t\t.cssPopup_toolbar {\n\t\t\t\tpadding: 10px 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 50px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tposition: sticky;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tdisplay: flex ;\n\t\t\t\tflex-direction: row;\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t\talign-items: center;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tborder-bottom: 1px solid #d9d9d9;\n\t\t\t\tmargin-bottom: 5px;\n\t\t\t\tbackground: #ffffff;\n\t\t\t}\n\n\t\t\t.cssPopup_open .cssPopup_btn:not(.cssPopup_toolbar .cssPopup_btn) {\n\t\t\t\tflex: 0 0 min-content;\n\t\t\t}\n\n\t\t\t.cssPopup_toolbar .cssPopup_btn,.cssPopup_toolbar .cssPopup_btn:hover {\n\t\t\t\tbackground: #5e6c77 !important;\n\t\t\t\tcolor: #ffffff !important;\n\t\t\t\tborder: 0 !important;\n\t\t\t\tborder-radius: 6px !important;\n\t\t\t\tpadding: 5px 5px !important;\n\t\t\t\tbox-sizing: border-box !important;\n\t\t\t}\n\n\t\t\t.cssPopup_open .cssPopup_toolbar button {\n\t\t\t\twhite-space: pre;\n\t\t\t\tmax-width: 40%;\n\t\t\t\tmax-height: 100%;\n\t\t\t\tline-height: 100%;\n\t\t\t}\n\n\t\t\t.cssPopup_open .cssPopup_toolbar .cssPopup_title {\n\t\t\t\tmax-width: 50%;\n\t\t\t\tmax-height: 100%;\n\t\t\t\toverflow: auto;\n\t\t\t\tline-break: anywhere;\n\t\t\t}\n\n\t\t\t\/* fix z-index header *\/\n\t\t\tbody:has(.cssPopup_open) #sticky-header {\n\t\t\t\tz-index: 4 !important;\n\t\t\t}\n\t\n\n\t\t<\/style>\n\n\t\t\n\t\t\n\t\t<!-- ORA CARICATI IN COMUNE -->\n        <!-- <script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/jquery\/jquery-3.7.1.min.js\"><\/script> -->\n\t\t<!-- <script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/select2\/select2.min.js\"><\/script> -->\n        <!-- <style> @import \"\/wp-content\/themes\/hello-theme-child-master\/assets\/css\/select2\/select2.min.css\";<\/style> -->\n\n\t\t<script>\n\n        class AutoCompleteSelect2{\n\n            constructor(wrapperId='autoCompleteSelect2',params = {},texts = {}){\n\t\t\t\t\n\t\t\t\n\t\t\t\tthis.timeoutMsgResetMS = 4000;\n\t\t\t\tthis.timeoutMsgReset = null;\n\n                this.uid = 'autoCompleteSelect2_' + Date.now();\n                this.wrapperId = wrapperId;\n                this.wrapper = document.getElementById(this.wrapperId);\n                if (!this.wrapper) throw new Error(`autoCompleteSelect2.constructor: elemento non trovato: ${this.wrapperId}`);\n                this.wrapper.innerHTML = ''; \/\/svuota wrapper\n                this.form = document.createElement('form');\n                this.form.addEventListener(\"submit\", function(e) {  e.preventDefault(); });\n                this.selected = false;\n                this.selectedOptionValue = undefined;\n\t\t\t\tthis.select2 = undefined;\n\n                this.params = {\n\n                    'minCharsInput' : params.minCharsInput ?? 3,\n                    'isRequired' : params.isRequired ?? false,\n                    'submitOnChange' : params.submitOnChange ?? false,\n                    'formWrap' : params.formWrap ?? false,\n                    'logEnabled' : params.logEnabled ?? true,\n\n                };\n\n                this.texts = {\n                    'label' : texts.label ?? 'Ricerca Localit\u00e0'\n                    ,'description' : texts.description ?? 'Digita la localit\u00e0 desiderata'\n                    ,'submit' :  texts.submit ?? 'Applica'\n                    ,'placeholder' : texts.placeholder ?? 'Esempio: Roma'\n                    ,'searching' : texts.searching ?? 'Ricerca in corso...'\n                    ,'select_option' : texts.select_option ?? 'Seleziona la localit\u00e0 dall\\'elenco'\n                    ,'no_options_found' : texts.no_options_found ?? 'Nessuna localit\u00e0 trovata'\n                    ,'no_option_selected' : texts.no_option_selected ?? 'Nessuna localit\u00e0 selezionata'\n                    ,'option_selected' : texts.option_selected ?? 'Localit\u00e0 selezionata'\n                    ,'option_removed' : texts.option_removed ?? 'Localit\u00e0 rimossa'\n                    ,'min_chars' : (texts.min_chars ?? 'il numero minimo di caratteri \u00e8')+' '+this.params.minCharsInput\n\t\t\t\t\t,'loading' : texts.loading ?? 'Loading...'\n                }; \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n                \/\/crea label\n                this.label = document.createElement('label');\n                this.label.for = this.uid + '_input';\n                this.label.id = this.uid + '_label';\n                this.label.classList.add('autoCompleteSelect2_label');\n                this.label.innerText = this.texts.label;\n\n                \/\/crea description (status)\n                this.description = document.createElement('small');\n                this.description.id = this.uid + '_description';\n                this.description.classList.add('autoCompleteSelect2_description');\n                this.description.innerText = this.texts.description;\n                this.description.setAttribute(\"role\",\"status\" );\n                this.description.setAttribute(\"aria-live\",\"polite\");\n               \n                \/\/crea input\n                this.input = document.createElement('input');\n                this.input.id = this.uid + '_input';\n\t\t\t\tthis.input.setAttribute('data-placeholder',this.texts.placeholder);\n\t\t\t\tthis.input.placeholder = this.texts.placeholder;\n\t\t\t\t\n\n                \/\/crea submit\n                this.submit = document.createElement('button'); \n                this.submit.type = 'button';\n                this.submit.innerText = this.texts.submit;\n                this.submit.classList.add('autoCompleteSelect2_submit');\n\n                \/\/aggiungi nodi a wrapper\n                if(this.params.formWrap){\n\n                    if(this.texts.label.length > 0){ this.form.appendChild(this.label); }\n                    if(this.texts.description.length > 0){this.form.appendChild(this.description);}\n                    this.form.appendChild(this.input);\n                    if(this.texts.submit.length > 0){this.form.appendChild(this.submit);}\n                    this.wrapper.appendChild(this.form);\n\n                }\n\n\t\t\t\t\/\/aggiungi nodi a dom\n                else{\n\n                    if(this.texts.label.length > 0){ this.wrapper.appendChild(this.label); }\n                    if(this.texts.description.length > 0){this.wrapper.appendChild(this.description);}\n                    this.wrapper.appendChild(this.input);\n                    if(this.texts.submit.length > 0){this.wrapper.appendChild(this.submit);}\n\n                }\n\t\t\t\t \n                \/\/funzione alla selezione di una option\n                this.onOptionSelected = () => {\n\n                    if(this.params.logEnabled){ console.log('autoCompleteSelect2.onOptionSelected: selezionata opzione: '+this.selectedOptionValue); }\n\n                }\n\n                \/\/listener submit\n                this.submit.addEventListener('click',()=>{\n\n                    \/\/verifica che scelta sia in elenco. cancella valore\n                    if(this.input.value.length < 1){\n                        this.reset();\n                        this.setMsg(this.texts['no_option_selected'],true,'warning');\n                        return;\n                    }\n\n                    this.onOptionSelected();\n\n                });\n\t\t\t\t\n\t\t\t\t\/*\n\n                \/\/listener inserimento\n                this.onInputEnd = new onInputEnd(this.input.id,{\n                    typingTimeOut : this.params.typingTimeOut, \/\/ tempo timeout input utente\n                    logEnabled : this.params.logEnabled \/\/abilita log\n                });\n\t\t\t\t\n                \/\/funzione eseguita a inizio input utente\n                this.onInputEnd.setPreFunction(()=>{\n                    if((this.input.value.length) >= this.params.minCharsInput){ this.setMsg(this.texts['searching']); }\n                    else{ this.setMsg(this.texts['min_chars']); }\n                });\n\t\t\t\t\n\t\t\t\t*\/\n                \n                \/\/inizializzazione select2\n                this.select2 = $('#'+this.input.id).select2({\n\t\t\t\t\t\n                    ajax: {\n                        transport: async (params, success, failure) => {\n                        try {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\n                            \/\/ Recupera il termine di ricerca (viene usato da setOptions)\n                            const searchTerm = (params.data.term || '').toLowerCase();\n                            this.input.value = searchTerm;\n\n                            const results = await this.setOptions();\n                                                        \n                            success(results);\n  \n                        } catch (error) {\n                            console.error(\"Errore durante la ricerca:\", error);\n                            failure(error);\n                        }\n                        \n                        \/\/ Restituisci un oggetto con metodo abort\n                        return { abort: function() {} };\n                        }\n                    },\n                    \/\/placeholder: this.texts.placeholder, \/\/ottenuto da attributo data-placeholder input\n                    minimumInputLength: this.params.minCharsInput,\n                    language: {\n\t\t\t\t\t\terrorLoading: () => { return this.texts['no_options_found']; },\n\t\t\t\t\t\tinputTooShort: () => {  return this.texts['min_chars'];  },\n\t\t\t\t\t\tloadingMore: () => {  return this.texts['searching'];  },\n\t\t\t\t\t\tnoResults: () => {  return this.texts['no_results_found'];  },\n\t\t\t\t\t\tsearching: () => { return this.texts['searching']; } \n                \t},\n\t\t\t\t\t\n\t\t\t\t\tdropdownPosition: 'below'\n                });\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\/\/VERIFICA PRESENZA E RIMUOVI BLUR TABINDEX DI USERWAY \n\t\t\t\t\/\/remediation_1764061016441.js\n\t\t\t\tif(1==1){\n\t\t\t\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\t\t\t  var uwCerObserverAttempts = 0;\n\t\t\t\t\t  var uwCerObserverInterval = setInterval(() => {\n\t\t\t\t\t\tuwCerObserverAttempts++;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t  var uwCerObserverLib = UserWayWidgetApp && UserWayWidgetApp.getLib && UserWayWidgetApp.getLib('cer_observer');\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t  var uwCerObserverLib = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (uwCerObserverLib && uwCerObserverLib.tick) {\n\t\t\t\t\t\t  uwCerObserverLib.tick = () => { return; };\n\t\t\t\t\t\t  if(this.params.logEnabled){ console.log('[LOG] cer_observer userway disabilitato, causava blur su select2'); }\n\t\t\t\t\t\t  clearInterval(uwCerObserverInterval);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (uwCerObserverAttempts >= 10) {\n\t\t\t\t\t\t  clearInterval(uwCerObserverInterval);\n\t\t\t\t\t\t}\n\t\t\t\t\t  }, 500);\n\t\t\t\t\t});\n\t\t\t\t}\n\n                \/\/imposta attributi ARIA\n                const select2Container = $('#'+this.input.id).next('.select2-container');\n                if (select2Container.length) {\n                    \/\/ Aggiungi gli attributi ARIA al container\n                    select2Container.attr('aria-labelledby', this.label.id);\n                    select2Container.attr('aria-describedby', this.description.id);\n                }\n\n                \/\/listener selezione option\n                $('#'+this.input.id).on('select2:select',(event)=>{\n\n                    \/\/ottieni valore opzione\n                    this.selectedOptionValue = event?.params?.data?.value?? null;\n                    this.selectedOptionText = event?.params?.data?.text?? null;\n\n                    \/\/verifica che scelta sia in elenco. cancella valore\n                    if(this.selectedOptionValue == null){\n                        this.reset();\n                        this.setMsg(this.texts['no_option_selected'],true,'warning');\n                        return;\n                    }\n\n                    this.input.blur();\n\n                    this.selected = true;\n                    this.setMsg(this.texts['option_selected'] + ': ' + this.selectedOptionText,false,'success');\n\n                    \/\/imposta placehoder con opzione selezionata\n                    $('#'+this.input.id).data('select2').$container.find('.select2-selection__placeholder').text(this.selectedOptionText);\n\t\t\t\n\t\t\t\t\t\/\/rimuovi datalist\n                \t\/\/this.input.setAttribute('list',null);\n\t\t\t\t\t\t\t\n                    \/\/effettua submit a selezione\n                    if(this.params.submitOnChange){ this.submit.dispatchEvent(new MouseEvent('click'));  }\n\n\n                });\n\n\t\t\t\t\n            }\n\t\t\t\n\t\t\tget placeholder() { return this.wrapper.querySelector('.select2-selection__placeholder') ?? this.input.placeholder; };\n\n            \/\/ottenimento options\n\t\t\tasync fetchOptions() {\n\n\t\t\t\tvar JSONData = `[\n\n\t\t\t\t\t{\"text\":\"Roma\",\"value\":\"Roma \u00e8 l'opzione 0\"}\n\t\t\t\t\t,{\"text\":\"Milano\",\"value\":\"Milano \u00e8 l'opzione 1\"}\n\t\t\t\t\t,{\"text\":\"Firenze\",\"value\":\"Firenze \u00e8 l'opzione 2\"}\n\t\t\t\t\t,{\"text\":\"Napoli\",\"value\":\"Napoli \u00e8 l'opzione 3\"}\n\n\t\t\t\t]`;\n\n\t\t\t\tawait new Promise(r => setTimeout(r, 1500)); \/\/simulazione attesa chiamata\n\n\t\t\t\treturn JSON.parse(JSONData);\n\n\t\t\t}\n\n            \/\/aggiunta delle options\n            async setOptions(){\n\n                if(this.params.logEnabled){ console.log('autoCompleteSelect2.setOptions: popolamento options'); }\n\n                this.options = await this.fetchOptions();\n\n                if(this.options.length < 1){  this.setMsg(this.texts['no_options_found'],true,'error'); }\n                else{  this.setMsg(this.texts['select_option']); }\n\n                return {\n                    results: this.options.map((option,index) => ({\n                        id:  index,\n                        text: option.text,\n                        value: option.value\n                    }))\n                };\n        \n            }\n\t\n\t\t\t\/\/imposta messaggio di stato\/descrizione\n            setMsg(msg,autoReset = false,alertLevel='info'){\n\n\t\t\t\t\talertLevel = ['info','warning','error','success'].indexOf(alertLevel) >= 0 ? alertLevel : 'info';\n                    this.description.innerText = msg;\n\t\t\t\t\tthis.description.dataset.alertLevel = alertLevel;\n\t\t\t\t\tclearTimeout(this.timeoutMsgReset);\n\t\t\t\t\tif(autoReset){ this.timeoutMsgReset = setTimeout(()=>{ \n\t\t\t\t\t\tthis.description.innerText = this.texts.description;\n\t\t\t\t\t\tthis.description.dataset.alertLevel = 'info';\n\t\t\t\t\t},this.timeoutMsgResetMS ); }\n\n                }\n\t\t\t\t\n\t\t\t\/\/variazione funzione alla selezione di una option\n            setOnOptionSelected(fn = ()=>{}){ this.onOptionSelected = fn;   }\n\t\t\t\n\t\t\t\/\/variazione funzione di ottenimento options\n\t\t\tsetFetchOptions(fn = async ()=>{return [];}){ this.fetchOptions = fn; }\n\t\t\t\n\t\t\t\/\/aggiornamento placeholder\n\t\t\tsetPlaceholder(text = undefined){\n\t\t\t\t\n\t\t\t\tthis.placeholder.innerText = text == undefined ? (this.texts.placeholder ?? '') : text;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\/\/reset a stato iniziale\n            reset(){\n\n                \/\/reimposta messaggio iniziale\n                this.setMsg(this.texts['description']);\n\t\t\t\t\n                \/\/rimuovi valore input\n                this.input.value = '';\n\n                \/\/imposta come non selezionato\n                this.selected = false;\n\n                \/\/reimposta placeholder\n                $('#'+this.input.id).data('select2').$container.find('.select2-selection__placeholder').text(this.texts.placeholder);\n\n            }\n\n\n        }\n\t\t\t\t\n        <\/script>\n\n        \t\t\t\t\t\n\t\t\n\n\t\t<script>\n\n\n\n\t\t\tclass CoordinatesParser{\n\n\n\t\t\t\tconstructor(wrapperId,params={},texts={}){\n\t\t\t\t\t\n\t\t\t\t\tthis.timeoutMsgResetMS = 4000;\n\t\t\t\t\tthis.timeoutMsgReset = null;\n\t\t\t\t\t\t\n\n                    this.uid = 'coordinatesParser_' + Date.now();\n\t\t\t\t\tthis.wrapperId = wrapperId;\n\t\t\t\t\tthis.wrapper = document.getElementById(this.wrapperId);\n                    if (!this.wrapper) throw new Error('autoCompleteDatalist: Wrapper not found. ['+this.wrapperId+']');\n                    this.wrapper.innerHTML = ''; \/\/svuota wrapper\n                    this.form = document.createElement('form');\n                    this.form.addEventListener(\"submit\", function(e) {  e.preventDefault(); });\n                    this.parsedCoords = null;\n\n                    this.params = {\n\n                        'logEnabled' : params.logEnabled ?? true,\n                        'keepValue' : params.keepValue ?? true,\n                        'formWrap' : params.formWrap ?? false,\n\t\t\t\t\t\t'polygonSize' : params.polygonSize ?? 0.0005,\n\n                    };\n\n                    this.texts = {\n\n                        'label' : texts.label ?? 'Ricerca Coordinate'\n                        ,'submit' :  texts.submit ?? 'Cerca'\n                        ,'description' : texts.description ?? 'Digita le coordinate desiderate'\n                        ,'placeholder_lat' : texts.placeholder_lat ?? 'Latitudine'\n                        ,'placeholder_lon' : texts.placeholder_lon ?? 'Longitudine'\n                        ,'processing' : texts.searching ?? 'Elaborazione in corso...'\n                        ,'coords_not_valid' : texts.no_options_found ?? 'Coordinate non valide'\n                        ,'coords_processed' : texts.option_selected ?? 'Coordinate elaborate'\n                        ,'coords_removed' : texts.option_removed ?? 'Coordinate rimosse'\n\t\t\t\t\t    ,'error_parsing' : texts.error_parsing ?? 'Errore durante il parsing'\n                    \n                    };\n\n                    \/\/crea label\n                    this.label = document.createElement('label');\n                    this.label.for = this.uid + '_input';\n                    this.label.id = this.uid + '_label';\n                    this.label.classList.add('coordinatesParser_label');\n                    this.label.innerText = this.texts.label;\n\n                    \/\/crea description (status)\n                    this.description = document.createElement('small');\n                    this.description.id = this.uid + '_description';\n                    this.description.classList.add('coordinatesParser_description');\n                    this.description.innerText = this.texts.description;\n                    this.description.setAttribute(\"role\",\"status\" );\n                    this.description.setAttribute(\"aria-live\",\"polite\");\n                \n                    \/\/crea input latitudine\n                    this.inputLat = document.createElement('input');\n                    this.inputLat.id = this.uid + '_input_lat';\n                    this.inputLat.classList.add('coordinatesParser_input');\n                    this.inputLat.setAttribute('autocomplete','off');\n                    this.inputLat.type = 'text';\n                    this.inputLat.minLength = 5;\n                    this.inputLat.maxLength = 20;\n                    this.inputLat.placeholder = this.texts.placeholder_lat;\n                    this.inputLat.setAttribute(\"aria-labelledby\", this.label.id);\n                    this.inputLat.setAttribute(\"aria-describedby\", this.description.id);\n                    this.inputLat.setAttribute(\"required\", true);\n\n                    this.inputLon = document.createElement('input');\n                    this.inputLon.id = this.uid + '_input_lon';\n                    this.inputLon.classList.add('coordinatesParser_input');\n                    this.inputLon.setAttribute('autocomplete','off');\n                    this.inputLon.type = 'text';\n                    this.inputLon.minLength = 5;\n                    this.inputLon.maxLength = 20;\n                    this.inputLon.placeholder = this.texts.placeholder_lon;\n                    this.inputLon.setAttribute(\"aria-labelledby\", this.label.id);\n                    this.inputLon.setAttribute(\"aria-describedby\", this.description.id);\n                    this.inputLon.setAttribute(\"required\", true);\n\n                    \/\/crea submit\n                    this.submit = document.createElement('button'); \n                    this.submit.type = 'submit';\n                    this.submit.innerText = this.texts.submit;\n                    this.submit.classList.add('coordinatesParser_submit');\n\n\n                    if(this.params.formWrap){\n                        if(this.texts.label.length > 0){ this.form.appendChild(this.label); }\n                        if(this.texts.description.length > 0){this.form.appendChild(this.description);}\n                        this.form.appendChild(this.inputLat);\n                        this.form.appendChild(this.inputLon);\n                        if(this.texts.submit.length > 0){this.form.appendChild(this.submit);}\n                        this.wrapper.appendChild(this.form);\n                    }\n\n                    else{\n                        if(this.texts.label.length > 0){ this.wrapper.appendChild(this.label); }\n                        if(this.texts.description.length > 0){this.wrapper.appendChild(this.description);}\n                        this.wrapper.appendChild(this.inputLat);\n                        this.wrapper.appendChild(this.inputLon);\n                        if(this.texts.submit.length > 0){this.wrapper.appendChild(this.submit);}\n                    }\n\n\n                    \/\/funzione a parsing avvenuto\n                    this.onCoordsParsed = () => {\n\n                        if(this.params.logEnabled){ console.log('CoordinatesParser.onCoordsParsed: selezionata opzione: '+this.selectedOptionValue); }\n\n                    }\n\n\n                    this.submit.addEventListener('click',()=>{\n\n                        if(this.params.logEnabled){ console.log('CoordinatesParser.onSubmit: richiesta ricerca per coordinate'); }\n\n                        this.parsedCoords = this.parseCoords([this.inputLat.value,this.inputLon.value]);\n\n                        if(this.parsedCoords == null){\n                            \/\/this.reset();\n                            this.setMsg(this.texts['error_parsing'],true,'error');\n                            return;\n                        }\n\n                        this.onCoordsParsed();\n\n                        if(!this.params.keepValue){this.reset();}\n\n\n                    });\n\n\n\t\t\t\t\t\/\/predisponi onblur\n\t\t\t\t\tthis.inputLat.addEventListener('blur', () => {\n\n                        \/\/if(!this.params.keepValue){this.reset();}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\n                    this.inputLon.addEventListener('blur', () => {\n\n                        \/\/if(!this.params.keepValue){this.reset();}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}\n\n\n                 \/\/variazione funzione a parsing avvenuto\n                setOnCoordsParsed(fn = ()=>{}){\n\n                    this.onCoordsParsed = fn;\n\n                }\n\n\n                isDDLat(input) { \n                    return \/^-?\\d{1,3}[\\.,]?\\d+$\/.test(input);\n                }\n\n                isDDLon(input) { \n                    return \/^-?\\d{1,3}[\\.,]?\\d+$\/.test(input);\n                }\n\n                isDMSLat(input)  {\n                    const regexGradiCompattiLat = \/^(\\d{1,3})\u00b0(\\d{1,2})('|\u2032)(\\d{1,2}(?:[\\.,]\\d+)?)(\"|\u2033)[NS]$\/i;\n                    return regexGradiCompattiLat.test(input);\n                }\n\n\n                isDMSLon(input) {\n                    const regexGradiCompattiLon = \/^(\\d{1,3})\u00b0(\\d{1,2})('|\u2032)(\\d{1,2}(?:[\\.,]\\d+)?)(\"|\u2033)[EW]$\/i;\n                    return regexGradiCompattiLon.test(input);\n                }\n\n                \/\/converte coordinate in simboli in decimali\n                symb2dec([latStr, lonStr]) {\n                    \/\/ Regex per latitudine (\u00b0 ' \" N\/S)\n                    const regexLat = \/^(\\d{1,3})\u00b0?(\\d{1,2})'?(\\d{1,2}(?:\\.\\d+)?)?\"?([NS])$\/i;\n                    \/\/ Regex per longitudine (\u00b0 ' \" E\/W)\n                    const regexLon = \/^(\\d{1,3})\u00b0?(\\d{1,2})'?(\\d{1,2}(?:\\.\\d+)?)?\"?([EW])$\/i;\n\n                    const mLat = latStr.match(regexLat);\n                    const mLon = lonStr.match(regexLon);\n                    if (!mLat || !mLon) return null;\n\n                    const conv = (match) => {\n                        const d = parseFloat(match[1]);\n                        const m = parseFloat(match[2]);\n                        const s = parseFloat(match[3]);\n                        let val = d + m \/ 60 + s \/ 3600;\n                        const dir = match[4].toUpperCase();\n                        if (dir === 'S' || dir === 'W') val = -val;\n                        return val;\n                    };\n\n                    return [ conv(mLat), conv(mLon) ];\n                }\n                        \n                \/\/verifica se coordinate sono in italia\n                isInItaly([lat, lon]) {\n                    \/\/ Italia: latitudine tra 35.5\u00b0N (Lampedusa) e 47.1\u00b0N (Alpi)\n                    \/\/          longitudine tra 6.5\u00b0E (Piemonte) e 18.5\u00b0E (Salento)\n                    return lat >= 35.5 && lat <= 47.1 && lon >= 6.5 && lon <= 18.5;\n                }\n\n\n                \/\/verifica, correggi, predisponi coordinate per marker\n                parseCoords(rawLatLng){\n\n                    try{\n\n                        rawLatLng = [rawLatLng[0].replace(\/\\s+\/g, \"\"),rawLatLng[1].replace(\/\\s+\/g, \"\")];\n\n\n                        if(this.params.logEnabled){  console.log('CoordinatesParser.parseCoords: coordinate immesse: '+rawLatLng); }\n\n\n                        if (this.isDDLat(rawLatLng[0]) && this.isDDLon(rawLatLng[1])) {\n                            if(this.params.logEnabled){ console.log(\"CoordinatesParser.parseCoords: Formato gradi decimali\"); }\n                            this.parsedCoords =  [rawLatLng[0].replace(',', '.'),rawLatLng[1].replace(',', '.')];\n\n                        } \n\n                        else if (this.isDMSLat(rawLatLng[0]) && this.isDMSLon(rawLatLng[1])) {\n                            if(this.params.logEnabled){ console.log(\"CoordinatesParser.parseCoords: Formato gradi minuti secondi\"); }\n                            rawLatLng =  [rawLatLng[0].replace(',', '.'),rawLatLng[1].replace(',', '.')];\n                            this.parsedCoords = this.symb2dec(rawLatLng);\n\n                        } \n                        \n                        else {\n                            if(this.params.logEnabled){ console.error(\"CoordinatesParser.parseCoords: Formato non riconosciuto\"); }\n                            this.parsedCoords =  null;\n                        }\n\n                        if(this.params.logEnabled){ console.log('CoordinatesParser.parseCoords: coordinate parsate: '+this.parsedCoords); }\n\n                        if(!this.isInItaly(this.parsedCoords)){\n                            if(this.params.logEnabled){ console.error(\"CoordinatesParser.parseCoords: Coordinate non in Italia\"); }\n                            this.parsedCoords = null;\n                        }\n \n                        return this.parsedCoords;\n\n                    }catch(e){this.parsedCoords = null; if(this.params.logEnabled){ console.error('CoordinatesParser.parseCoords: Errore: '+e); } return null;}\n\n\n                }\n\n\n                \/\/imposta messaggio di stato\/descrizione\n                setMsg(msg,autoReset = false,alertLevel='info'){\n\n\t\t\t\t\talertLevel = ['info','warning','error'].indexOf(alertLevel) >= 0 ? alertLevel : 'info';\n                    this.description.innerText = msg;\n\t\t\t\t\tthis.description.dataset.alertLevel = alertLevel;\n\t\t\t\t\tclearTimeout(this.timeoutMsgReset);\n\t\t\t\t\tif(autoReset){ this.timeoutMsgReset = setTimeout(()=>{ \n\t\t\t\t\t\tthis.description.innerText = this.texts.description;\n\t\t\t\t\t\tthis.description.dataset.alertLevel = 'info';\n\t\t\t\t\t},this.timeoutMsgResetMS ); }\n\n                }\n\n\t\t\t\treset(){\n\n\t\t\t\t\tthis.inputLat.value='';\n                    this.inputLon.value='';\n                    this.parsedCoords=null;\n                    this.setMsg(this.texts.description);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t\t\n\t<\/script>\n\n\t\t\n\t\t\t\t\t\t\t\n\t\t<!-- LIBRERIE CDN -->\n\t\t<script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/leaflet\/leaflet.js\"><\/script>\n\t\t<script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/leaflet_draw\/leaflet.draw.js\"><\/script>\n\t\t<script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/proj4\/proj4.js\"><\/script>\n\t\t<script src=\"\/wp-content\/themes\/hello-theme-child-master\/assets\/js\/markercluster\/leaflet.markercluster.js\"><\/script>\t\n\n\t\t<script>\n\n\t\t\tclass GeoSelector{\n\n\t\t\t\tconstructor(mapId,params = {},texts = {}) {\n\t\t\t\t\t\n\t\t\t\t\tthis.isInitializing = true;\n\t\t\t\t\tthis.isAreaTesting = false;\n\n\t\t\t\t\t\/\/modelli di endpoint\n\t\t\t\t\tthis.tileServerEndpoints = {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t'openstreetmap_base' : {\n\t\t\t\t\t\t\t'token':null\n\t\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png'; }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t,'arcgis_bw' : {\n\t\t\t\t\t\t\t'token':null\n\t\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/Canvas\/World_Light_Gray_Base\/MapServer\/tile\/{z}\/{y}\/{x}'; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t,'google' : {\n\t\t\t\t\t\t\t'token':''\n\t\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/mt1.google.com\/vt\/lyrs=m&x={x}&y={y}&z={z}&key='+this.token; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\t,'mapbox' : {\n\t\t\t\t\t\t\t'token':'pk.eyJ1IjoiY3Jpa2ZpbGlwcG8iLCJhIjoiY202dHVrZHhxMDBjbTJxczRsZXczaWEwNiJ9._kBSOhOeLd_AfUIDgAhDqg'\n\t\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t\t,maxBounds : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/streets-v11\/tiles\/{z}\/{x}\/{y}?access_token='+this.token; }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.params = {\n\n\t\t\t\t\t\t'logEnabled' : params.logEnabled ?? true,\n\t\t\t\t\t\t'spinnerEnabled' :   params.spinnerEnabled ?? true,\n\n\t\t\t\t\t\t'clickedPolygonSize' : params.clickedPolygonSize ?? 0.005,\n\t\t\t\t\n\t\t\t\t\t\t'polygonColors':{\n\n\t\t\t\t\t\t\t'user' : { 'fill' : params.polygonColors?.user?.fill ?? 'green' , 'line' : params.polygonColors?.user?.line ?? 'green' }\n\t\t\t\t\t\t\t,'locations' : { 'fill' : params.polygonColors?.locations?.fill ?? 'yellow' , 'line' : params.polygonColors?.locations?.line ?? 'yellow' }\n\t\t\t\t\t\t\t,'products' : { 'fill' : params.polygonColors?.products?.fill ?? 'blue' , 'line' : params.polygonColors?.products?.line ?? 'blue' }\n\t\t\t\t\t\t\t,'listed' : { 'fill' : params.polygonColors?.listed?.fill ?? 'grey' , 'line' : params.polygonColors?.listed?.line ?? 'grey' }\n\t\t\t\t\t\t\t,'collection' : { 'fill' : params.polygonColors?.collection?.fill ?? 'azure' , 'line' : params.polygonColors?.collection?.line ?? 'azure' }\n\t\t\t\t\t\t\t,'layer' : { 'fill' : params.polygonColors?.layer?.fill ?? '#0000f83d' , 'line' : params.polygonColors?.layer?.line ?? 'transparent' }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t,'pointColors':{\n\n\t\t\t\t\t\t\t'user' : params.pointColors?.user ?? 'green'\n\t\t\t\t\t\t\t,'locations' : params.pointColors?.locations ?? 'yellow'\n\t\t\t\t\t\t\t,'products' : params.pointColors?.products ?? 'blue'\n\t\t\t\t\t\t\t,'listed' : params.pointColors?.listed ?? 'grey'\n\t\t\t\t\t\t\t,'collection' : params.pointColors?.listed ?? 'azure'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t,'tileServerEndpoint' : {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t'token': params.tileServerEndpoint?.token ?? this.tileServerEndpoints.openstreetmap_base.token\n\t\t\t\t\t\t\t,'minZoom': params.tileServerEndpoint?.minZoom ?? this.tileServerEndpoints.openstreetmap_base.minZoom\n\t\t\t\t\t\t\t,'maxZoom': params.tileServerEndpoint?.maxZoom ?? this.tileServerEndpoints.openstreetmap_base.maxZoom\n\t\t\t\t\t\t\t,'maxBounds' : params.tileServerEndpoint?.maxBounds ?? this.tileServerEndpoints.openstreetmap_base.maxBounds\n\t\t\t\t\t\t\t,'centerCoordinates': params.tileServerEndpoint?.centerCoordinates ?? this.tileServerEndpoints.openstreetmap_base.centerCoordinates\n\t\t\t\t\t\t\t,getUrl : params.tileServerEndpoint?.getUrl ?? this.tileServerEndpoints.openstreetmap_base.getUrl\n\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t,'buttons' : {\n\n\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t'enable' : params.buttons?.zoomIn?.enable ?? true\n\t\t\t\t\t\t\t\t,'icon' : params.buttons?.zoomIn?.icon ?? '\u271a'\n\t\t\t\t\t\t\t\t,'title' : params.buttons?.zoomIn?.title ?? 'Zoom in'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t'enable' : params.buttons?.zoomOut?.enable ?? true\n\t\t\t\t\t\t\t\t,'icon' : params.buttons?.zoomOut?.icon ?? '\u268a'\n\t\t\t\t\t\t\t\t,'title' : params.buttons?.zoomOut?.title ?? 'Zoom out'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t'enable' : params.buttons?.drawRectangle?.enable ?? true\n\t\t\t\t\t\t\t\t,'icon' : params.buttons?.drawRectangle?.icon ??'\u25f0'\n\t\t\t\t\t\t\t\t,'title' : params.buttons?.drawRectangle?.title ??'Draw a rectangle'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t'enable' : params.buttons?.removeAll?.enable ?? true\n\t\t\t\t\t\t\t\t,'icon' : params.buttons?.removeAll?.icon ?? '\u232b'\n\t\t\t\t\t\t\t\t,'title' : params.buttons?.removeAll?.title ?? 'Remove all shapes'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t,'marker' : {\n\n\t\t\t\t\t\t\t'url': params.marker?.url ?? 'https:\/\/unpkg.com\/leaflet@1.7.1\/dist\/images\/marker-icon.png'\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.texts = {\n\n\t\t\t\t\t\t'buttons' : {\n\n\t\t\t\t\t\t\t'zoomIn' : {\n\n\t\t\t\t\t\t\t\t'title' : texts.buttons?.zoomIn?.title ?? 'Zoom in'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'zoomOut' : {\n\n\t\t\t\t\t\t\t\t'title' : texts.buttons?.zoomOut?.title ?? 'Zoom out'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t,'drawRectangle' : {\n\n\t\t\t\t\t\t\t\t'title' : texts.buttons?.drawRectangle?.title ?? 'Draw a rectangle',\n\t\t\t\t\t\t\t\t'start' : texts.buttons?.drawRectangle?.start ?? 'Click and drag to draw an area',\n\t\t\t\t\t\t\t\t'end': texts.buttons?.drawRectangle?.end ?? 'Release to draw an area'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t,'removeAll' : {\n\n\t\t\t\t\t\t\t\t'title' : texts.buttons?.removeAll?.title ?? 'Remove all shapes'\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t};\n\n\t\t\t\t\t\/\/utilizza eventuale alias di endpoint passato\n\t\t\t\t\tif('tileServerEndpoint_alias' in params && params.tileServerEndpoint_alias.length > 0){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(params.tileServerEndpoint_alias in this.tileServerEndpoints){\n\t\t\t\t\t\t\tthis.params.tileServerEndpoint =  this.tileServerEndpoints[params.tileServerEndpoint_alias];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telse{\n\n\t\t\t\t\t\t\tthis.params.tileServerEndpoint =  this.tileServerEndpoints.openstreetmap_base;\n\t\t\t\t\t\t\tif(this.params.logEnabled){ console.log('GeoSelector: alias tileServerEndpoint non trovato tra i modelli integrati'); }\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA MAPPA\n\t\t\t\t\tthis.mapId = mapId;\n\t\t\t\t\tthis.map = L.map(this.mapId, {\n\t\t\t\t\t\tzoomControl: false\n\t\t\t\t\t}).setView(\n\t\t\t\t\t\tthis.params.tileServerEndpoint.centerCoordinates,\n\t\t\t\t\t\tthis.params.tileServerEndpoint.minZoom\n\t\t\t\t\t);\n\t\t\t\t\tthis.map.setMaxBounds(this.params.tileServerEndpoint.maxBounds); \/\/imposta limiti mappa\n\t\t\t\t\tthis.polygons = {'locations':[],'products':[],'user':[],'listed':[],'collection':[],'layers':[]};\n\t\t\t\t\tthis.points = {'locations':[],'products':[],'user':[],'listed':[],'collection':[],'layers':[]};\n\t\t\t\t\tthis.ButtonDrawPolygon = undefined;\n\t\t\t\t\tthis.ButtonRemAll = undefined;\n\t\t\t\t\tthis.ButtonZoomIn = undefined;\n\t\t\t\t\tthis.ButtonZoomOut = undefined;\n\t\t\t\t\t\/\/this.editableLayers = undefined; \n\n\t\t\t\t\tthis.polygonDrawing = undefined;\n\t\t\t\t\tthis.pointDrawing = undefined;\n\t\t\t\t\tif(this.params.spinnerEnabled){ document.getElementById(this.mapId).classList.add('spinner-enabled'); }\n\t\t\t\t\t\n\t\t\t\t\tthis.associatedLayerIndex = -1; \/\/layer attivo, indice da parametri productList\n\t\t\t\t\t\n\t\t\t\t\t\/\/INIZIALIZZA LIVELLO TILES\n\t\t\t\t\tif(1==1){\n\t\t\t\t\t\tL.tileLayer( \n\t\t\t\t\t\t\tthis.params.tileServerEndpoint.getUrl()\n\t\t\t\t\t\t\t, { \n\t\t\t\t\t\t\t\tminZoom: this.params.tileServerEndpoint.minZoom\n\t\t\t\t\t\t\t\t,maxZoom: this.params.tileServerEndpoint.maxZoom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t).addTo(this.map);\n\t\t\t\t\t}\t\t\n\n\t\t\t\t\t\/\/INIZIALIZZA PLUGIN DRAW E LISTENER\n\t\t\t\t\tif(1==1){\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.editableLayers = new L.FeatureGroup();\n\t\t\t\t\t\tthis.map.addLayer(this.editableLayers);\n\n\t\t\t\t\t\t\/\/rimuovi tutte opzioni originali\n\t\t\t\t\t\tvar drawPluginOptions = {\n\t\t\t\t\t\t\tposition: 'topleft',\n\t\t\t\t\t\t\tdraw: {\n\t\t\t\t\t\t\t\trectangle: false,\n\t\t\t\t\t\t\t\tpolygon: false,\n\t\t\t\t\t\t\t\tpolyline: false,\n\t\t\t\t\t\t\t\tcircle: false,\n\t\t\t\t\t\t\t\tmarker: false\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tedit: {\n\t\t\t\t\t\t\t\tfeatureGroup: this.editableLayers, \/\/ REQUIRED!!\n\t\t\t\t\t\t\t\tremove: false, \/\/ Permette di rimuovere gli oggetti\n\t\t\t\t\t\t\t\tedit: false, \/\/ Disabilita l'editing\n\t\t\t\t\t\t\t\tdrag: false, \/\/ Disabilita lo spostamento\n\t\t\t\t\t\t\t\tresize: false \/\/ Disabilita il ridimensionamento\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tthis.drawControl = new L.Control.Draw(drawPluginOptions);\n\t\t\t\t\t\tthis.map.addControl(this.drawControl);\n\n\n\t\t\t\t\t\t\/\/listener, salva disegno -> solo dopo creazione con tool\n\t\t\t\t\t\tthis.drawerListener = this.map.on('draw:created', (e) => {\n\n\t\t\t\t\t\t\tif (e.layerType === 'marker') { \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar latlng = this.layerToLatlng(e.layer);\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onPointSelected: rilevato disegno punto');}\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onPointSelected: rimuovo disegni precedenti');}\n\n\t\t\t\t\t\t\t\tthis.removeAllPolygons(); \/\/rimuove tutti i poligoni disegnati\n\t\t\t\t\t\t\t\tthis.removeAllPoints(); \/\/rimuove tutti i punti disegnati\n\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onPointSelected: aggiungo e registro nuovo disegno');}\n\t\t\t\t\t\t\t\tthis.drawPoint(latlng,'user',true,true); \n\n\t\t\t\t\t\t\t\tthis.onPointSelected(latlng); \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\telse { \n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\tvar latlng = this.layerToLatlng(e.layer);\n\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onAreaSelected: rilevato disegno area');}\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onAreaSelected: rimuovo disegni precedenti');}\n\n\t\t\t\t\t\t\t\tthis.removeAllPolygons(); \/\/rimuove tutti i poligoni disegnati\n\t\t\t\t\t\t\t\tthis.removeAllPoints(); \/\/rimuove tutti i punti disegnati\n\n\t\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onAreaSelected: aggiungo e registro nuovo disegno');}\n\n\n\t\t\t\t\t\t\t\t\/\/ Verifica dimensioni minime del rettangolo disegnato\n\t\t\t\t\t\t\t\tconst minWidth = this.params.clickedPolygonSize * 2;\n\t\t\t\t\t\t\t\tconst minHeight = this.params.clickedPolygonSize * 2;\n\t\t\t\t\t\t\t\tconst bounds = e.layer.getBounds();\n\t\t\t\t\t\t\t\tconst width = bounds.getEast() - bounds.getWest();\n\t\t\t\t\t\t\t\tconst height = bounds.getNorth() - bounds.getSouth(); \n\n\t\t\t\t\t\t\t\tif (width < minWidth || height < minHeight) {\n\t\t\t\t\t\t\t\t\tconst center = bounds.getCenter();\n\t\t\t\t\t\t\t\t\tconst newBounds = L.latLngBounds(\n\t\t\t\t\t\t\t\t\t\t[center.lat - this.params.clickedPolygonSize, center.lng - this.params.clickedPolygonSize],\n\t\t\t\t\t\t\t\t\t\t[center.lat + this.params.clickedPolygonSize, center.lng + this.params.clickedPolygonSize]\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tlatlng = [\n\t\t\t\t\t\t\t\t\t\t[newBounds.getSouthWest().lat, newBounds.getSouthWest().lng],\n\t\t\t\t\t\t\t\t\t\t[newBounds.getNorthWest().lat, newBounds.getNorthWest().lng],\n\t\t\t\t\t\t\t\t\t\t[newBounds.getNorthEast().lat, newBounds.getNorthEast().lng], \n\t\t\t\t\t\t\t\t\t\t[newBounds.getSouthEast().lat, newBounds.getSouthEast().lng],\n\t\t\t\t\t\t\t\t\t\t[newBounds.getSouthWest().lat, newBounds.getSouthWest().lng]\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t} \n\t\t\t\t\n\t\t\t\t\t\t\t\tthis.drawPolygon(latlng,'user',true,true,true); \n\n\t\t\t\t\t\t\t\tthis.onAreaSelected(latlng); \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/operazioni successive a selezione area\n\t\t\t\t\t\tthis.onAreaSelected= (latlng = undefined == undefined ? undefined : [[0.0,0.0],[0.0,0.0]]) => {\n\n\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onAreaSelected: eventuali ulteriori operazioni');}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/operazioni successive a selezione punto \n\t\t\t\t\t\tthis.onPointSelected= (latlng = undefined == undefined ? undefined : [[0.0,0.0]]) => {\n\n\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.onPointSelected: eventuali ulteriori operazioni');}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/operazioni a click durante disegno poligono\n\t\t\t\t\t\tthis.onPolygonDrawingClick = (clickEvent)=>{\n\n\t\t\t\t\t\t\t\/\/disabilita istanze precedenti\n\t\t\t\t\t\t\tthis.map.off('click', this.onPolygonDrawingClick);\n\t\t\t\t\t\t\tthis.polygonDrawing.disable();\n\t\t\t\t\t\t\tthis.map.on('draw:created', (e) => { this.map.off('click', this.onPolygonDrawingClick); });\n\n\t\t\t\t\t\t\t\/\/calcola bounds dell'area di \"minimo ingombro\"\n\t\t\t\t\t\t\tconst delta = this.params.clickedPolygonSize; \/\/ grandezza rettangolo (in gradi)\n\t\t\t\t\t\t\tconst bounds = L.latLngBounds(\n\t\t\t\t\t\t\t\t[clickEvent.latlng.lat - delta, clickEvent.latlng.lng - delta],\n\t\t\t\t\t\t\t\t[clickEvent.latlng.lat + delta, clickEvent.latlng.lng + delta]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\/\/ Simula evento completamento disegno\n\t\t\t\t\t\t\tthis.map.fire('draw:created', {\n\t\t\t\t\t\t\t\tlayerType: 'rectangle',\n\t\t\t\t\t\t\t\tlayer: L.rectangle(bounds, this.polygonDrawing.options.shapeOptions)\n\t\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/mostra\/nascondi layers durante zoom\n\t\t\t\t\t\tthis.map.on('zoomstart', () => { this.toggleLayers(true); });\n\t\t\t\t\t\tthis.map.on('zoomend', () => { this.toggleLayers(false);  });\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA PULSANTI PER ZOOM IN\n\t\t\t\t\tif(1==1 && this.params.buttons.zoomIn.enable  ){\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.ButtonZoomIn = L.control({ position: 'topleft' });\n\n\t\t\t\t\t\tthis.ButtonZoomIn.onAdd = () => {\n\n\t\t\t\t\t\t\tvar div = L.DomUtil.create('div', 'leaflet-control-zoom leaflet-bar leaflet-control');\n\n\t\t\t\t\t\t\tvar a = L.DomUtil.create('a');\n\t\t\t\t\t\t\ta.innerHTML = this.params.buttons.zoomIn.icon;\n\t\t\t\t\t\t\ta.setAttribute('title',this.texts.buttons.zoomIn.title);\n\t\t\t\t\t\t\ta.setAttribute('href','#');\n\n\t\t\t\t\t\t\t\/\/avvia zoom in\n\t\t\t\t\t\t\ta.onclick = (e) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tthis.map.zoomIn();\n\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tdiv.appendChild(a);\n\n\t\t\t\t\t\t\treturn div;\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\/\/ Aggiungi il nuovo pulsante alla mappa\n\t\t\t\t\t\tthis.ButtonZoomIn.addTo(this.map);\n\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA PULSANTI PER ZOOM OUT\n\t\t\t\t\tif(1==1 && this.params.buttons.zoomOut.enable ){\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.ButtonZoomOut = L.control({ position: 'topleft' });\n\n\t\t\t\t\t\tthis.ButtonZoomOut.onAdd = () => {\n\n\t\t\t\t\t\t\tvar div = L.DomUtil.create('div', 'leaflet-control-zoom leaflet-bar leaflet-control');\n\n\t\t\t\t\t\t\tvar a = L.DomUtil.create('a');\n\t\t\t\t\t\t\ta.innerHTML = this.params.buttons.zoomOut.icon;\n\t\t\t\t\t\t\ta.setAttribute('title',this.texts.buttons.zoomOut.title);\n\t\t\t\t\t\t\ta.setAttribute('href','#');\n\n\t\t\t\t\t\t\t\/\/avvia zoom out\n\t\t\t\t\t\t\ta.onclick = (e) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tthis.map.zoomOut();\n\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tdiv.appendChild(a);\n\n\t\t\t\t\t\t\treturn div;\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\/\/ Aggiungi il nuovo pulsante alla mappa\n\t\t\t\t\t\tthis.ButtonZoomOut.addTo(this.map);\n\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA PULSANTE PER DISEGNO POLIGONO\n\t\t\t\t\tif(1==1 && this.params.buttons.drawRectangle.enable){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/testi tooltip\n\t\t\t\t\t\tif (L.drawLocal && L.drawLocal.draw && L.drawLocal.draw.handlers && L.drawLocal.draw.handlers.rectangle) {\n\t\t\t\t\t\t\tL.drawLocal.draw.handlers.rectangle.tooltip.start = this.texts.buttons.drawRectangle.start;\n\t\t\t\t\t\t\tL.drawLocal.draw.handlers.simpleshape.tooltip.end = this.texts.buttons.drawRectangle.end;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.ButtonDrawPolygon = L.control({ position: 'topleft' });\n\n\t\t\t\t\t\tthis.ButtonDrawPolygon.onAdd = () => {\n\t\t\t\t\t\t\tvar div = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\n\t\t\t\t\t\t\tvar a = L.DomUtil.create('a');\n\t\t\t\t\t\t\ta.innerHTML = this.params.buttons.drawRectangle.icon;\n\t\t\t\t\t\t\ta.setAttribute('title',this.texts.buttons.drawRectangle.title);\n\t\t\t\t\t\t\ta.setAttribute('href','#');\n\n\t\t\t\t\t\t\t\/\/avviatore disegno rettangolo\n\t\t\t\t\t\t\ta.onclick = (e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tthis.polygonDrawer();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tdiv.appendChild(a);\n\n\t\t\t\t\t\t\treturn div;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\/\/ Aggiungi il nuovo pulsante alla mappa\n\t\t\t\t\t\tthis.ButtonDrawPolygon.addTo(this.map);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA PULSANTE RIMOZIONE POLIGONI\n\t\t\t\t\tif(1==1 && this.params.buttons.removeAll.enable){\n\t\n\t\t\t\t\t\tthis.ButtonRemAll = L.control({position: 'topleft'});\n\n\t\t\t\t\t\tthis.ButtonRemAll.onAdd = () => {\n\t\t\t\t\t\tvar div = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\n\t\t\t\t\t\tvar a = L.DomUtil.create('a');\n\t\t\t\t\t\ta.innerHTML = this.params.buttons.removeAll.icon;\n\t\t\t\t\t\ta.setAttribute('title',this.texts.buttons.removeAll.title);\n\t\t\t\t\t\ta.setAttribute('href','#');\n\n\t\t\t\t\t\t\/\/ avvia rimozione geometrie\n\t\t\t\t\t\ta.onclick = (e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.removeAll: rimozione di tutti i disegni ricerca');}\n\t\t\t\t\t\t\tthis.removeAll();\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdiv.appendChild(a);\n\n\t\t\t\t\t\treturn div;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.ButtonRemAll.addTo(this.map);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/INIZIALIZZA MARKER INIZIALE SU PUNTO CENTRALE\n\t\t\t\t\tif(0==1){\n\t\t\t\t\t\tL.marker(this.params.tileServerEndpoint.centerCoordinates).addTo(this.map);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/LOG SPOSTAMENTO SU MAPPA\n\t\t\t\t\tif(0==1){\n\t\t\t\t\t\tthis.map.on('moveend', logTiles(this.map));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/POLIGONI DI ESEMPIO\n\t\t\t\t\tthis.EGPolygons = {\n\t\t\t\t\t\t\"Roma\":[\n\t\t\t\t\t\t\t[41.8126, 12.3715],\n\t\t\t\t\t\t\t[41.9010, 12.4947],\n\t\t\t\t\t\t\t[41.9250, 12.5135],\n\t\t\t\t\t\t\t[41.9330, 12.4860],\n\t\t\t\t\t\t\t[41.9430, 12.4675],\n\t\t\t\t\t\t\t[41.9300, 12.4320],\n\t\t\t\t\t\t\t[41.9150, 12.4023],\n\t\t\t\t\t\t\t[41.8900, 12.3860],\n\t\t\t\t\t\t\t[41.8630, 12.3790],\n\t\t\t\t\t\t\t[41.8126, 12.3715] \n\t\t\t\t\t\t]\n\t\t\t\t\t};\n\n\t\t\t\t\t\/\/PUNTI DI ESEMPIO\n\t\t\t\t\tthis.EGPoints = {\n\t\t\t\t\t\t\"Roma\":[\n\t\t\t\t\t\t\t[41.89225468822697, 12.49523162841797]\n\t\t\t\t\t\t]\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.testAreaSelector();\n\t\t\t\t\t\n\t\t\t\t\tthis.isInitializing = false;\n\n\t\t\t\t}\n\n\t\t\t\t\/\/ferma tutti i disegni\n\t\t\t\tstopAllDrawing(){\n\n\t\t\t\t\tvar wasDrawing = false;\n\t\t\t\t\tif(this.pointDrawing != undefined){ wasDrawing = true; this.pointDrawing.disable(); }\n\t\t\t\t\tif(this.polygonDrawing != undefined){ wasDrawing = true; this.polygonDrawing.disable(); }\n\t\t\t\t\tthis.map.off('click', this.onPolygonDrawingClick);\n\t\t\t\t\tif(wasDrawing){ this.map.fire('draw:drawstop'); } \n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t\/\/imposta funzione a termine area selezionata\n\t\t\t\tsetOnAreaSelected(fn = undefined == undefined ? undefined : (latlng = undefined == undefined ? undefined : [[0.0,0.0],[0.0,0.0]])=>{}) {\n\n\t\t\t\t\tif(fn == undefined){fn = this.onAreaSelected;}\n\t\t\t\t\tthis.onAreaSelected = fn;\n\n\t\t\t\t}\n\n\t\t\t\t\/\/imposta funzione a termine punto selezionato\n\t\t\t\tsetOnPointSelected(fn = undefined == undefined ? undefined : (latlng = undefined == undefined ? undefined : [[0.0,0.0]])=>{}) {\n\n\t\t\t\t\tif(fn == undefined){fn = this.onPointSelected;}\n\t\t\t\t\tthis.onPointSelected = fn;\n\n\t\t\t\t}\n\n\t\t\t\t\/\/DISEGNA PUNTO SU MAPPA DA COORDINATE (NOTA: NON SCATENA EVENTO DRAW:CREATED)\n\t\t\t\tdrawPoint(latlng = this.EGPoints.Roma,targetArray = 'user',center = true,zoom = true,highlight = false,customIconUrl = null){\n\n\t\t\t\t\tlet lat = latlng[0][0];\n\t\t\t\t\tlet lon = latlng[0][1];\n\n\t\t\t\t\tlet point = L.marker([lat, lon], {\n\t\t\t\t\t\ticon: L.icon({\n\t\t\t\t\t\t\t\/\/iconUrl: 'https:\/\/unpkg.com\/leaflet@1.7.1\/dist\/images\/marker-icon.png',\n\t\t\t\t\t\t\ticonUrl: customIconUrl ?? this.params.marker.url,\n\t\t\t\t\t\t\ticonSize: [25, 41],\n\t\t\t\t\t\t\ticonAnchor: [12, 41],\n\t\t\t\t\t\t\t\/\/shadowUrl: 'https:\/\/unpkg.com\/leaflet@1.7.1\/dist\/images\/marker-shadow.png',\n\t\t\t\t\t\t\t\/\/shadowSize: [41, 41]\n\t\t\t\t\t\t\tclassName: (highlight ? 'highlighted-marker' : 'standard-marker')\n\t\t\t\t\t\t})\n\t\t\t\t\t}).addTo(this.map);\n\n\n\t\t\t\t\tthis.points[targetArray].push( point );\n\n\n\t\t\t\t\tif (center) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawPoint: richiesto accentramento');}\n\t\t\t\t\t\tif(zoom){this.map.once('zoomend', () => { this.map.panTo([lat, lon]); }); }\n\t\t\t\t\t\telse{this.map.panTo([lat, lon]);}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(zoom){\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawPoint: richiesto zoom');}\n\t\t\t\t\t\tvar latlng = point.getLatLng();\n\t\t\t\t\t\tvar bounds = L.latLngBounds(latlng, latlng);\n\t\t\t\t\t\tvar zoomLevel = this.map.getBoundsZoom(bounds);\n\t\t\t\t\t\tthis.map.setZoom((zoomLevel));\n\t\t\t\t\t\tif(this.map.getZoom() == zoomLevel){this.map.fire('zoomend');}\n\n\t\t\t\t\t}\n\n\t\t\t\n\n\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t\t\/\/ATTIVA DISEGNO PUNTO\n\t\t\t\tpointDrawer(){\n\n\t\t\t\t\tthis.stopAllDrawing();\n\n\t\t\t\t\tthis.pointDrawing = new L.Draw.Marker(this.map, {\n\t\t\t\t\t\ticon: L.icon({\n\t\t\t\t\t\t\t\/\/iconUrl: 'https:\/\/unpkg.com\/leaflet@1.7.1\/dist\/images\/marker-icon.png',\n\t\t\t\t\t\t\ticonUrl: this.params.marker.url,\n\t\t\t\t\t\t\ticonSize: [25, 41],\n\t\t\t\t\t\t\ticonAnchor: [12, 41],\n\t\t\t\t\t\t\tpopupAnchor: [1, -34],\n\t\t\t\t\t\t\t\/\/shadowUrl: 'https:\/\/unpkg.com\/leaflet@1.7.1\/dist\/images\/marker-shadow.png',\n\t\t\t\t\t\t\t\/\/shadowSize: [41, 41]\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.pointDrawing.enable();\n\n\t\t\t\t}\n\n\t\t\t\t\/\/RIMUOVI TUTTI I PUNTI\n\t\t\t\tremoveAllPoints(targetArrays = ['user','products','locations','listed','collection','layers']) {\n\n\n\t\t\t\t\t\/\/disabilita disegno attivo\n\t\t\t\t\tif(this.pointDrawing != undefined){ this.pointDrawing.disable(); }\n\n\t\t\t\t\t\/\/verifica se esistono punti da rimuovere\n\t\t\t\t\tvar chks = [];\n\t\t\t\t\ttargetArrays.forEach((target) => {\n\t\t\t\t\t\tchks.push((this.points[target].length > 0 ? 1 : 0));\n\t\t\t\t\t});\n\t\t\t\t\tif(!chks.includes(1)){return;}\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\/\/ rimuovi punti localit\u00e0 cercate\n\t\t\t\t\tif(targetArrays.includes('locations')){\n\n\t\t\t\t\t\tthis.points.locations.forEach((point) => {\n\t\t\t\t\t\t\tpoint.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.locations = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi punti prodotti selezionati\n\t\t\t\t\tif(targetArrays.includes('products')){\n\n\t\t\t\t\t\tthis.points.products.forEach((point) => {\n\t\t\t\t\t\t\tpoint.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.products = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi punti utente disegnati\n\t\t\t\t\tif(targetArrays.includes('user')){\n\n\t\t\t\t\t\tthis.points.user.forEach((point) => {\n\t\t\t\t\t\t\tpoint.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.user = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi punti prodotto disegnati\n\t\t\t\t\tif(targetArrays.includes('listed')){\n\n\t\t\t\t\t\tthis.points.listed.forEach((point) => {\n\t\t\t\t\t\t\tpoint.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.listed = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi punti collezione prodotto disegnati\n\t\t\t\t\tif(targetArrays.includes('collection')){\n\n\t\t\t\t\t\tthis.points.collection.forEach((point) => {\n\t\t\t\t\t\t\tpoint.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.collection = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/ rimuovi punti layers disegnati\n\t\t\t\t\tif(targetArrays.includes('layers')){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/console.error('rimuovo layers!');\n\n\t\t\t\t\t\tthis.points.layers.forEach((pointLayer) => {\n\t\t\t\t\t\t\tthis.map.removeLayer(pointLayer);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.points.layers = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.removeAllPoints: punti rimossi: '+targetArrays);}\n\n\t\t\t\t\t\/\/crea evento rimozione\n\t\t\t\t\tthis.map.fire('removeAllPoints', { 'targetArrays' : targetArrays });\n\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t\t\/\/DISEGNA POLIGONO SU MAPPA DA COORDINATE (NOTA: NON SCATENA EVENTO DRAW:CREATED)\n\t\t\t\tdrawPolygon(latlng = this.EGPolygons.Roma,targetArray = 'user',center = true,zoom = true,bringToFront = true,polygonColor = undefined == undefined ? undefined : {'fill':'blue','line':'blue'}){\n\n\t\t\t\t\t\n\n\t\t\t\t\tlet polygon = L.polygon(latlng, {\n\t\t\t\t\t\tcolor: (polygonColor != undefined && polygonColor.line != undefined ? polygonColor.line : this.params.polygonColors[targetArray].line),\n\t\t\t\t\t\tweight: 2,\n\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\tfillColor: (polygonColor != undefined && polygonColor.fill != undefined ? polygonColor.fill : this.params.polygonColors[targetArray].fill),\n\t\t\t\t\t\tfillOpacity: 0.3\n\t\t\t\t\t}).addTo(this.map);\n\n\t\t\t\t\tthis.polygons[targetArray].push( polygon );\n\n\t\t\t\t\tif (bringToFront) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawPolygon: richiesto bringToFront');}\n\t\t\t\t\t\tpolygon.bringToFront(); \n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\tif(center){\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawPolygon: richiesto accentramento');}\n\t\t\t\t\t\tif(zoom){\n\t\t\t\t\t\t\tthis.map.once('zoomend', () => {\n\t\t\t\t\t\t\t\tvar center = polygon.getBounds().getCenter();\n\t\t\t\t\t\t\t\tthis.map.panTo(center);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tvar center = polygon.getBounds().getCenter();\n\t\t\t\t\t\t\tthis.map.panTo(center);\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif(zoom){\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawPolygon: richiesto zoom');}\n\t\t\t\t\t\tconst bounds = polygon.getBounds();\n\t\t\t\t\t\tconst zoomLevel = this.map.getBoundsZoom(bounds);\n\t\t\t\t\t\tthis.map.setZoom((zoomLevel));\n\t\t\t\t\t\tif(this.map.getZoom() == zoomLevel){this.map.fire('zoomend');}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\n\t\t\t\t\/\/ATTIVA DISEGNO POLIGONO\n\t\t\t\tpolygonDrawer(polygonColor = undefined == undefined ? undefined : {'fill':'blue','line':'blue'}) {\n\n\t\t\t\t\tthis.stopAllDrawing();\n\t\t\t\n\t\t\t\t\tthis.polygonDrawing = new L.Draw.Rectangle(this.map, {\n\t\t\t\t\t\tshapeOptions: {\n\t\t\t\t\t\t\tcolor: (polygonColor != undefined && polygonColor.line != undefined ? polygonColor.line : this.params.polygonColors.user.line),\n\t\t\t\t\t\t\tweight: 2,          \/\/ Larghezza del contorno\n\t\t\t\t\t\t\topacity: 1,          \/\/ Opacit\u00e0 del contorno\n\t\t\t\t\t\t\tfillColor: (polygonColor != undefined && polygonColor.fill != undefined ? polygonColor.fill : this.params.polygonColors.user.fill),\n\t\t\t\t\t\t\tfillOpacity: 0.3\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.polygonDrawing.enable();\n\n\t\t\t\t\t\/\/ Intercetta il click dopo enable \/\/TODO: CAPIRE PERCHE CLICK SU PULSANTE AVVIA DISEGNO\n\t\t\t\t\twindow.setTimeout(()=>{this.map.once('click', this.onPolygonDrawingClick);},100);\n\n\t\t\t\t}\n\n\t\t\t\t\/\/RIMUOVI TUTTI I POLIGONI\n\t\t\t\tremoveAllPolygons(targetArrays = ['user','products','locations','listed','collection','layers']) {\n\n\t\t\t\t\t\/\/disabilita disegno attivo\n\t\t\t\t\tif(this.polygonDrawing != undefined){ this.polygonDrawing.disable(); }\n\n\t\t\t\t\t\/\/verifica se esistono poligoni da rimuovere\n\t\t\t\t\tvar chks = [];\n\t\t\t\t\ttargetArrays.forEach((target) => {\n\t\t\t\t\t\tchks.push((this.polygons[target].length > 0 ? 1 : 0));\n\t\t\t\t\t});\n\t\t\t\t\tif(!chks.includes(1)){return;}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\/\/ rimuovi poligoni localit\u00e0 cercate\n\t\t\t\t\tif(targetArrays.includes('locations')){\n\n\t\t\t\t\t\tthis.polygons.locations.forEach((polygon) => {\n\t\t\t\t\t\t\tpolygon.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.locations = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi poligoni prodotti selezionati\n\t\t\t\t\tif(targetArrays.includes('products')){\n\n\t\t\t\t\t\tthis.polygons.products.forEach((polygon) => {\n\t\t\t\t\t\t\tpolygon.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.products = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi poligoni utente disegnati\n\t\t\t\t\tif(targetArrays.includes('user')){\n\n\t\t\t\t\t\tthis.polygons.user.forEach((polygon) => {\n\t\t\t\t\t\t\tpolygon.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.user = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi poligoni prodotto disegnati\n\t\t\t\t\tif(targetArrays.includes('listed')){\n\n\t\t\t\t\t\tthis.polygons.listed.forEach((polygon) => {\n\t\t\t\t\t\t\tpolygon.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.listed = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ rimuovi poligoni collezione prodotto disegnati\n\t\t\t\t\tif(targetArrays.includes('collection')){\n\n\t\t\t\t\t\tthis.polygons.collection.forEach((polygon) => {\n\t\t\t\t\t\t\tpolygon.remove();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.collection = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/ rimuovi poligoni layers disegnati\n\t\t\t\t\tif(targetArrays.includes('layers')){\n\n\t\t\t\t\t\tthis.polygons.layers.forEach((polygonLayer) => {\n\t\t\t\t\t\t\tthis.map.removeLayer(polygonLayer);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Svuota l'array\n\t\t\t\t\t\tthis.polygons.layers = [];\n\n\t\t\t\t\t\t\/\/svuota livelli\n\t\t\t\t\t\t\/\/this.editableLayers.clearLayers();\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.removeAllPolygons: polygoni rimossi: '+targetArrays);}\n\n\t\t\t\t\t\/\/crea evento rimozione\n\t\t\t\t\tthis.map.fire('removeAllPolygons', { 'targetArrays' : targetArrays });\n\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t\/\/RIMUOVI TUTTI I DISEGNI\n\t\t\t\tremoveAll(){\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.removeAll: richiesta rimozione completa ');}\n\t\t\t\t\tthis.removeAllPolygons(); \/\/rimuove tutti i poligoni prodotto disegnati\n\t\t\t\t\tthis.removeAllPoints(); \/\/rimuove tutti i punti prodotto disegnati\n\n\n\t\t\t\t\tthis.map.fire('removeAll'); \/\/evento remall per utleriori elaborazioni esterne\n\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\/\/CONVERSIONE COORDINATE IN TILE\n\t\t\t\tlatlngToTile(lat, lon, zoom) {\n\t\t\t\t\tvar n = Math.pow(2, zoom);\n\t\t\t\t\tvar x = Math.floor((lon + 180) \/ 360 * n);\n\t\t\t\t\tvar y = Math.floor((1 - Math.log(Math.tan(lat * Math.PI \/ 180) + 1 \/ Math.cos(lat * Math.PI \/ 180)) \/ Math.PI) \/ 2 * n);\n\t\t\t\t\treturn {x: x, y: y};\n\t\t\t\t}\n\n\t\t\t\t\/\/CONVERSIONE DA GEOJSON A Lat\/Lon\n\t\t\t\tGeoJSONToLatLng(GeoJSONCoords) {\n\t\t\t\t\treturn GeoJSONCoords.map(coord => {\n\t\t\t\t\t\tconst [lon, lat] = coord;\n\t\t\t\t\t\treturn [lat, lon];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t\/\/CONVERSIONE DA Web Mercator (EPSG:3857) a Lat\/Lon (EPSG:4326 - WGS84)\n\t\t\t\twebMercatorToLatlng(mercatorCoords) {\n\t\t\t\t\tvar latLng = mercatorCoords.map(coord => {\n\t\t\t\t\t\t\/\/ Converte le coordinate e poi inverte l'ordine per ottenere [lat, lon]\n\t\t\t\t\t\tvar tmp;\n\t\t\t\t\t\ttry{ tmp = proj4('EPSG:3857', 'EPSG:4326', coord); }catch(e){console.error('errore conversione coordinate: ' + coord,e);}\n\t\t\t\t\t\treturn [tmp[1], tmp[0]]; \/\/ Restituisce l'ordine corretto [latitudine, longitudine]\n\t\t\t\t\t});\n\n\t\t\t\t\treturn latLng;\n\t\t\t\t}\n\n\t\t\t\t\/\/CONVERSIONE DA Lat\/Lon (EPSG:4326 - WGS84) a Web Mercator (EPSG:3857)\n\t\t\t\tlatlngToWebMercator(latlng) {\n\t\t\t\t\treturn latlng.map(coord => {\n\t\t\t\t\t\t\/\/ Inverte l'ordine per ottenere [lon, lat] e converte\n\t\t\t\t\t\tconst [x, y] = proj4('EPSG:4326', 'EPSG:3857', [coord[1], coord[0]]);\n\t\t\t\t\t\treturn [x, y]; \/\/ Coordinate Web Mercator\n\t\t\t\t\t});\n\t\t\t\t}\n\t\n\t\t\t\t\/\/CONVERSIONE WKT in array di coordinate\n\t\t\t\twktToLatlng(wktCoords,srcEPSG=4326) {\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: conversione WKT in LatLng, wkt : ' + wktCoords);}\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: conversione WKT in LatLng, srcEPSG : ' + srcEPSG);}\n\n\t\t\t\t\tconst isPoint = wktCoords.match(\/POINT\\s*\\(\\s*([^\\s]+)\\s+([^\\s]+)\\s*\\)\/i);\n\t\t\t\t\tconst isMulti =  isPoint ? false : wktCoords.match(\/MULTIPOLYGON\\s*\\(\\(\\((.+?)\\)\\)\\)\/i);\n\t\t\t\t\tconst isPolygon = (isPoint || isMulti) ? false : wktCoords.match(\/POLYGON\\s*\\(\\((.+?)\\)\\)\/i);\n\t\t\t\t\tif (!isPoint && !isMulti && !isPolygon) { throw new Error('Tipo WKT non supportato. Solo POINT, POLYGON e MULTIPOLYGON ammessi.'); }\n\n\t\t\t\t\tvar wktCoords = wktCoords.replace(\/^SRID=\\d+;\\s*\/i, ''); \/\/ Rimuove SRID se presente\n\n\t\t\t\t\t\/\/ point a polygon singolo\n\t\t\t\t\tif (isPoint) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: WKT di tipo POINT rilevato');}\n\t\t\t\t\t\tconst [lon, lat] = [isPoint[1], isPoint[2]];\n\t\t\t\t\t\twktCoords = `POLYGON((${lon} ${lat}))`;\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/multi a singolo\n\t\t\t\t\telse if (isMulti){\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: WKT di tipo MULTIPOLYGON rilevato');}\n\t\t\t\t\t\tvar coords = isMulti[1];\n\t\t\t\t\t\twktCoords = `POLYGON((${coords}))`;\n\t\t\t\t\t}\n\n\t\t\t\t\telse if(isPolygon){\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: WKT di tipo POLYGON rilevato');}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: wkt pulito : ' + wktCoords);}\n\n\t\t\t\t\tvar coordinates = wktCoords.replace(\/^(POLYGON)\\s*\\(\\(|\\)\\)\/gi, '').replace(\/\\)\\)$\/, '');\n\t\t\t\t\tvar coordinates = coordinates.trim().split(\/,\\s*\/);\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: array coordinate estratte : ' + coordinates);}\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Converti in array di coordinate numeriche\n\t\t\t\t\tvar fixedCoordinates = [];\n\t\t\t\t\tfor (let coord of coordinates) {\n\t\t\t\t\t\tconst [lon, lat] = coord.trim().split(\/\\s+\/).map(parseFloat);\n\t\t\t\t\t\tif(isNaN(lat) || isNaN(lon)){  break; } \/\/ Ferma elaborazione, possibile multipolygon non gestibile \/\/TODO: mostrare pi\u00f9 poligoni\n\t\t\t\t\t\tif (srcEPSG == 3857){ fixedCoordinates.push(this.webMercatorToLatlng([[lon, lat]])[0]); } \/\/ Converti COORDINATE  3857 in 4326\n\t\t\t\t\t\telse { fixedCoordinates.push([lat, lon]); } \/\/ Mantieni COORDINATE 4326\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.wktToLatlng: array di coordinate corrette : ' + fixedCoordinates);}\n\n\t\t\t\t\treturn fixedCoordinates;\n\t\t\t\t}\n\n\t\t\t\t\/\/CONVERSIONE COORDINATE latlng (EPSG:4326) IN WELL KNOWN TEXT WEB MERKATOR (EPSG:3857)\n\t\t\t\tlatlngToWkt(latlng) {\n\n\t\t\t\t\t\/\/converti coordinate a EPSG:3857\n\t\t\t\t\tconst WebMercatorCoords = this.latlngToWebMercator(latlng);\n\n\t\t\t\t\t\/\/ Assicurati che l'ultimo punto sia uguale al primo per chiudere il poligono\n\t\t\t\t\tif(1==1){\n\t\t\t\t\t\tvar closedCoordinates = [...WebMercatorCoords];\n\t\t\t\t\t\tif (JSON.stringify(WebMercatorCoords[0]) !== JSON.stringify(WebMercatorCoords[WebMercatorCoords.length - 1])) {\n\t\t\t\t\t\t\tclosedCoordinates.push(WebMercatorCoords[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Converti le coordinate in stringhe\n\t\t\t\t\tconst coordinateStrings = closedCoordinates.map(coord => \n\t\t\t\t\t\t`${coord[0].toFixed(4)} ${coord[1].toFixed(4)}`\n\t\t\t\t\t);\n\n\t\t\t\t\t\/\/ Crea la stringa WKT\n\t\t\t\t\treturn `POLYGON((${coordinateStrings.join(', ')}))`;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/CONVERSIONE LAYER IN COORDINATE\n\t\t\t\tlayerToLatlng(layer) {\n\n\t\t\t\t\tif (!layer){if(this.params.logEnabled){console.log('GeoSelector.layerToLatlng: Nessun layer ricevuto'); return null; }}\n\n\t\t\t\t\t\/\/ Marker\n\t\t\t\t\tif (layer instanceof L.Marker) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.layerToLatlng: layer di tipo marker');}\n\t\t\t\t\t\tconst latlng = layer.getLatLng();\n\t\t\t\t\t\treturn [[latlng.lat, latlng.lng]];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Poligoni e Polilinee\n\t\t\t\t\tif (layer.getLatLngs) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.layerToLatlng: layer di tipo multipoligono\/polilinea');}\n\t\t\t\t\t\t\/\/ Gestisce poligoni multilivello (es. poligoni con fori)\n\t\t\t\t\t\tconst latlngCoords = layer.getLatLngs();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/ Caso base: poligono semplice o polilinea\n\t\t\t\t\t\tif (latlngCoords[0] && latlngCoords[0].lat !== undefined) {\n\t\t\t\t\t\t\treturn latlngCoords.map(latlng => [latlng.lat, latlng.lng]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/ Caso di poligoni o polilinee complessi (con possibili anelli interni)\n\t\t\t\t\t\tif (latlngCoords[0] && latlngCoords[0][0] && latlngCoords[0][0].lat !== undefined) {\n\t\t\t\t\t\t\t\/\/ Prendi il primo anello (esterno)\n\t\t\t\t\t\t\treturn latlngCoords[0].map(latlng => [latlng.lat, latlng.lng]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Cerchi\n\t\t\t\t\tif (layer instanceof L.Circle) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.layerToLatlng: layer di tipo cerchio');}\n\t\t\t\t\t\tconst center = layer.getLatLng();\n\t\t\t\t\t\treturn [[center.lat, center.lng]];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Rettangoli\n\t\t\t\t\tif (layer instanceof L.Rectangle) {\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.layerToLatlng: layer di tipo rettangolo');}\n\t\t\t\t\t\tconst bounds = layer.getBounds();\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t[bounds.getSouthWest().lat, bounds.getSouthWest().lng],\n\t\t\t\t\t\t\t[bounds.getNorthEast().lat, bounds.getNorthEast().lng]\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Se non riconosciuto\n\t\t\t\t\tif(this.params.logEnabled){console.error('GeoSelector.layerToLatlng: Tipo di layer non supportato');}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t\/\/VERIFICA SE POLIGONO NE COMPRENDE UN ALTRO, srcLatlng pu\u00f2 essere anche array con solo 1 punto \n\t\t\t\tarePolygonsIntersecting(srcLatlng, dstLatlng) {\n\n\t\t\t\t\tfunction pointInPolygon(point, polygon) {\n\t\t\t\t\t\tlet inside = false;\n\t\t\t\t\t\tconst x = point[0], y = point[1];\n\n\t\t\t\t\t\tfor (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n\t\t\t\t\t\t\tconst xi = polygon[i][0], yi = polygon[i][1];\n\t\t\t\t\t\t\tconst xj = polygon[j][0], yj = polygon[j][1];\n\n\t\t\t\t\t\t\tconst intersect = ((yi > y) !== (yj > y)) &&\n\t\t\t\t\t\t\t\t(x < (xj - xi) * (y - yi) \/ (yj - yi) + xi);\n\n\t\t\t\t\t\t\tif (intersect) inside = !inside;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn inside;\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction linesIntersect(a, b, c, d) {\n\t\t\t\t\t\t\/\/ a, b: punti linea 1; c, d: punti linea 2\n\t\t\t\t\t\tconst denom = (b[0] - a[0]) * (d[1] - c[1]) - (b[1] - a[1]) * (d[0] - c[0]);\n\t\t\t\t\t\tif (Math.abs(denom) < 1e-10) return false; \/\/ Parallele\n\n\t\t\t\t\t\tconst t = ((c[0] - a[0]) * (d[1] - c[1]) - (c[1] - a[1]) * (d[0] - c[0])) \/ denom;\n\t\t\t\t\t\tconst u = ((c[0] - a[0]) * (b[1] - a[1]) - (c[1] - a[1]) * (b[0] - a[0])) \/ denom;\n\n\t\t\t\t\t\treturn t >= 0 && t <= 1 && u >= 0 && u <= 1;\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Controlla se lati si intersecano\n\t\t\t\t\tfor (let i = 0; i < srcLatlng.length - 1; i++) {\n\t\t\t\t\t\tfor (let j = 0; j < dstLatlng.length - 1; j++) {\n\t\t\t\t\t\t\tif (linesIntersect(srcLatlng[i], srcLatlng[i+1], dstLatlng[j], dstLatlng[j+1])) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Caso: src \u00e8 un punto\n\t\t\t\t\tif (srcLatlng.length === 1) {\n\t\t\t\t\t\tconst srcPoint = srcLatlng[0];\n\t\t\t\t\t\treturn dstLatlng.some(dstPoint =>\n\t\t\t\t\t\t\t(Math.abs(dstPoint[0] - srcPoint[0]) < 0.0001 &&\n\t\t\t\t\t\t\tMath.abs(dstPoint[1] - srcPoint[1]) < 0.0001) ||\n\t\t\t\t\t\t\tpointInPolygon(srcPoint, dstLatlng)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Caso normale: controlla punti dentro e coincidenze\n\t\t\t\t\treturn dstLatlng.some(point => \n\t\t\t\t\t\tpointInPolygon(point, srcLatlng) || \n\t\t\t\t\t\tsrcLatlng.some(outerPoint => \n\t\t\t\t\t\t\tMath.abs(point[0] - outerPoint[0]) < 0.0001 && \n\t\t\t\t\t\t\tMath.abs(point[1] - outerPoint[1]) < 0.0001\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t\/\/OTTIENI AREA SELEZIONATA DA UTENTE -> priorit\u00e0 a poligoni\n\t\t\t\tgetCurrentDraw(){\n\n\n\t\t\t\t\tvar latlng = undefined;\n\t\t\t\t\tif(this.polygons.user.length > 0){\n\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.getCurrentDraw: trovato poligono disegnato da utente');}\n\n\t\t\t\t\t\tlatlng = this.polygons.user[0]._latlngs[0];\n\t\t\t\t\t\tlatlng = latlng.map(({ lat, lng }) => ([ lat, lng ]));\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse if(this.polygons.locations.length > 0){\n\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.getCurrentDraw: trovato poligono disegnato da geocoding');}\n\n\t\t\t\t\t\tlatlng = this.polygons.locations[0]._latlngs[0];\n\t\t\t\t\t\tlatlng = latlng.map(({ lat, lng }) => ([ lat, lng ]));\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse if(this.points.user.length > 0){\n\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.getCurrentDraw: trovato punto disegnato da utente');}\n\n\t\t\t\t\t\tlatlng = [this.points.user[0]._latlng];\n\t\t\t\t\t\tlatlng = latlng.map(({ lat, lng }) => ([ lat, lng ]));\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse if(this.points.locations.length > 0){\n\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.getCurrentDraw: trovato punto disegnato da parser coordinate\/geocoding');}\n\n\t\t\t\t\t\tlatlng = [this.points.locations[0]._latlng];\n\t\t\t\t\t\tlatlng = latlng.map(({ lat, lng }) => ([ lat, lng ]));\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.getCurrentDraw: nessun poligono\/punto disegnato');}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn latlng;\n\n\t\t\t\t}\n\n\t\t\t\t\/\/DISEGNA POLIGONO DA WKT PRODOTTO\n\t\t\t\tdrawProductWkt(wktGeometry,targetArray = 'products',removeOthers = true,center = false,zoom = false,bringToFront = false,highlightMarker = false,customIconUrl = null){\n\n\t\t\t\t\tif(this.params.logEnabled){console.log('GeoSelector.drawProductWkt: richiesto disegno prodotto '); }\n\n\t\t\t\t\t\/\/rimuovi geometrie precedenti\n\t\t\t\t\tif(removeOthers){\n\t\t\t\t\t\tthis.removeAllPolygons([targetArray]);\n\t\t\t\t\t\tthis.removeAllPoints([targetArray]);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar latlng = this.wktToLatlng(wktGeometry,3857); \/\/conversione wkt->latlng\n\n\t\t\t\t\tif(latlng.length < 2){ \/\/disegna punto\n\n\t\t\t\t\t\tif(this.params.logEnabled && highlightMarker){console.log('GeoSelector.drawProductWkt: richiesta evidenziazione marker '); }\n\t\t\t\t\t\tthis.drawPoint(latlng,targetArray,center,zoom,highlightMarker,customIconUrl);\n\n\t\t\t\t\t}\n\n\t\t\t\t\telse{ \/\/disegna poligono\n\n\t\t\t\t\t\tthis.drawPolygon(latlng,targetArray,center,zoom,bringToFront);\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\/\/ DISEGNA LAYER DI CATEGORIA\/ATTRIBUTO DA ARRAY DI PUNTI WKT | se poligoni viene estratto centroide\n\t\t\t\tdrawCatLayerPoints(wktArray = [],p_iconUrl = undefined,p_iconSize=[25, 41],p_iconAnchor = [6,6]){\n\t\t\t\t\t\n\t\t\t\t\tif(p_iconUrl == undefined){p_iconUrl = this.params.marker.url;} \/\/todo:estrarre epsg da wkt\n\t\t\t\t\t\n\t\t\t\t\tvar features = wktArray.map(wktString => {\n\t\t\t\t\t\tvar coordsArray = this.wktToLatlng(wktString, 3857);\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar firstCoords = null;\n\t\t\t\t\t\tif(coordsArray.length == 1){ firstCoords = coordsArray[0]; } \/\/ se punto: Estrai il primo array [lat, lng]\n\t\t\t\t\t\telse{ firstCoords = this.getCoordsArrayCentroid(coordsArray); } \/\/ se poligono: ottieni array delle coordinate centrali\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\t\t\tgeometry: {\n\t\t\t\t\t\t\t\ttype: 'Point',\n\t\t\t\t\t\t\t\tcoordinates: [firstCoords[1], firstCoords[0]] \/\/ [lng, lat] per GeoJSON\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tproperties: {} \/\/ Aggiungi propriet\u00e0 se necessarie\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\tvar geoJsonData = {\n\t\t\t\t\t\ttype: 'FeatureCollection',\n\t\t\t\t\t\tfeatures: features\n\t\t\t\t\t};    \n\n\t\t\t\t\tvar customIcon = L.icon({\n\t\t\t\t\t  iconUrl: p_iconUrl,\n\t\t\t\t\t  iconSize: p_iconSize,\n\t\t\t\t\t  iconAnchor: p_iconAnchor,\n\t\t\t\t\t  popupAnchor: [0, -6]\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/ Crea gruppo cluster con opzioni per prestazioni\n\t\t\t\t\tvar markers = L.markerClusterGroup({\n\t\t\t\t\t\tshowCoverageOnHover: false,  \/\/ Nessun confine al hover\n\t\t\t\t\t\tdisableClusteringAtZoom: 11,  \/\/ Non clusterizza oltre zoom 16\n\t\t\t\t\t\tmaxClusterRadius: 50,  \/\/ Raggio ridotto per meno raggruppamento\n\t\t\t\t\t\tspiderfyOnMaxZoom: false  \/\/ Disabilita espansione a zoom massimo\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/ Aggiungi punti al cluster\n\t\t\t\t\tL.geoJSON(geoJsonData, {\n\t\t\t\t\t\tpointToLayer: function(feature, latlng) {\n\t\t\t\t\t\t\treturn L.marker(latlng, {icon: customIcon});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonEachFeature: function(feature, layer) {\n\t\t\t\t\t\t\tmarkers.addLayer(layer);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/ Aggiungi alla mappa e salva in layers\n\t\t\t\t\tthis.polygons.layers.push( markers.addTo(this.map) );\n\n\t\t\t\t\t\/\/ DEPRECATO: AGGIUNGI PUNTO PER PUNTO\n\t\t\t\t\t\/\/ for(var wktPoint of wktPoints){ this.drawProductWkt(wktPoint,'layers',false,false,false,false,false,null); }\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\/\/ DISEGNA LAYER DI CATEGORIA\/ATTRIBUTO DA ARRAY DI POLIGONI WKT\n\t\t\t\tdrawCatLayerPolygons(wktArray = [], p_iconUrl = undefined) {\n\t\t\t\t\t\n\t\t\t\t\ttry{\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (p_iconUrl == undefined) { p_iconUrl = this.params.marker.url; }\n\n\n\t\t\t\t\t\t\/\/console.error(wktArray);\n\t\t\t\t\t\t\/\/console.error(p_iconUrl);\n\n\t\t\t\t\t\tconst self = this;\n\n\t\t\t\t\t\t\/\/ Pre-calcola tutti i bounds come L.LatLngBounds\n\t\t\t\t\t\tconst allBounds = wktArray.map(wktString => {\n\t\t\t\t\t\t\tconst coordsArray = self.wktToLatlng(wktString, 3857);\n\t\t\t\t\t\t\tconst invertedCoordsArray = coordsArray.map(([lat, lng]) => [lng, lat]);\n\t\t\t\t\t\t\tconst rawBounds = self.getPolygonBounds([invertedCoordsArray]);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tbounds: L.latLngBounds(rawBounds[0], rawBounds[1]),\n\t\t\t\t\t\t\t\tcoords: invertedCoordsArray\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/ Se p_iconUrl \u00e8 false, usa poligoni colorati [DEPRECATA, NO BORDER]\n\t\t\t\t\t\tif (1==0 && (p_iconUrl == false || p_iconUrl == 'false')) {\n\t\t\t\t\t\t\tconst colors = igmGeoSelector.mapSearch.geoSelector.params.polygonColors.layer;\n\n\t\t\t\t\t\t\tconst CanvasPolygonLayer = L.Layer.extend({\n\n\t\t\t\t\t\t\t\tinitialize: function(data, colors) {\n\t\t\t\t\t\t\t\t\tthis._data = data;\n\t\t\t\t\t\t\t\t\tthis._colors = colors;\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonAdd: function(map) {\n\t\t\t\t\t\t\t\t\tthis._map = map;\n\t\t\t\t\t\t\t\t\tthis._canvas = L.DomUtil.create('canvas', 'leaflet-layer');\n\t\t\t\t\t\t\t\t\tthis._canvas.style.position = 'absolute';\n\t\t\t\t\t\t\t\t\tthis._canvas.style.pointerEvents = 'none';\n\n\t\t\t\t\t\t\t\t\t\/\/ Crea un pane personalizzato sopra i tile ma sotto overlay\n\t\t\t\t\t\t\t\t\tif (!map.getPane('customTileOverlay')) {\n\t\t\t\t\t\t\t\t\t\tmap.createPane('customTileOverlay');\n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.zIndex = 3;  \n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.position = 'absolute';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tmap.getPanes().customTileOverlay.appendChild(this._canvas);\n\n\t\t\t\t\t\t\t\t\tmap.on('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t\tthis._redraw();\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonRemove: function(map) {\n\t\t\t\t\t\t\t\t\tL.DomUtil.remove(this._canvas);\n\t\t\t\t\t\t\t\t\tmap.off('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t_redraw: function() {\n\t\t\t\t\t\t\t\t\tconst map = this._map;\n\t\t\t\t\t\t\t\t\tconst size = map.getSize();\n\t\t\t\t\t\t\t\t\tconst topLeft = map.containerPointToLayerPoint([0, 0]);\n\n\t\t\t\t\t\t\t\t\tthis._canvas.width = size.x;\n\t\t\t\t\t\t\t\t\tthis._canvas.height = size.y;\n\t\t\t\t\t\t\t\t\tL.DomUtil.setPosition(this._canvas, topLeft);\n\n\t\t\t\t\t\t\t\t\tconst ctx = this._canvas.getContext('2d');\n\t\t\t\t\t\t\t\t\tctx.clearRect(0, 0, size.x, size.y);\n\n\t\t\t\t\t\t\t\t\tconst mapBounds = map.getBounds();\n\n\t\t\t\t\t\t\t\t\t\/\/ Filtra poligoni visibili\n\t\t\t\t\t\t\t\t\tconst visibleData = this._data.filter(item => mapBounds.intersects(item.bounds));\n\n\t\t\t\t\t\t\t\t\tif (visibleData.length === 0) return;\n\n\t\t\t\t\t\t\t\t\t\/\/ crea una maschera unica di tutti i poligoni (opaca)\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t\tctx.fillStyle = '#000';  \/\/ Colore temporaneo opaco\n\n\t\t\t\t\t\t\t\t\tvisibleData.forEach(item => {\n\t\t\t\t\t\t\t\t\t\tconst points = item.coords.map(coord => map.latLngToContainerPoint([coord[1], coord[0]]));\n\n\t\t\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tctx.lineTo(points[i].x, points[i].y);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\t\t\t\tctx.fill();\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\/\/ applica trasparente solo dove c'\u00e8 gi\u00e0 qualcosa\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-in';\n\t\t\t\t\t\t\t\t\tctx.fillStyle = this._colors.fill;\n\t\t\t\t\t\t\t\t\tctx.fillRect(0, 0, size.x, size.y);\n\n\t\t\t\t\t\t\t\t\t\/\/ Tdisegna i bordi\n\t\t\t\t\t\t\t\t\tif (this._colors.line) {\n\t\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t\t\tctx.strokeStyle = this._colors.line;\n\t\t\t\t\t\t\t\t\t\tctx.lineWidth = 2;\n\n\t\t\t\t\t\t\t\t\t\tvisibleData.forEach(item => {\n\t\t\t\t\t\t\t\t\t\t\tconst points = item.coords.map(coord => map.latLngToContainerPoint([coord[1], coord[0]]));\n\n\t\t\t\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tctx.lineTo(points[i].x, points[i].y);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst canvasLayer = new CanvasPolygonLayer(allBounds, colors);\n\t\t\t\t\t\t\tcanvasLayer.addTo(self.map);\n\t\t\t\t\t\t\tself.polygons.layers.push(canvasLayer);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/ Se p_iconUrl \u00e8 false, usa poligoni colorati\n\t\t\t\t\t\tif (p_iconUrl == false || p_iconUrl == 'false') {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tconst colors = igmGeoSelector.mapSearch.geoSelector.params.polygonColors.layer;\n\n\t\t\t\t\t\t\t\/\/ Assicurati che colors contenga sia fill che line\n\t\t\t\t\t\t\tconst layerColors = {\n\t\t\t\t\t\t\t\tfill: colors.fill || 'rgba(0, 123, 255, 0.4)',\n\t\t\t\t\t\t\t\tline: colors.line || null\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst CanvasPolygonLayer = L.Layer.extend({\n\n\t\t\t\t\t\t\t\tinitialize: function(data, colors) {\n\t\t\t\t\t\t\t\t\tthis._data = data;\n\t\t\t\t\t\t\t\t\tthis._colors = colors;\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonAdd: function(map) {\n\t\t\t\t\t\t\t\t\tthis._map = map;\n\t\t\t\t\t\t\t\t\tthis._canvas = L.DomUtil.create('canvas', 'leaflet-layer');\n\t\t\t\t\t\t\t\t\tthis._canvas.style.position = 'absolute';\n\t\t\t\t\t\t\t\t\tthis._canvas.style.pointerEvents = 'none';\n\n\t\t\t\t\t\t\t\t\t\/\/ Crea un pane personalizzato sopra i tile ma sotto overlay\n\t\t\t\t\t\t\t\t\tif (!map.getPane('customTileOverlay')) {\n\t\t\t\t\t\t\t\t\t\tmap.createPane('customTileOverlay');\n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.zIndex = 3;  \n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.position = 'absolute';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tmap.getPanes().customTileOverlay.appendChild(this._canvas);\n\n\t\t\t\t\t\t\t\t\tmap.on('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t\tthis._redraw();\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonRemove: function(map) {\n\t\t\t\t\t\t\t\t\tL.DomUtil.remove(this._canvas);\n\t\t\t\t\t\t\t\t\tmap.off('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t_redraw: function() {\n\t\t\t\t\t\t\t\t\tconst map = this._map;\n\t\t\t\t\t\t\t\t\tconst size = map.getSize();\n\t\t\t\t\t\t\t\t\tconst topLeft = map.containerPointToLayerPoint([0, 0]);\n\n\t\t\t\t\t\t\t\t\tthis._canvas.width = size.x;\n\t\t\t\t\t\t\t\t\tthis._canvas.height = size.y;\n\t\t\t\t\t\t\t\t\tL.DomUtil.setPosition(this._canvas, topLeft);\n\n\t\t\t\t\t\t\t\t\tconst ctx = this._canvas.getContext('2d');\n\t\t\t\t\t\t\t\t\tctx.clearRect(0, 0, size.x, size.y);\n\n\t\t\t\t\t\t\t\t\tconst mapBounds = map.getBounds();\n\n\t\t\t\t\t\t\t\t\t\/\/ Filtra poligoni visibili\n\t\t\t\t\t\t\t\t\tconst visibleData = this._data.filter(item => mapBounds.intersects(item.bounds));\n\n\t\t\t\t\t\t\t\t\tif (visibleData.length === 0) return;\n\n\t\t\t\t\t\t\t\t\t\/\/ Crea una maschera unica di tutti i poligoni (opaca)\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t\tctx.fillStyle = '#000';  \/\/ Colore temporaneo opaco\n\n\t\t\t\t\t\t\t\t\tvisibleData.forEach(item => {\n\t\t\t\t\t\t\t\t\t\tconst points = item.coords.map(coord => map.latLngToContainerPoint([coord[1], coord[0]]));\n\n\t\t\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tctx.lineTo(points[i].x, points[i].y);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\t\t\t\tctx.fill();\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\/\/ Applica trasparenza solo dove c'\u00e8 gi\u00e0 qualcosa\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-in';\n\t\t\t\t\t\t\t\t\tctx.fillStyle = this._colors.fill;\n\t\t\t\t\t\t\t\t\tctx.fillRect(0, 0, size.x, size.y);\n\n\t\t\t\t\t\t\t\t\t\/\/ Disegna i bordi (contorni) dei poligoni\n\t\t\t\t\t\t\t\t\tif (this._colors.line) {\n\t\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t\t\tctx.strokeStyle = this._colors.line;\n\t\t\t\t\t\t\t\t\t\tctx.lineWidth = 2;\n\n\t\t\t\t\t\t\t\t\t\tvisibleData.forEach(item => {\n\t\t\t\t\t\t\t\t\t\t\tconst points = item.coords.map(coord => map.latLngToContainerPoint([coord[1], coord[0]]));\n\n\t\t\t\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tctx.lineTo(points[i].x, points[i].y);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tctx.globalCompositeOperation = 'source-over';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst canvasLayer = new CanvasPolygonLayer(allBounds, layerColors);\n\t\t\t\t\t\t\tcanvasLayer.addTo(self.map);\n\t\t\t\t\t\t\tself.polygons.layers.push(canvasLayer);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/ Altrimenti usa immagini\n\t\t\t\t\t\tconst img = new Image();\n\t\t\t\t\t\timg.src = p_iconUrl;\n\n\t\t\t\t\t\timg.onload = function() {\n\n\t\t\t\t\t\t\tconst CanvasImageLayer = L.Layer.extend({\n\n\t\t\t\t\t\t\t\tinitialize: function(data, image) {\n\t\t\t\t\t\t\t\t\tthis._data = data;\n\t\t\t\t\t\t\t\t\tthis._image = image;\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonAdd: function(map) {\n\t\t\t\t\t\t\t\t\tthis._map = map;\n\t\t\t\t\t\t\t\t\tthis._canvas = L.DomUtil.create('canvas', 'leaflet-layer');\n\t\t\t\t\t\t\t\t\tthis._canvas.style.position = 'absolute';\n\t\t\t\t\t\t\t\t\tthis._canvas.style.pointerEvents = 'none';\n\n\t\t\t\t\t\t\t\t\t\/\/ Crea un pane personalizzato sopra i tile ma sotto overlay\n\t\t\t\t\t\t\t\t\tif (!map.getPane('customTileOverlay')) {\n\t\t\t\t\t\t\t\t\t\tmap.createPane('customTileOverlay');\n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.zIndex = 3;  \n\t\t\t\t\t\t\t\t\t\tmap.getPane('customTileOverlay').style.position = 'absolute';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tmap.getPanes().customTileOverlay.appendChild(this._canvas);\n\n\t\t\t\t\t\t\t\t\tmap.on('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t\tthis._redraw();\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonRemove: function(map) {\n\t\t\t\t\t\t\t\t\tL.DomUtil.remove(this._canvas);\n\t\t\t\t\t\t\t\t\tmap.off('moveend zoomend resize', this._redraw, this);\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t_redraw: function() {\n\t\t\t\t\t\t\t\t\tconst map = this._map;\n\t\t\t\t\t\t\t\t\tconst size = map.getSize();\n\t\t\t\t\t\t\t\t\tconst topLeft = map.containerPointToLayerPoint([0, 0]);\n\n\t\t\t\t\t\t\t\t\tthis._canvas.width = size.x;\n\t\t\t\t\t\t\t\t\tthis._canvas.height = size.y;\n\t\t\t\t\t\t\t\t\tL.DomUtil.setPosition(this._canvas, topLeft);\n\n\t\t\t\t\t\t\t\t\tconst ctx = this._canvas.getContext('2d');\n\t\t\t\t\t\t\t\t\tctx.clearRect(0, 0, size.x, size.y);\n\n\t\t\t\t\t\t\t\t\tconst mapBounds = map.getBounds();\n\n\t\t\t\t\t\t\t\t\tthis._data.forEach(function(item) {\n\t\t\t\t\t\t\t\t\t\tif (!mapBounds.intersects(item.bounds)) return;\n\n\t\t\t\t\t\t\t\t\t\tconst nw = map.latLngToContainerPoint(item.bounds.getNorthWest());\n\t\t\t\t\t\t\t\t\t\tconst se = map.latLngToContainerPoint(item.bounds.getSouthEast());\n\t\t\t\t\t\t\t\t\t\tconst width = se.x - nw.x;\n\t\t\t\t\t\t\t\t\t\tconst height = se.y - nw.y;\n\n\t\t\t\t\t\t\t\t\t\tif (width > 0 && height > 0) {\n\t\t\t\t\t\t\t\t\t\t\tctx.drawImage(this._image, nw.x, nw.y, width, height);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst canvasLayer = new CanvasImageLayer(allBounds, img);\n\t\t\t\t\t\t\tcanvasLayer.addTo(self.map);\n\t\t\t\t\t\t\tself.polygons.layers.push(canvasLayer);\n\t\t\t\t\t\t};\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.params.logEnabled){ console.error(e); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\/\/ Funzione per calcolare bounds da un poligono\n\t\t\t\tgetPolygonBounds(coords) {\n\t\t\t\t\t\/\/ coords \u00e8 [[[lng, lat], ...]] per GeoJSON Polygon\n\t\t\t\t\tlet flatCoords = coords[0];  \/\/ Prendi il primo anello (senza buchi)\n\t\t\t\t\tlet lats = flatCoords.map(c => c[1]);  \/\/ lat \u00e8 il secondo elemento\n\t\t\t\t\tlet lngs = flatCoords.map(c => c[0]);  \/\/ lng \u00e8 il primo\n\t\t\t\t\treturn [[Math.min(...lats), Math.min(...lngs)], [Math.max(...lats), Math.max(...lngs)]];\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\/\/ottieni centro di un array di coordinate\n\t\t\t\tgetCoordsArrayCentroid(coordsArray) {\n\t\t\t\t\t\/\/ Copia l'array per non modificare l'originale\n\t\t\t\t\tlet coords = [...coordsArray];\n\n\t\t\t\t\t\/\/ Rimuovi l'ultimo punto se uguale al primo (poligono chiuso)\n\t\t\t\t\tif (coords.length > 1 &&\n\t\t\t\t\t\tcoords[0][0] === coords[coords.length - 1][0] &&\n\t\t\t\t\t\tcoords[0][1] === coords[coords.length - 1][1]) {\n\t\t\t\t\t\tcoords.pop();\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/ Se \u00e8 un singolo punto, restituiscilo direttamente\n\t\t\t\t\tif (coords.length === 1) {\n\t\t\t\t\t\treturn coords[0];\n\t\t\t\t\t}\n\n\t\t\t\t\tlet latSum = 0, lngSum = 0, count = coords.length;\n\t\t\t\t\tcoords.forEach(coord => {\n\t\t\t\t\t\tlatSum += coord[0];  \/\/ lat\n\t\t\t\t\t\tlngSum += coord[1];  \/\/ lng\n\t\t\t\t\t});\n\n\t\t\t\t\treturn [latSum \/ count, lngSum \/ count];\n\t\t\t\t}\n\n\t\t\t\t\/\/conversione punto a intorno (poligono)\n\t\t\t\tlatlngPoint2latlngPolygon(pointLatlng,offset = 0.0001) {\n\n\t\t\t\t\tvar latitude = parseFloat(pointLatlng[0][0]);\n\t\t\t\t\tvar longitude = parseFloat(pointLatlng[0][1]);\n\t\t\t\t\n\t\t\t\t\treturn [\n\t\t\t\t\t\t[latitude - offset, longitude - offset], \/\/ Bottom-left corner\n\t\t\t\t\t\t[latitude + offset, longitude - offset], \/\/ Bottom-right corner\n\t\t\t\t\t\t[latitude + offset, longitude + offset], \/\/ Top-right corner\n\t\t\t\t\t\t[latitude - offset, longitude + offset]  \/\/ Top-left corner\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\/\/mostra\/nascondi tutti i layer\/canvas , tranne tiles\n\t\t\t\ttoggleLayers(hide = true) {\n\t\t\t\t\tthis.map.eachLayer(function(layer) {\n\t\t\t\t\t\tif (layer._tiles) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (layer._canvas) {\n\t\t\t\t\t\t\t\/\/ Layer con canvas personalizzato\n\t\t\t\t\t\t\tlayer._canvas.style.display = hide ? 'none' : '';\n\t\t\t\t\t\t} else if (layer._image) {\n\t\t\t\t\t\t\t\/\/ Image overlay\n\t\t\t\t\t\t\tlayer._image.style.display = hide ? 'none' : '';\n\t\t\t\t\t\t} else if (layer.setOpacity) {\n\t\t\t\t\t\t\t\/\/ Layer che supportano setOpacity (tile, etc.)\n\t\t\t\t\t\t\tlayer.setOpacity(hide ? 0 : 1);\n\t\t\t\t\t\t} else if (layer._container) {\n\t\t\t\t\t\t\t\/\/ Altri layer (marker, etc.): nascondi container\n\t\t\t\t\t\t\tlayer._container.style.display = hide ? 'none' : '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\/\/ Ignora layer senza container (come controlli)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/LOG SPOSTAMENTO TILES\n\t\t\t\tlogTiles() {\n\t\t\t\t\tvar zoom = this.map.getZoom();\n\t\t\t\t\tvar center = this.map.getCenter();\n\t\t\t\t\tvar tileCoords = this.latlngToTile(center.lat, center.lng, zoom);\n\t\t\t\t\tif(this.params.logEnabled){console.log(`GeoSelector.logTiles: Tile X: ${tileCoords.x}, Y: ${tileCoords.y}, Zoom: ${zoom}`);}\n\t\t\t\t}\n\n\t\t\t\t\/\/LOG COORDINATE DI UN BOUND\n\t\t\t\tlogCoordinates(bounds) {\n\t\t\t\t\tconsole.log(\"GeoSelector.logCoordinates: Coordinate del rettangolo selezionato:\");\n\t\t\t\t\tconsole.log(\"GeoSelector.logCoordinates: Latitudine inferiore: \" + bounds.getSouth());\n\t\t\t\t\tconsole.log(\"GeoSelector.logCoordinates: Longitudine inferiore: \" + bounds.getWest());\n\t\t\t\t\tconsole.log(\"GeoSelector.logCoordinates: Latitudine superiore: \" + bounds.getNorth());\n\t\t\t\t\tconsole.log(\"GeoSelector.logCoordinates: Longitudine superiore: \" + bounds.getEast());\n\t\t\t\t\t\n\t\t\t\t}\t\n\n\t\t\t\t\/\/TEST AREA SELECTOR (bugfix selettore area non allineato)\n\t\t\t\ttestAreaSelector(){\n\t\t\t\t\tthis.isAreaTesting = true;\n\t\t\t\t\tthis.polygonDrawer();\n\t\t\t\t\twindow.setTimeout(async ()=>{\n\t\t\t\t\t\tdocument.querySelector('#' + this.mapId).dispatchEvent(new MouseEvent('click', { bubbles: true }));\n\t\t\t\t\t\tthis.removeAllPolygons();\n\t\t\t\t\t\tthis.map.setView( this.params.tileServerEndpoint.centerCoordinates, this.params.tileServerEndpoint.minZoom );\n\t\t\t\t\t\twindow.setTimeout(async ()=>{ this.isAreaTesting = false; },200);\n\t\t\t\t\t}, 300);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\t\t\t\n\t\t\t\n\t\t<\/script>\n\n\t\t\n\t\t\t\t\t\t\t\n\t\t\n\n\t\t<script>\n\n\n\n\t\t\tclass CssPopup{\n\n\n\t\t\t\tconstructor(wrapperId='cssPopup',params={},texts = {}){\n\n\t\t\t\t\tthis.wrapperId = wrapperId;\n\t\t\t\t\tthis.popup = document.getElementById(this.wrapperId);\n                    \n                    this.texts = {\n                        'buttonOpen': texts.buttonOpen ?? 'apri popup'\n                        ,'buttonClose': texts.buttonClose ?? 'chiudi popup'\n                        ,'title': texts.title ?? 'popup'\n                        ,'description': texts.description ?? 'Lorem ipsum dolor sit amet'\n                    };\n\n                    this.params={\n\n                        'logEnabled': params.logEnabled ?? false\n                        ,'customTriggerId': params.customTriggerId ?? 'noCustomTriggerId'\n\n                    };\n\n                    this.buttonOpen = document.querySelector('#' + this.params.customTriggerId);\n\n                    if(this.buttonOpen == undefined){\n\n                        this.buttonOpen = document.createElement('button');\n                        this.buttonOpen.innerText= this.texts.buttonOpen;\n                        this.buttonOpen.type = 'button';\n                        this.buttonOpen.classList.add('cssPopup_btn');\n                        this.popup.after(this.buttonOpen);\n\n\n                    }\n\n                    this.popup.classList.add('cssPopup_popup');\n                    this.popup.setAttribute('tabindex','0');\n                    \n                    this.overlay = document.createElement('div');\n                    this.overlay.classList.add('cssPopup_overlay');\n                    this.popup.after(this.overlay);\n\n                    this.toolbar = document.createElement('div');\n                    this.toolbar.classList.add('cssPopup_toolbar');\n\n                    this.toolbarTitle = document.createElement('div');\n                    this.toolbarTitle.classList.add('cssPopup_title');\n                    this.toolbarTitle.innerText = this.texts.title;\n                    this.toolbar.appendChild(this.toolbarTitle);\n\n                    this.buttonClose = document.createElement('button');\n                    this.buttonClose.classList.add('cssPopup_btn');\n                    this.buttonClose.innerText = this.texts.buttonClose;\n                    this.toolbar.appendChild(this.buttonClose);\n\n                    this.description = document.createElement('div');\n                    this.description.classList.add('cssPopup_description');\n                    this.description.innerText = this.texts.description;\n                    if(this.texts.description.length > 0){ this.popup.prepend(this.description); }\n\n                    this.popup.prepend(this.toolbar);\n\n                    \n\n                    this.onOpen = ()=>{ return true; } \/\/operazioni pre apertura\n                    this.onClose = ()=>{ return true; } \/\/operazioni post chiusura\n\n\n                    this.close();\n                    \n\n                    this.buttonOpen.addEventListener('click',()=>{\n\n                        this.open();\n                        this.buttonOpen.blur();\n                        this.popup.focus();\n\n                    });\n\n                    this.buttonClose.addEventListener('click',()=>{\n\n\n                        this.close();\n                        this.buttonClose.blur();\n\n                    });\n\n                    this.overlay.addEventListener('click',()=>{\n\n\n                        this.close();\n                        this.buttonClose.blur();\n\n                    });\n\n\n\t\t\t\t\t\n\t\t\t\t}\n\n                isOpen(){\n\n                    return this.popup.classList.contains('cssPopup_open') ? true : false;\n\n                }\n\n                open(){\n\n                    this.onOpen();\n\n                    this.popup.classList.remove('cssPopup_closed');\n                    this.popup.classList.add('cssPopup_open');\n\n                    this.overlay.classList.remove('cssPopup_closed');\n                    this.overlay.classList.add('cssPopup_open');\n\n                }\n\n                close(){\n                    this.popup.classList.remove('cssPopup_open');\n                    this.popup.classList.add('cssPopup_closed');\n\n                    this.overlay.classList.remove('cssPopup_open');\n                    this.overlay.classList.add('cssPopup_closed');\n\n                    this.onClose();\n                }\n\n                toggle(){\n\n                    if(this.isOpen){this.close();}\n                    else{this.open();}\n\n                }\n\n                setOnOpen(fn = ()=>{return true;}){\n\n                    this.onOpen = fn;\n\n                }\n\n                setOnClose(fn = ()=>{return true;}){\n\n                    this.onClose = fn;\n\n                }\n\n\t\t\t}\n\n\t\t\t\t\n\t<\/script>\n\n\t\t\n\t\t\t\t\t\t\t\n\t\t<script>\n\t\t\t\n\t\t\/\/utility pausa\/abort fetch generica\n\t\t\/\/definizione fetch: await fetch(url, { headers: { \/* ... *\/ }, signal: fetchController.signal });\n\t\t\/\/necessario nel loop, prima della fetch: await this.ctrlFetchProducts.checkPause();\n\t\t\/\/necessario nel loop, subito dopo la fetch: if(this.ctrlFetchProducts.aborted){break;}\n\t\t\/\/uso: fetchController .pause(); | .resume(); | .abort();\n\t\tclass FetchController{\n\t\t\t\n\t\t\tconstructor(name = 'standard fetchController'){\n\t\t\t\t\n\t\t\t\tthis.name = name;\n\t\t\t\tthis.paused = false;\n\t\t\t\tthis.aborted = false;\n\t\t\t\tthis.resumeResolve = null;\n\t\t\t\tthis.abortController = new AbortController();\n\t\t\t\t\n\t\t\t\tthis.onAbort = ()=>{};\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tpause(){ this.paused = true; }\n\t\t\tresume(){ this.paused = false; if (this.resumeResolve) { this.resumeResolve(); this.resumeResolve = null; } }\n\t\t\treset(){ this.paused = false; this.aborted = false; this.resumeResolve = null; this.abortController = new AbortController(); }\n\t\t\tasync checkPause(){   if (this.paused) { await new Promise(resolve => { this.resumeResolve = resolve; }); } }\n\t\t\tget signal() { return this.abortController.signal; }\n\t\t\t\/\/get aborted() {return this.abortController.signal.aborted; }\n\t\t\tabort(comment = null){\n\t\t\t\tcomment = comment ?? 'aborting '+this.name; \n\t\t\t\tthis.abortController.abort(comment); \n\t\t\t\tthis.aborted = true;\n\t\t\t\tthis.onAbort(); \n\t\t\t\tthis.reset();\n\t\t\t}\n\t\t\t\n\t\t\tsetOnAbort(fn = ()=>{}){ this.onAbort = fn; }\n\t\t\t\n\t\t}\n\t\t\t\n\t\t\t\n\t\tclass ProductsList{\n\n\t\t\tconstructor( resWrapId = 'geoselector_res_els', params = {}, texts = {},  ){\n\t\t\t\t\n\t\t\t\tthis.timeoutMsgResetMS = 4000;\n\t\t\t\tthis.timeoutMsgReset = null;\n\n\t\t\t\tthis.isInitializing = true;\n                this.resWrapId = resWrapId;\n                this.resWrap = document.getElementById(this.resWrapId);\n\t\t\t\tif(this.resWrap == undefined){throw new Error(`ProductsList.constructor: elemento non trovato: ${resWrapId}`);}\n                \n                this.texts = {\n\n                    'noResult':  texts.noResult ?? 'Nessun Risultato',\n                    'startSearch':  texts.startSearch ?? 'Effettua una ricerca per visualizzare i risultati',\n\t\t\t\t\t'loadingSearch':  texts.loadingSearch ?? 'Ricerca in corso, attendere.',\n\t\t\t\t\t'loadingCollection':  texts.loadingCollection ?? 'Caricamento strisciata...',\n\t\t\t\t\t'loading': texts.loading ?? 'Caricamento\u2026',\n\t\t\t\t\t'all': texts.all ?? 'Tutto',\n\t\t\t\t\t'selectVariation': texts.selectVariation ?? 'Seleziona variazione',\n\t\t\t\t\t'selectCategory': texts.selectCategory ?? 'Seleziona categoria',\n\t\t\t\t\t'selectsAttribute': texts.selectsAttribute ?? [{'idAttribute':0,'text':'Seleziona attributo'}],\n\t\t\t\t\t'filtersSubmit' : texts.filtersSubmit ?? 'Effettua Ricerca',\n\t\t\t\t\t'filtersReset' : texts.filtersReset ?? 'Reset',\n\t\t\t\t\t'showProductGeometry' : texts.showProductGeometry ?? 'Visualizza su Mappa',\n\t\t\t\t\t'addToCart' : texts.addToCart ?? 'Aggiungi al Carrello',\n\t\t\t\t\t'resetResult' : texts.resetResult ?? 'Reset in corso, attendere.',\n\t\t\t\t\t'addonNoCart' : texts.addonNoCart ?? 'Variante non acquistabile.',\n\t\t\t\t\t'lowQualityImage' : texts.lowQualityImage ?? 'ANTEPRIMA A BASSA RISOLUZIONE DEL FILE ORIGINALE E COPERTA DA FILIGRANA',\n\t\t\t\t\t'detailSelectedVariation' : texts.detailSelectedVariation ?? 'Tipologia'\n   \n                };\n\n                this.params = {\n\n\t\t\t\t\t'logEnabled' : params.logEnabled ?? true,\n\n                    'idProductTag' : params.idProductTag ?? 356,\n\t\t\t\t\t'filterCatInGeometry' :  params.filterCatInGeometry ?? false,\n\t\t\t\t\t'filterAttrInGeometry' : params.filterAttrInGeometry ?? false,\n\n\t\t\t\t\t'WooCommerceAPIKey' : {\n                        'key' :  params.WooCommerceAPIKey?.key ?? undefined,\n                        'secret' : params.WooCommerceAPIKey?.secret ?? undefined\n                    },\n\n\t\t\t\t\t'resultsPerPage' : params.resultsPerPage ?? 10,\n\t\t\t\t\t'backgroundLoadCallsLimit' : params.backgroundLoadCallsLimit ?? 20,\n\t\t\t\t\t'backgroundLoadTriesLimit' : params.backgroundLoadTriesLimit ?? 20,\n\n\t\t\t\t\t'filterAttributes' : params.filterAttributes ?? [\n\n\t\t\t\t\t\t{'id':13,'name':'anno','slug':'pa_anno','idLinkedCategory':175,'required':true}\n\n\t\t\t\t\t],\n\n\t\t\t\t\t'filterAddons' : params.filterAddons ?? [\n\n\t\t\t\t\t\t{'idAddon':34,'idAddonCategory':214,'slug':'tecnica_variazioni_formato_foto_aerea','idLinkedCategory':175,'noCartIndexes':[]}\n\n\n\t\t\t\t\t],\n\n\t\t\t\t\t'filterCategories' : params.filterCategories ?? [\n\n\t\t\t\t\t\t{'id':175,'slug':'foto-aeree'}\n\n\n\t\t\t\t\t],\n\n\t\t\t\t\t'productListAttributeSlugs':params.productListAttributeSlugs ?? [\n\n\t\t\t\t\t\t{'slug':'anno','idLinkedCategory':175}\n\t\t\t\t\t\t\n\t\t\t\t\t],\n\t\t\t\t\t\n\t\t\t\t\t'layerCategories':params.layerCategories ?? [],\n\n\t\t\t\t\t'icons' : {\n\n\t\t\t\t\t\t'showProductGeometry' : params.icons.ShowProductGeometry ?? '\ud83d\uddfa\ufe0f',\n\t\t\t\t\t\t'addToCart' : params.icons.addToCart ?? '\ud83d\uded2',\n\n\t\t\t\t\t},\n\n                };\n\t\t\t\t\n\t\t\t\tthis.ctrlFetchProducts = new FetchController('ctrlFetchProducts');\n\t\t\t\tthis.ctrlFetchProducts.setOnAbort(()=>{ this.isBackgroundLoading = false; });\n\t\t\t\tthis.ctrlFetchCategoryHasProducts = new FetchController('ctrlFetchCategoryHasProducts');\n\t\t\t\tthis.ctrlFetchAttributeValueHasProducts = new FetchController('ctrlFetchAttributeValueHasProducts');\n\t\t\t\tthis.ctrlFetchCollectionProducts = new FetchController('ctrlFetchCollectionProducts');\n\t\t\t\tthis.ctrlFetchTemp = new FetchController('ctrlFetchTemp');\n\t\t\t\t\n\n                \/\/temporaneo: clona risultato modello; TODO: creazione dinamica js\n\t\t\t\tthis.res = this.resWrap.querySelector('.geoselector_res_el');\n\t\t\t\tthis.res.remove();\n\t\t\t\tthis.res = this.res.cloneNode(true);\n\t\t\t\tthis.setMsg(this.texts.startSearch);\n\t\t\t\t\t\n\n                this.onListProducts = ()=>{ return true; } \/\/operazioni pre listing\n                this.onProductAdded = (addedProd = undefined)=>{ return true; } \/\/operazioni post prodotto aggiunto a lista\n               \n                this.onProductDrawRequest =  async (addedProd = undefined)=>{return true;} \/\/operazioni a richiesta disegno geometrie (button)\n                this.onProductCartRequest =  async (addedProd = undefined)=>{return true;} \/\/operazioni a richiesta aggiunta a carrello (button)\n\n\t\t\t\tthis.onCategorySelected = async (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;} \/\/operazioni post selezione di una categoria\n\t\t\t\tthis.onAddonSelected = async (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;} \/\/operazioni post selezione di una categoria addon\n\t\t\t\tthis.onAttributeSelected = async (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;} \/\/operazioni post selezione di una categoria addon\n\t\t\t\tthis.onFilterSubmit = ()=>{ this.backgroundLoad(); }; \/\/funzione a submit dei filtri\n\t\t\t\tthis.onFilterReset = ()=>{ this.reset(); }; \/\/funzione a reset dei filtri\n\n\t\t\t\tthis.categoriesSelects = []; \/\/array dei nodi select per categorie - previsto 1\n\t\t\t\tthis.addonSelects = []; \/\/array dei nodi select per addon - previsto 1\n\t\t\t\tthis.attributeSelects = []; \/\/array dei nodi select per attributi\n                this.lastVisibleCatSel = undefined; \/\/ultima select categoria variata\n\t\t\t\tthis.lastVisibleCatSelVal = undefined; \/\/valore ultima select categoria variata\n\t\t\t\tthis.lastVisibleAddonSelVals = []; \/\/valore ultima select addon variata\n\t\t\t\tthis.lastVisibleAttrSelVals = []; \/\/valori select attributi variate\n\t\t\t\tthis.lastFetchedProductPage = 0;\n\t\t\t\tthis.isLastFetcheableProductPageReached = false;\n\t\t\t\tthis.fetchProductsHasError = false;\n\t\t\t\tthis.fetchedProducts = []; \n\t\t\t\tthis.fetchedCategories = [];\n\t\t\t\tthis.fetchedAddons = [];\n\t\t\t\tthis.fetchedAttributes = [];\n\t\t\t\tthis.lastUrlFetchedProducts = '';\n\t\t\t\tthis.isProductListEndReached = false;\n\t\t\t\tthis.defaultProductImageUrl = '\/wp-content\/uploads\/woocommerce-placeholder-300x300.png';\n\t\t\t\t\n\t\t\t\tthis.submitButton = document.createElement('button'); \/\/undefined crea problemi in load iniziale\n\t\t\t\tthis.resetButton = document.createElement('button');\n\n\n                \/\/ MOCKUP CATEGORIE\n\t\t\t\tthis.EGCategories = [ ];\n\n\t\t\t\t\/\/ MOCKUP PRODOTTI\n\t\t\t\tthis.EGProducts = [ ];\n\n\t\t\t\t\/\/infinite scroll load ulteriori prodotti\n\t\t\t\tthis.onScrollEndReached = async ()=>{\n\t\t\t\t\tawait this.fetchProducts();\n\t\t\t\t\tthis.listProducts(undefined,()=>{},()=>{});\n\t\t\t\t}\n\n\t\t\t\t\/\/backgroundLoad automatico, continuo\n\t\t\t\tthis.onBackgroundLoad = async ()=>{\n\t\t\t\t\tawait this.fetchProducts(undefined,undefined,undefined,undefined,undefined,undefined,undefined,true);\n\t\t\t\t\tthis.listProducts(undefined,()=>{},()=>{});\n\t\t\t\t}\n\n\t\t\t\tthis.isBackgroundLoading = false;\t\n\t\t\t\tthis.backgroundLoader = undefined;\t\n\t\t\t\tthis.backgroundLoadCalls = 0;\n\t\t\t\tthis.backgroundLoadTries = 0;\t\t\n\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\/\/listener a raggiungimento fine elenco prodotto\n\t\t\t\tthis.resWrap.addEventListener(\"scroll\", async (event) => {\n\t\t\t\t\t\n\t\t\t\t\tawait this.scrollEndReached();\n\t\t\t\t\t\n\t\t\t\t});\n\n\t\t\t\tthis.isInitializing = false;\n\n            }\n\n\n\t\t\t\/\/autocaricamento risultati continuo\n\t\t\tasync backgroundLoad(start = true, fn = undefined == undefined ? undefined : async ()=>{}){\n\n\t\t\t\ttry{\n\n\t\t\t\t\t\/\/DISATTIVAZIONE\n\t\t\t\t\tif(\t\t!start \n\t\t\t\t\t\t|| \tthis.backgroundLoadCalls > this.params.backgroundLoadCallsLimit \n\t\t\t\t\t\t|| \tthis.isLastFetcheableProductPageReached\n\t\t\t\t\t\t||\tthis.fetchProductsHasError\n\t\t\t\t\t){\n\n\t\t\t\t\t\t\/\/operazioni effettuate a prescindere, per sicurezza\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: disattivazione intervallo ripetizione');}\n\t\t\t\t\t\tclearInterval(this.backgroundLoader); \n\t\t\t\t\t\tthis.ctrlFetchProducts.abort('ProductsList.backgroundLoad: disattivazione loader');\n\n\t\t\t\t\t\tif(!start){if(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: richiesta esplicita di disattivazione');}}\n\t\t\t\t\t\tif(this.isLastFetcheableProductPageReached){if(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: ultima pagina raggiunta');}}\n\t\t\t\t\t\tif(this.backgroundLoadCalls > this.params.backgroundLoadCallsLimit){console.log('ProductsList.backgroundLoad: limite chiamate raggiunto');}\n\t\t\t\t\t\tif(this.fetchProductsHasError ){if(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: ultima fetch prodotti ha riscontrato un errore');}}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.backgroundLoader = undefined; \n\t\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: backgroundLoader disattivato'); }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/operazioni effettuate solo se backgroundloader era attivo\n\n\t\t\t\t\t\tif(!this.isBackgroundLoading && this.backgroundLoadCalls === 0){ return; }\n\t\t\t\t\t\tthis.isBackgroundLoading = false;\n\t\t\t\t\t\tthis.backgroundLoadCalls = 0;\n\t\t\t\t\t\tthis.backgroundLoadTries = 0;\n\t\t\t\t\t\tthis.toggleFormButtons(true,['submitButton','resetButton']); \n\t\t\t\t\t\tthis.setLoaded();\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/verifica se precedente sessione ancora in elaborazione\n\t\t\t\t\tthis.backgroundLoadTries++;\n\t\t\t\t\tif(this.backgroundLoadTries > this.params.backgroundLoadTriesLimit){ console.log('ProductsList.backgroundLoad: interrotto potenziale loop'); this.backgroundLoad(false);  return;} \n\t\t\t\t\tif(this.isBackgroundLoading === true && this.params.logEnabled){console.error('ProductsList.backgroundLoad: sessione precedente ancora in elaborazione, esco');  return;} \n\t\t\t\t\tthis.backgroundLoadTries = 0;\n\n\t\t\t\t\tif(this.backgroundLoadCalls === 0){ this.setLoading(); }\n\n\t\t\t\t\tthis.isBackgroundLoading = true;\n\t\t\t\t\tthis.toggleFormButtons('processing',['submitButton','resetButton']);\n\t\t\t\t\tthis.backgroundLoadCalls++;\n\t\t\t\t\t\n\t\t\t\t\tif(fn == undefined){ fn = this.onBackgroundLoad; }\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: avvio elaborazione'); }\n\n\t\t\t\t\ttry{ await fn(); }catch(e){console.error('ProductsList.backgroundLoad: Errore funzione associata: ',e); this.backgroundLoad(false); return;}\n\t\t\t\t\tthis.isBackgroundLoading = false;\n\t\t\t\t\t\/\/this.toggleFormButtons(true,['submitButton','resetButton']);\n\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: termine elaborazione');}\n\n\t\t\t\t\tif(this.backgroundLoadCalls === 1){\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.setLoaded(this.fetchedProducts.length); \n\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica e attiva interval\n\t\t\t\t\t\tif(this.backgroundLoader == undefined){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.backgroundLoad: attivazione intervallo ripetizione'); }\n\t\t\t\t\t\t\tthis.backgroundLoader = setInterval(async () => {this.backgroundLoad();}, 500);\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t}catch(e){\n\n\t\t\t\t\tclearInterval(this.backgroundLoader); \n\t\t\t\t\tthis.backgroundLoader = undefined; \n\t\t\t\t\tthis.isBackgroundLoading = false; \n\t\t\t\t\tthis.backgroundLoadCalls = 0;\n\t\t\t\t\tthis.toggleFormButtons(true,['submitButton','resetButton']);\n\t\t\t\t\tif(this.params.logEnabled){ console.error('ProductsList.backgroundLoad: Errore: ',e);}\n\n\t\t\t\t}\n\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\t\/\/caricamento risultati paginato\n\t\t\tasync scrollEndReached(isManuallyRequested = undefined){\n\t\t\t\t\n\t\t\t\ttry{\n\t\t\t\t\t\n\t\t\t\t\t\tif(this.isBackgroundLoading){return;}\n\n\t\t\t\t\t\tvar fname = 'ProductsList.onScrollEndReached';\n\t\t\t\t\t\tvar offset = 10;\n\t\t\t\t\t\tvar requestEvent = event ?? {};\n\t\t\t\t\t\tvar isContainerEndReached = this.resWrap.scrollTop + this.resWrap.clientHeight + offset >= this.resWrap.scrollHeight;\n\t\t\t\t\t\tvar isManuallyRequested = isManuallyRequested != undefined ? isManuallyRequested : (requestEvent.detail?.manual ?? false) == true;\n\n\t\t\t\t\t\tif( ! isManuallyRequested && !isContainerEndReached  ) { return; }\n\t\t\t\t\t\tif(this.isProductListEndReached){ return; } \/\/fine gi\u00e0 raggiunta ed elaborazione avviata\n\t\t\t\t\t\tif( ! isManuallyRequested && this.resWrap.querySelectorAll('.geoselector_res_el').length == 0){  return; } \/\/probabile avvio errato\n\t\t\t\t\t\tif( ! isManuallyRequested &&this.fetchedProducts.length < 5){ if(this.params.logEnabled){ console.log(fname+': numero prodotti non richiede paginazione'); } return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.isProductListEndReached = true;\n\n\t\t\t\t\t\tif(isManuallyRequested && this.params.logEnabled){ console.log(fname+': richiesta elaborazione manuale');} \n\t\t\t\t\t\tif(isContainerEndReached && this.params.logEnabled){ console.log(fname+': raggiunto termine elenco');} \n\t\t\t\t\t\t\n\n\t\t\t\t\t\tthis.setLoading();\n\t\t\t\t\t\tthis.toggleFormButtons('processing',['submitButton','resetButton']);\n\t\t\t\t\t\tawait this.onScrollEndReached ();\n\t\t\t\t\t\tthis.isProductListEndReached = false;\n\t\t\t\t\t\tthis.toggleFormButtons(true,['submitButton','resetButton']);\n\t\t\t\t\t\tthis.setLoaded(this.fetchedProducts.length);\n\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.toggleFormButtons(true,['submitButton','resetButton']);\n\t\t\t\t\t\tif(this.params.logEnabled){ console.error(fname+': Errore: ',e);}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n            \/\/imposta funzione pre listing prodotti\n            setOnListProducts(fn = ()=>{return true;}){\n\n                    this.onListProducts = fn;\n\n            }\n\n            \/\/imposta funzione post prodotto aggiunto a lista\n            setOnProductAdded(fn = (addedProd = undefined)=>{return true;}){\n\n                    this.onProductAdded = fn;\n\n            }\n\n            \/\/imposta funzione a click pulsante geometria prodotto\n            setOnProductDrawRequest(fn = async (addedProd = undefined)=>{return true;}){\n\n                    this.onProductDrawRequest = fn;\n\n            }\n\n            \/\/imposta funzione a click pulsante aggiunta a carrello\n            setOnProductCartRequest(fn = async (addedProd = undefined)=>{return true;}){\n\n                    this.onProductCartRequest = fn;\n\n            }\n\n            \/\/imposta funzione per oeprazioni a selezione categoria\n            setOnCategorySelected(fn = (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;}){\n                this.onCategorySelected = fn;\n            }\n\n\t\t\t\/\/imposta funzione per oeprazioni a selezione addon\n            setOnAddonSelected(fn = (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;}){\n                this.onAddonSelected = fn;\n            }\n\n\t\t\t\/\/imposta funzione per oeprazioni a selezione addon\n            setOnAttributeSelected(fn = (changeEvent = undefined, selectInput = undefined, selectedVal = undefined)=>{return true;}){\n                this.onAttributeSelected = fn;\n            }\n\n\t\t\t\/\/imposta funzione a submit\n\t\t\tsetOnFilterSubmit(fn=()=>{}){\n\n\t\t\t\tthis.onFilterSubmit = fn;\n\n\t\t\t}\n\n\t\t\t\/\/imposta funzione a reset\n\t\t\tsetOnFilterReset(fn=()=>{}){\n\n\t\t\t\tthis.onFilterReset = fn;\n\n\t\t\t}\n\n\t\t\t\/\/imposta funzione infinitescroll\n\t\t\tsetOnScrollEndReached(fn = async()=>{return true;}){\n\t\t\t\tthis.onScrollEndReached = fn;\n\t\t\t}\n\n\t\t\t\/\/imposta funzione backgroundLoad\n\t\t\tsetOnBackgroundLoad(fn = async()=>{return true;}){\n\n\t\t\t\tif (!\/await[\\s\\S]*?fetchProducts[\\s\\S]*?\\([\\s\\S]*?true[\\s\\S]*?\\)\/.test(fn.toString())) {\n\t\t\t\t\tif(this.params.logEnabled){ console.error('ProductsList.listProducts: \u00e8 richiesta invocazione fetchProducts, con await e sesto parametro (isBackgroundLoading) true');}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.onBackgroundLoad = fn;\n\t\t\t}\n\n            \/\/elenca prodotti\n\t\t\tlistProducts(\n\t\t\t\tproducts = undefined == undefined ? undefined : [], \/\/prodotti da aggiungere\n\t\t\t\tonListProducts = undefined == undefined ? undefined : ()=>{}, \/\/operazioni pre aggiunta\n\t\t\t\tonProductAdded = undefined == undefined ? undefined : ()=>{}, \/\/operazioni ad aggiunta prodotto\n\t\t\t\tidAfter = undefined == undefined ? undefined : 0, \/\/id dopo il quale appendere prodotto\n\t\t\t\talwaysAddedClass = undefined == undefined ? undefined : '', \/\/classe da aggiunere a prodotto nuvo \/ esistente\n\t\t\t\talwaysAddedOrder = undefined == undefined ? undefined : '' \/\/ordine (style) da aggiunere a prodotto nuvo \/ esistente\n\t\t\t ){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.listProducts: funzione invocata');}\n\n\t\t\t\tproducts = products == undefined ? this.fetchedProducts : products;\n\t\t\t\tonListProducts = onListProducts == undefined ? this.onListProducts : onListProducts;\n\t\t\t\tonProductAdded = onProductAdded == undefined ? this.onProductAdded : onProductAdded;\n\t\t\t\t\n\n\t\t\t\t\/\/this.setLoading();\n\n\t\t\t\tonListProducts();\n\n\t\t\t\t\/\/document.querySelector('#geoselector_res_num span').innerText = products.length;\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.listProducts: caricamento prodotti');}\n\n\t\t\t\tvar listedProdsCountAdded = 0;\n\t\t\t\tvar listedProdsCountAll = this.resWrap.querySelectorAll('.geoselector_res_el').length;\n\n\t\t\t\tproducts.forEach((product,i)=>{\n\n\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log('listProducts: aggiunta prodotto: '+product.id); }\n\n\n\t\t\t\t\t\/\/prodotto gi\u00e0 presente nella lista\n\t\t\t\t\tvar existingProd = this.resWrap.querySelector('[data-id=\"'+product.id+'\"]');\n\t\t\t\t\tif(existingProd != undefined){\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log('listProducts: gi\u00e0 presente prodotto con id: '+product.id); }\n\t\t\t\t\t\tif(alwaysAddedClass != undefined){ existingProd.classList.add(alwaysAddedClass);} \/\/aggiungi classe custom passata\n\t\t\t\t\t\tif(alwaysAddedOrder != undefined){ existingProd.style.order = alwaysAddedOrder;} \/\/aggiungi ordine custom passato\n\t\t\t\t\t\tif((product.customClass ?? undefined) != undefined){existingProd.classList.add(product.customClass);} \/\/aggiungi classe custom originante da api\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\n\t\t\t\t\tvar addedProd = this.res.cloneNode(true);\n\t\t\t\t\t\/\/addedProd.dataset.categories = JSON.stringify(product.categories.map(c=>c.id));\n\t\t\t\t\taddedProd.id = 'geoselector_res_el_'+(self.crypto.randomUUID()).replaceAll('-','');\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_desc').innerText = (product.name ?? 'Lorem Ipsum').substring(0,49) + ((product.name ?? 'Lorem Ipsum').length > 50 ? '\u2026' : '');\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_geom .value').innerText = this.texts.showProductGeometry;\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_geom .icon').innerText = this.params.icons.showProductGeometry;\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_cart .value').innerText = this.texts.addToCart;\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_cart .icon').innerText = this.params.icons.addToCart;\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_desc').href = product.permalink ?? '#';\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_desc').setAttribute('target','_blank');\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_price .value').innerText = this.lastVisibleAddonSelVals[0]?.price ?? (product.price ?? '');\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_img').style.background = 'url('+(product.images[0]?.src ?? this.defaultProductImageUrl)+')';\n\t\t\t\t\tif(alwaysAddedClass != undefined){ addedProd.classList.add(alwaysAddedClass); } \/\/aggiungi classe custom passata\n\t\t\t\t\tif(alwaysAddedOrder != undefined){ addedProd.style.order = alwaysAddedOrder; } \/\/aggiungi ordine custom passato\n\t\t\t\t\telse{ addedProd.style.order = listedProdsCountAll; }\n\t\t\t\t\t\n\t\t\t\t\t\/\/aggiungi dettaglio selezione effettuata\n\t\t\t\t\tif( (this.addonSelects?.length ?? 0) > 0 ){\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar detAddon = document.createElement('div');\n\t\t\t\t\t\tvar detAddonName = document.createElement('span');\n\t\t\t\t\t\tvar detAddonValue = document.createElement('span');\n\t\t\t\t\t\t\n\t\t\t\t\t\tdetAddon.classList.add('geoselector_res_det');\n\t\t\t\t\t\tdetAddon.classList.add('geoselector_res_addon');\n\t\t\t\t\t\tdetAddonName.classList.add('name');\n\t\t\t\t\t\tdetAddonValue.classList.add('value');\n\t\t\t\t\t\t\n\t\t\t\t\t\tdetAddonName.innerText = this.texts.detailSelectedVariation + ': ';\n\t\t\t\t\t\tdetAddonValue.innerText = JSON.parse((igmGeoSelector.prdSearch.productsList.addonSelects[0]?.value ?? '{\"label\":\"\"}')).label;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tdetAddon.appendChild(detAddonName);\n\t\t\t\t\t\tdetAddon.appendChild(detAddonValue);\n\t\t\t\t\t\t\n\t\t\t\t\t\ttry{ addedProd.querySelector('.geoselector_res_dets').appendChild(detAddon); }catch(e){}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/ESPONE NOME PRIMA CATEGORIA DISPONIBILE IN DETTAGLI PRODOTTO\n\t\t\t\t\t\/\/addedProd.querySelector('.geoselector_res_cat .value').innerText = product.categories.filter((c)=>!c.slug.includes('tecnica_'))[0].name ?? '';\n\t\t\t\t\t\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_cat .value').remove(); \/\/rimuovi nome categoria\n\n\t\t\t\t\tthis.params.productListAttributeSlugs.forEach((listAttribute)=>{\n\n\t\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log('listProducts: aggiunto attributo: '+attrSlug); }\n\n\t\t\t\t\t\tvar attr = product.attributes.filter((a)=>a.slug==listAttribute.slug||a.slug=='pa_'+listAttribute.slug)[0] ?? undefined;\n\t\t\t\t\t\tif(attr != undefined && attr.options[0] != undefined && attr.name != undefined && product.categories.some(cat => cat.id == listAttribute.idLinkedCategory)){\n\n\t\t\t\t\t\t\tvar attrDiv = document.createElement('div');\n\t\t\t\t\t\t\tvar attrSpanName = document.createElement('span');\n\t\t\t\t\t\t\tvar attrSpanValue = document.createElement('span');\n\n\t\t\t\t\t\t\tattrDiv.classList.add('geoselector_res_attr');\n\t\t\t\t\t\t\tattrSpanName.classList.add('name');\n\t\t\t\t\t\t\tattrSpanValue.classList.add('value');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/\/attrSpanName.innerText = attr.name+': ';\n\t\t\t\t\t\t\tvar fixedName = listAttribute.fixName(attr.name);\n\t\t\t\t\t\t\tattrSpanName.innerText = fixedName[0].toUpperCase() + fixedName.slice(1) + ': '; \/\/prima maiuscola\n\t\t\t\t\t\t\tattrSpanValue.innerText = attr.options[0];\n\n\t\t\t\t\t\t\tattrDiv.appendChild(attrSpanName);\n\t\t\t\t\t\t\tattrDiv.appendChild(attrSpanValue);\n\n\t\t\t\t\t\t\taddedProd.querySelector('.geoselector_res_attrs').appendChild(attrDiv);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telse{\n\n\t\t\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log('listProducts: attributo non trovato: '+JSON.stringify(product.attributes)); }\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\n\n\t\t\t\t\taddedProd.dataset.geometry=product.attributes.filter((a)=>a.slug=='geometria'||a.slug=='pa_geometria')[0]?.options[0] ?? undefined;\n\t\t\t\t\taddedProd.dataset.collection=product.attributes.filter((a)=>a.slug=='collezione'||a.slug=='pa_collezione')[0]?.options[0] ?? undefined;\n\t\t\t\t\taddedProd.dataset.id=product.id ?? undefined;\n\t\t\t\t\taddedProd.dataset.collectionLoaded=product.collectionLoaded ?? 0;\n\t\t\t\t\taddedProd.querySelector('.geoselector_res_geom').addEventListener('click', async ()=>{ await this.onProductDrawRequest(addedProd); });\n                    addedProd.querySelector('.geoselector_res_cart').addEventListener('click',async ()=>{ await this.onProductCartRequest(addedProd); });\n\t\t\t\t\tif((product.customClass ?? undefined) != undefined){addedProd.classList.add(product.customClass);}\n                     \n\t\t\t\t\tif(idAfter == undefined){this.resWrap.appendChild(addedProd); if(this.params.logEnabled){ console.log('ProductsList.listProducts: appendo prodotto in coda'); } }\n\t\t\t\t\telse{this.resWrap.querySelector('[data-id=\"'+idAfter+'\"]').after(addedProd); if(this.params.logEnabled){ console.log('ProductsList.listProducts: appendo prodotto dopo '+'[data-id=\"'+idAfter+'\"]'); }  }\n\t\t\t\t\tlistedProdsCountAdded++;\n\t\t\t\t\tlistedProdsCountAll++;\n\n\n                    this.onProductAdded(addedProd);\n                    \n\t\t\t\t});\n\n\t\t\t\t\/\/this.setLoaded(listedProdsCountAdded);\n\n\t\t\t\tif(this.params.logEnabled){ \n\t\t\t\t\tconsole.log('ProductsList.listProducts: numero prodotti aggiunti: '+ listedProdsCountAdded);\n\t\t\t\t\tconsole.log('ProductsList.listProducts: numero prodotti totale: '+ listedProdsCountAll);\n\t\t\t\t}\n\n\t\t\t}\n\n            \/\/ottieni prodotti da categoria, coordinate, paginazione\n\t\t\t\/\/TODO: AGGIUNGERE CATEGORIE FIGLIE??? O GIA INCUSE DA WC?\n\t\t\tasync fetchProducts(\n\t\t\t\tsrcWKT = undefined == undefined ? undefined : '',\n\t\t\t\tsrcCategories = undefined == undefined ? undefined : [],\n\t\t\t\tsrcTag = undefined == undefined ? undefined : 0, \n\t\t\t\tsrcAttrNames = undefined == undefined ? undefined : [], \n\t\t\t\tsrcAttrVals = undefined == undefined ? undefined : [], \n\t\t\t\tpageNum = undefined == undefined ? undefined : 0, \n\t\t\t\tresNum = undefined == undefined ? undefined : 0, \n\t\t\t\tisBackgroundLoading = undefined == undefined ? undefined : false, \/\/disattiva sempre autoloader se funz. non reinvocata da quest'ultimo\n\t\t\t\tisAtomic = undefined == undefined ? undefined : false, \/\/true non registra n\u00e8 controlla variazioni in classe\n\t\t\t\tfetchController = undefined \/\/fetch controller che consente pausa e abort\n\t\t\t ){\n\n\t\t\t\ttry{\n\t\t\t\t\t\n\t\t\t\t\tvar fnName = 'ProductsList.fetchProducts';\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName+': funzione invocata');}\n\n\t\t\t\t\tisAtomic = isAtomic == undefined ? false : isAtomic;\n\t\t\t\t\tisBackgroundLoading = isBackgroundLoading == undefined ? false : isBackgroundLoading;\n\t\t\t\t\tfetchController = fetchController == undefined ? this.ctrlFetchProducts : fetchController;\n\n\t\t\t\t\t\/\/if(!isBackgroundLoading){if(this.params.logEnabled){ console.log(fnName+': non invocata da backgroundLoad, richiedo disattivazione backgroundLoad');} this.backgroundLoad(false);}\n\n\t\t\t\t\tvar fetchedProducts = [];\n\t\t\t\t\tif(!isAtomic && this.isLastFetcheableProductPageReached){if(this.params.logEnabled){  console.log(fnName+': ultima pagina raggiunta, restituisco array vuoto');} return fetchedProducts;}\n\n\t\t\t\t\t\/\/if(this.backgroundLoadCalls < 2){ this.setLoading(); }\n\n\t\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products';\n\t\t\t\t\tvar consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\t\tvar consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\n\t\t\t\t\tvar categoryParam = (srcCategories == undefined || srcCategories.length == 0 || srcCategories[0] == undefined) ? undefined : srcCategories.join(',');\n\t\t\t\t\tvar pageParam = (pageNum == undefined ? (this.lastFetchedProductPage + 1) : pageNum);\n\t\t\t\t\tvar perPageParam = resNum == undefined ? this.params.resultsPerPage : resNum;\n\t\t\t\t\tvar tagParam = srcTag == undefined ? this.params.idProductTag : srcTag;\n\t\t\t\t\tvar url = `${baseUrl}?tag=${tagParam}&page=${pageParam}&per_page=${perPageParam}`;\n\t\t\t\t\t\/\/var url = `${baseUrl}?page=${pageParam}&per_page=${perPageParam}`; \/\/NOTAG\n\t\t\t\t\tif(categoryParam != undefined){ url = url + `&category=${categoryParam}`; }\n\n\t\t\t\t\tvar attrNameParams = srcAttrNames == undefined ? [] : srcAttrNames;\n\t\t\t\t\tvar attrValParams = srcAttrVals == undefined ? [] : srcAttrVals;\n\t\t\t\t\t\n\t\t\t\t\tif(attrNameParams.length > 0){ \n\t\t\t\t\t\tattrNameParams.forEach((a,i)=>{attrNameParams[i] = encodeURIComponent(a).replace(\/\\(\/g, '%28').replace(\/\\)\/g, '%29'); });\n\t\t\t\t\t\tvar attrNameParam = attrNameParams.join(\",\"); \n\t\t\t\t\t\turl = url + `&meta_name=${attrNameParam}`; \n\t\t\t\t\t}\n\t\t\t\t\tif(attrValParams.length > 0){ \n\t\t\t\t\t\tattrValParams.forEach((a,i)=>{attrValParams[i] = encodeURIComponent(a).replace(\/\\(\/g, '%28').replace(\/\\)\/g, '%29'); });\n\t\t\t\t\t\tvar attrValParam = attrValParams.join(\",\"); \n\t\t\t\t\t\turl = url + `&meta_value=${attrValParam}`; \n\t\t\t\t\t}\n\n\t\t\t\t\tif (srcWKT !== undefined) { let enc = encodeURIComponent(srcWKT).replace(\/\\(\/g, '%28').replace(\/\\)\/g, '%29'); url += `&geom=${enc}`; }\n\t\t\t\t\n\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.fetchProducts: url api: '+url);}\n\t\t\t\t\t\n\t\t\t\t\tawait fetchController.checkPause(); \/\/verifica se fetch in pausa\n\t\t\t\t\t\n\t\t\t\t\tif( ! isAtomic && url == this.lastUrlFetchedProducts && ! url.includes('pa_collezione')){ \n\t\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.fetchProducts: url gi\u00e0 fetchato, esco. ');}\n\t\t\t\t\t\treturn fetchedProducts; \n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.lastUrlFetchedProducts = url;\n\n\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log('ProductsList.fetchProducts: TEST ');}\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.fetchProducts: fetchController utilizzato: '+fetchController);}\n\t\t\t\t\t\n\t\t\t\t\tvar response = await fetch(url, { headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) } , signal: fetchController.signal });\n\t\t\t\t\tif (!response.ok) { throw new Error(`Errore fetch prodotti: ${response.status}`); }\n\t\t\t\t\tvar fetchedProducts = await response.json();\n\t\t\t\t\tif(fetchedProducts.length == 0){ this.isLastFetcheableProductPageReached = true;}\n\t\t\t\t\tif(!isAtomic){ this.fetchedProducts.push(...fetchedProducts); }\n\n\t\t\t\t\tif(!isAtomic){this.lastFetchedProductPage = (this.isLastFetcheableProductPageReached ?  this.lastFetchedProductPage : pageParam); }\n\n\t\t\t\t\t\/\/this.setLoaded(fetchedProducts.length);\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.fetchProducts: numero prodotti recuperati: '+fetchedProducts.length);}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\/\/if(srcCategories.length == 0 ||(srcCategories.length == 1 && srcCategories[0] == 'A')){return fetchedProducts;}\n\t\t\t\t\t\/\/if(!incChildrenCats){ return fetchedProducts.filter((p)=>p.categories.map(c=>c.id).indexOf(parseInt(srcCategories[0]))>=0);}\n\t\t\t\t\t\/\/var srcCategories = this.getChildrenCats(srcCategories[0],true);\n\t\t\t\t\t\/\/return fetchedProducts.filter(p => p.categories.some(c => srcCategories.includes(c.id)));\n\n\t\t\t\t}catch(e){\n\t\t\t\t\tif(this.params.logEnabled){ console.error('ProductsList.fetchProducts: Errore: ',e); }\n\t\t\t\t\tfetchedProducts = []; \n\t\t\t\t\tif(!isAtomic){ this.fetchedProducts = []; }\n\t\t\t\t\tif(!isAtomic){ this.fetchProductsHasError = true;}\n\n\t\t\t\t}\n\n\t\t\t\treturn fetchedProducts;\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/ottieni layer di categoria prodotto\n\t\t\tasync fetchLayerPoints(\n\t\t\t\tcatId\n\t\t\t\t,attrName = null\n\t\t\t\t,attrVal = null\n\t\t\t\t,ausiliaryAttributes = {'slugsAttribute':[],'areAttributesCustom':[],'valuesAttribute':[],'operatorsAttribute':[]}\n\t\t\t ){\n\t\t\t\t\n\t\t\t\t\/\/modello ausiliaryAttributes:\n\t\t\t\t\/\/{\n\t\t\t\t\/\/\t\t\t\t\t\t\t\n\t\t\t\t\/\/\t\t\t\t\t\t\t\t'slugsAttribute':['derivazione-quota']\n\t\t\t\t\/\/\t\t\t\t\t\t\t\t,'areAttributesCustom':[true] \n\t\t\t\t\/\/\t\t\t\t\t\t\t\t,'valuesAttribute':['derivata da caposaldo di livellazione']\n\t\t\t\t\/\/\t\t\t\t\t\t\t\t,'operatorsAttribute':['LIKE'] \/\/usa like per valore attributo\n\n\t\t\t\t\/\/\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttry{\n\n\t\t\t\t\tvar fnName = 'ProductsList.fetchLayerPoints';\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName+': funzione invocata');}\n\t\t\t\t\t\n\t\t\t\t\tvar fetchedLayerPoints = [];\n\t\t\t\t\t\n\t\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products\/layer';\n\t\t\t\t\tvar consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\t\tvar consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Prepara i dati per il body JSON\n\t\t\t\t\tvar requestData = {\n\t\t\t\t\t\tcategory_id: catId\n\t\t\t\t\t};\n\t\t\t\t\tif (attrName != null && attrVal != null) {\n\t\t\t\t\t\trequestData.meta_name = attrName;\n\t\t\t\t\t\trequestData.meta_value = attrVal;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/requestData.get_cached = false;  \n\t\t\t\t\t\/\/requestData.debug = false;      \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tif((ausiliaryAttributes.slugsAttribute ?? []).length > 0){\n\t\t\t\t\t\trequestData.ausiliary_attributes = ausiliaryAttributes;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName+': fetch baseUrl: ',baseUrl);}\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName+': fetch body: ',requestData);}\n\t\t\t\t\t\n\n\t\t\t\t\tvar response = await fetch(baseUrl, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': 'application\/json',\n\t\t\t\t\t\t\t'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: JSON.stringify(requestData)\n\t\t\t\t\t\t\/\/ , signal: this.ctrlFetchAttributeValueHasProducts.signal\n\t\t\t\t\t});\n\t\t\t\t\tif (!response.ok) { throw new Error(`Errore fetch layer: ${response.status}`); }\n\t\t\t\t\tvar fetchedLayerPoints = await response.json();\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}catch(e){\n\t\t\t\t\t\n\t\t\t\t\tif(this.params.logEnabled){ console.error(fnName+': Errore: ',e); }\n\t\t\t\t\tfetchedLayerPoints = []; \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn fetchedLayerPoints;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\/\/ottieni prodotto tipo per tag\n\t\t\tasync fetchProductModel(srcTag = undefined == undefined ? undefined : 0){\n\n\t\t\t\tlet fnName = 'ProductList.fetchModelProduct';\n\t\t\t\tsrcTag = srcTag == undefined ? this.params.idProductTag : srcTag;\n\t\t\t\tlet consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\tlet consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\n\n\t\t\t\n\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products';\n\t\t\t\tvar tagParam = srcTag;\n\t\t\t\tvar url = `${baseUrl}?tag=${tagParam}&page=1&per_page=1`;\n\t\t\t\tvar response = await fetch(url, { headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) } });\n\t\t\t\tif (!response.ok) { throw new Error(`Errore fetch prodotto campione: ${response.status}`); }\n\t\t\t\tvar product =  await response.json();\n\t\t\t\tproduct = product[0] ?? {'id':null,'categories':[]};\n\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  prodotto modello fetchato: '+(product.id ?? 'nessuno.'));}\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  totale categorie (incl. addon) trovate: '+product.categories.length);}\n\n\t\t\t\treturn product;\n\n\t\t\t}\n\n\t\t\t\/\/ottieni e registra categorie\n\t\t\tasync fetchCategories(idsCategory = undefined == undefined ? undefined : [], isAtomic = undefined == undefined ? undefined : false){\n\n\t\t\t\tlet fnName = 'ProductList.fetchCategories';\n\t\t\t\tlet fetchedCategories = [];\n\n\t\t\t\ttry{\n\n\t\t\t\t\n\t\t\t\t\tisAtomic = isAtomic == undefined ? false : isAtomic;\n\n\t\t\t\t\tif (idsCategory == undefined) { throw new Error(fnName+`: argomento {idsCategory} richiesto`); }\n\t\t\t\t\tif (idsCategory.length == 0) { return; }\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': richiesta fetch per categorie: '+JSON.stringify(idsCategory));}\n\n\t\t\t\t\tvar consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\t\tvar consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\n\t\t\t\t\t\/\/var product = this.fetchedProducts[0] ?? undefined;\n\t\t\t\t\tif(1==0 && product == undefined){\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  nessun prodotto gi\u00e0 fetchato, avvio fetch prodotto modello...');}\n\t\t\t\t\t\tproduct = await this.fetchProductModel(srcTag);\n\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products\/categories';\n\t\t\t\t\tvar fetchAndPushCatData = async (cat)=>{\n\n\t\t\t\t\t\tvar idCategory = cat.id;\n\t\t\t\t\t\tvar url = `${baseUrl}\/${idCategory}`;\n\n\t\t\t\t\t\t\/\/console.log(url);\n\t\t\t\t\t\t\n\t\t\t\t\t\tawait this.ctrlFetchCategoryHasProducts.checkPause();\n\n\t\t\t\t\t\tvar response = await fetch(url, { headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) }, signal : this.ctrlFetchCategoryHasProducts.signal });\n\t\t\t\t\t\tif (!response.ok) { throw new Error(`Errore fetch categoria: ${response.status}`); }\n\t\t\t\t\t\tvar fetchedCategory = await response.json();\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  nessun prodotto gi\u00e0 fetchato, avvio fetch prodotto modello...');}\n\n\t\t\t\t\t\t\/\/console.log(fetchedCategory);\n\n\t\t\t\t\t\t\/\/verifica se \u00e8 figlia di altra categoria -> scarta\n\t\t\t\t\t\tif(1==1 && fetchedCategory.parent != '0'){return;}\n\n\t\t\t\t\t\t\/\/verifica se categoria tecnica con addon -> scarta\n\t\t\t\t\t\t\/\/temporaneamente disabilitato, in attesa correzione assenza categoria normale per serie ediz. precedente\n\t\t\t\t\t\tif(0==1 && (fetchedCategory.addons ?? []).length > 0){\n\t\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  rilevata categoria tecnica, scarto...');}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/aggiungi a categorie\n\t\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  registro categoria: ' + fetchedCategory.name);}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfetchedCategories.push({\n\n\t\t\t\t\t\t\t\t\"id\": fetchedCategory.id,\n\t\t\t\t\t\t\t\t\"name\": fetchedCategory.name,\n\t\t\t\t\t\t\t\t\"slug\" : fetchedCategory.slug,\n\t\t\t\t\t\t\t\t\"parent\": fetchedCategory.parent\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t};\n\n\t\t\t\t\t\/\/registrazione sequenziale\n\t\t\t\t\t\/\/for (const cat of idsCategory ?? []) { await fetchAndPushCatData({'id':cat}); }\n\t\t\t\t\t\n\t\t\t\t\t\/\/registrazione in parallelo\n\t\t\t\t\tconst promises = (idsCategory ?? []).map(cat => fetchAndPushCatData({ 'id': cat }));\n\t\t\t\t\tawait Promise.all(promises);\n\n\t\t\t\t\t\/\/console.log('fetched: '+fetchedCategories);\n\n\n\t\t\t\t}catch(e){if(this.params.logEnabled){ console.error(fnName + ':  Errore: ',e);}  fetchedCategories = []; }\n\n\n\t\t\t\tif(!isAtomic){\n\n\t\t\t\t\tthis.fetchedCategories = fetchedCategories;\n\n\t\t\t\t}\n\n\t\t\t\treturn fetchedCategories;\n\n\t\t\t}\n\n\t\t\t\/\/ottieni e registra categorie addon\n\t\t\tasync fetchAddons(idAddonCategory = undefined == undefined ? undefined : 0, idLinkedCategory = undefined == undefined ? undefined : 0,noCartIndexes = undefined == undefined ? undefined : [], isAtomic = undefined == undefined ? undefined : false){\n\n\t\t\t\tlet fnName = 'ProductList.fetchAddons';\n\t\t\t\tlet fetchedAddons = [];\n\n\t\t\t\ttry{\n\n\t\t\t\t\tisAtomic = isAtomic == undefined ? false : isAtomic;\n\n\t\t\t\t\tif (idAddonCategory == undefined) { throw new Error(fnName+`: argomento {idAddonCategory} richiesto`); }\n\t\t\t\t\tif (idLinkedCategory == undefined) { throw new Error(fnName+`: argomento {idLinkedCategory} richiesto`); }\n\t\t\t\t\tif (noCartIndexes == undefined) { throw new Error(fnName+`: argomento {noCartIndexes} richiesto`); }\n\n\t\t\t\t\t\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': richiesta fetch per addon associati a categoria tecnica: '+idAddonCategory);}\n\n\n\t\t\t\t\tvar product = this.fetchedProducts[0] ?? undefined;\n\t\t\t\t\tvar linkedCategory = this.params.filterCategories.filter((fc)=>fc.id == idLinkedCategory)[0] ?? undefined;\n\t\t\t\t\tvar consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\t\tvar consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\t\t\t\t\tif (linkedCategory == undefined) { throw new Error(fnName+`: categoria non trovata tra i parametri, id: `+idLinkedCategory ); }\n\n\t\t\t\t\tif(1==0 && product == undefined){\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  nessun prodotto gi\u00e0 fetchato, avvio fetch prodotto modello...');}\n\t\t\t\t\t\tproduct = await this.fetchProductModel(srcTag);\n\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products\/categories';\n\t\t\t\t\tvar fetchAndPushCatData = async (cat)=>{\n\n\t\t\t\t\t\tvar idCategory = cat.id;\n\t\t\t\t\t\tvar url = `${baseUrl}\/${idCategory}`;\n\n\t\t\t\t\t\t\/\/console.log(url);\n\t\t\t\t\t\t\/\/\n\t\t\t\t\t\t\n\t\t\t\t\t\tawait this.ctrlFetchAttributeValueHasProducts.checkPause();\n\n\t\t\t\t\t\tvar response = await fetch(url, { headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) }, signal: this.ctrlFetchAttributeValueHasProducts.signal });\n\t\t\t\t\t\tif (!response.ok) { throw new Error(fnName+`: Errore fetch categoria: ${response.status}`); }\n\t\t\t\t\t\tvar fetchedCategory = await response.json();\n\n\t\t\t\t\t\t\/\/console.log(fetchedCategory);\n\n\t\t\t\t\t\t\/\/verifica se \u00e8 figlia di altra categoria -> scarta\n\t\t\t\t\t\tif(1==1 && fetchedCategory.parent != '0'){return;}\n\n\n\t\t\t\t\t\t\/\/verifica se gi\u00e0 \u00e8 stato aggiunto un addon (uno solo ammesso) -> scarta\n\t\t\t\t\t\t\/\/if(!isAtomic && this.fetchedAddons.length > 0){return;}\n\n\n\t\t\t\t\t\t\/\/verifica se categoria con addons\n\t\t\t\t\t\tif(1==1 && (fetchedCategory.addons ?? []).length > 0 && (fetchedCategory.addons[0].options ?? []).length > 0 ){\n\n\t\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  registro addon: ' + fetchedCategory.name);}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\tvar fetchedAddon = fetchedCategory.addons[0];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfetchedAddon.options.forEach((opt,ind)=>{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/temporanea: abilita sempre acquisto varianti\n\t\t\t\t\t\t\t\t opt.isNoCart = false; return;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/verifica se categoria consente aggiunta a carrello\n\t\t\t\t\t\t\t\tif( (linkedCategory.noCart ?? false) == true){ opt.isNoCart = true; return; }\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/verifica se indice option addon rientra tra non abilitati ad aggiunta a carrello\n\t\t\t\t\t\t\t\topt.isNoCart = noCartIndexes.includes(ind) ? true : false; \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t}); \n\t\t\t\t\t\t\tfetchedAddon.idAddonCategory = idAddonCategory;\n\t\t\t\t\t\t\tfetchedAddon.idLinkedCategory = idLinkedCategory;\n\t\t\t\t\t\t\t\/\/aggiungi a categorie tecniche\n\t\t\t\t\t\t\tfetchedAddons.push(fetchedAddon);\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\/\/console.log(fetchedCategories);\n\n\n\t\t\t\t\t};\n\n\t\t\t\t\t\/\/for (const cat of product.categories ?? []) { await fetchAndPushCatData(cat); }\n\n\t\t\t\t\tawait fetchAndPushCatData({'id':idAddonCategory})\n\n\t\t\t\t\t\/\/console.log('fetched: '+fetchedCategories);\n\n\n\t\t\t\t}catch(e){if(this.params.logEnabled){ console.error(fnName + ':  Errore: ',e);}   fetchedAddons = [];   }\n\n\n\t\t\t\tif(!isAtomic){\n\n\t\t\t\t\tthis.fetchedAddons = fetchedAddons;\n\n\t\t\t\t}\n\n\t\t\t\treturn fetchedAddons; \n\n\t\t\t}\n\n\t\t\t\/\/ottieni e registra valori di un attributo\n\t\t\tasync fetchAttributes(idAttribute = undefined == undefined ? undefined : 0, idLinkedCategory = undefined == undefined ? undefined : 0, required = undefined == undefined ? undefined : false, isAtomic = undefined == undefined ? undefined : false){\n\t\t\t\t\n\t\t\t\tlet fnName = 'ProductList.fetchAttributes';\n\t\t\t\t\n\t\t\t\tlet fetchedValues = [];\n\n\t\t\t\ttry{\n\n\t\t\t\t\tif (idAttribute == undefined) { throw new Error(fnName+`: argomento {idAttribute} richiesto`); }\n\t\t\t\t\tif (idLinkedCategory == undefined) { throw new Error(fnName+`: argomento {idLinkedCategory} richiesto`); }\n\t\t\t\t\tisAtomic = isAtomic == undefined ? false : isAtomic;\n\n\t\t\t\t\tvar consumerKey = this.params.WooCommerceAPIKey.key; \n\t\t\t\t\tvar consumerSecret = this.params.WooCommerceAPIKey.secret; \n\n\t\t\t\t\tif (consumerKey == undefined) { throw new Error(fnName+`: consumerKey non impostato in classe`); }\n\t\t\t\t\tif (consumerSecret == undefined) { throw new Error(fnName+`: consumerSecret non impostato in classe`); }\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': richiesta fetch per attributo: '+idAttribute);}\n\n\t\t\t\t\tvar baseUrl = '\/wp-json\/wc\/v3\/products\/attributes';\n\t\t\t\t\tvar page = 1;\n\t\t\t\t\tvar perPage = 50;\n\t\t\t\t\tvar hasMorePages = true;\n\t\t\t\t\tvar iterations = 0;\n\n\t\t\t\t\t\/\/ottieni name\n\t\t\t\t\tvar url = `${baseUrl}\/${idAttribute}`;\n\t\t\t\t\tvar response = await fetch(url, {  headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) } });\t\n\t\t\t\t\tif (!response.ok) { throw new Error(fnName + `: Errore fetch attributo: ${response.status}`);  }\n\t\t\t\t\tvar responseAttribute = await response.json();\n\t\t\t\t\tvar nameAttribute = responseAttribute.name;\n\t\t\t\t\tvar slugAttribute = responseAttribute.slug;\n\n\t\t\t\t\twhile (hasMorePages) {\n\n\t\t\t\t\t\titerations++;\n\t\t\t\t\t\tif (iterations > 30) { throw new Error(fnName + `: Errore fetch meta values: limite chiamate raggiunto`);  }\n\n\t\t\t\t\t\tvar url = `${baseUrl}\/${idAttribute}\/meta_values?page=${page}&per_page=${perPage}`;\n\t\t\t\t\t\t\/\/console.log(url);\n\t\t\t\t\t\tvar response = await fetch(url, {  headers: { 'Authorization': 'Basic ' + btoa(`${consumerKey}:${consumerSecret}`) } });\t\n\t\t\t\t\t\tif (!response.ok) { throw new Error(fnName + `: Errore fetch meta values: ${response.status}`);  }\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar newFetchedValues = await response.json();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/console.log(newFetchedValues);\n\t\t\t\t\t\tfetchedValues = fetchedValues.concat(newFetchedValues);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/ Controlla se ci sono altre pagine\n\t\t\t\t\t\tif (newFetchedValues.length < perPage) { hasMorePages = false; } \n\t\t\t\t\t\telse { page++; }\n\n\t\t\t\t\t}\n\n\t\t\t\t}catch(e){if(this.params.logEnabled){ console.error(fnName + ':  Errore: ',e);}   fetchedValues = [];   }\n\n\t\t\t\tif(!isAtomic && (idAttribute != undefined)){\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  registro attributo: ' + nameAttribute);}\n\n\t\t\t\t\tvar fetchedAttribute = {'id':idAttribute,'name':nameAttribute,'slug':slugAttribute,'idLinkedCategory':idLinkedCategory,'required':required,'values':fetchedValues};\n\t\t\t\t\tvar fetchedAttributesIndex = this.fetchedAttributes.findIndex((a)=>a.id == idAttribute);\n\n\t\t\t\t\tif(fetchedAttributesIndex >= 0){this.fetchedAttributes[fetchedAttributesIndex] = fetchedAttribute;}\n\t\t\t\t\telse{this.fetchedAttributes.push( fetchedAttribute ); }\n\n\t\t\t\t}\n\n\t\t\t\treturn fetchedValues; \n\n\n\t\t\t}\n\n\t\t\t\/\/ottieni tutti gli id categorie padri di una categoria\n\t\t\tgetParentCats(idCat,includeSelf=false){\n\t\t\t\tvar idsCats = [];\n\t\t\t\tvar idParent = parseInt(idCat); \/\/id categoria iniziale\n\t\t\t\tif(includeSelf){idsCats.push(idParent);}\n\t\t\t\twhile(idParent > 0){\n\t\t\t\t\tvar idParent = this.fetchedCategories.filter((c)=>c.id==idParent)[0].parent;\n\t\t\t\t\tidsCats.push(parseInt(idParent));\t\n\t\t\t\t}\n\t\t\t\treturn idsCats;\n\t\t\t}\n\n\t\t\t\/\/ottieni tutti gli id categorie figli di una categoria\n\t\t\tgetChildrenCats(idCat,includeSelf=false){\n\n\t\t\t\tvar idsCats = [];\n\t\t\t\tif(includeSelf){idsCats.push(parseInt(idCat));}\n\t\t\t\tvar CatChildren = this.fetchedCategories.filter((c)=>c.parent==parseInt(idCat));\n\t\t\t\tCatChildren.forEach((CatChild)=>{\n\n\t\t\t\t\tidsCats.push(CatChild.id);\n\t\t\t\t\tthis.getChildrenCats(CatChild.id,false).forEach((c)=>{idsCats.push(parseInt(c));});\n\n\t\t\t\t});\n\t\t\t\treturn idsCats;\n\n\t\t\t}\n\n\t\t\t\/\/crea select per categoria prodotto (option)\n\t\t\taddCatToSelect(cat = undefined == undefined ? undefined : {},wrapId = undefined == undefined ? undefined : ''){\n\n\t\t\t\tlet fnName = 'ProductsList.addCatToSelect'; \n\t\t\t\t\/\/if(this.fetchedCategories.length == 0){ throw new Error(fnName+`: nessuna categoria fetchata.`); }\t\n\n\t\t\t\tif(cat == undefined){cat = {\"id\":0,\"name\":\"Default\",\"slug\":\"default\",\"parent\":0};}\t\t\t\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_cats';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\n\t\t\t\t\/\/var sel = document.querySelector('.geoselector_res_cat[data-parentvalue=\"'+cat.parent+'\"]');\n\t\t\t\tvar sel = (this.categoriesSelects.filter((s)=>{return s.dataset.parentvalue == cat.parent;})[0] ?? undefined);\n\n\t\t\t\t\/\/CREA NUOVA SELECT PER PARENT\n\t\t\t\tif(sel == undefined){\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': creazione nuova select di categoria'); }\n\n\t\t\t\t\tsel = document.createElement('select');\n\t\t\t\t\tsel.setAttribute('required',true);\n\t\t\t\t\tsel.classList.add('geoselector_res_cat');\n\t\t\t\t\t\/\/sel.id = ('geoselector_res_cat_'+cat.parent);\n\t\t\t\t\tsel.dataset.parentvalue = cat.parent;\n\t\t\t\t\n\n\t\t\t\t\t\/\/nascondi ulteriori select\n\t\t\t\t\t\/\/if(document.querySelectorAll('.geoselector_res_cat').length > 0 && this.categoriesSelects.length > 1){sel.style.display=\"none\";}\n\n\t\t\t\t\t\/\/listener cambio categoria - adatta gerarchia\n\t\t\t\t\tsel.addEventListener('change', async (e)=>{\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  category selection changed\/reset'); }\n\n\t\t\t\t\t\tvar selfMet = false;\n\t\t\t\t\t\tvar parentedOpts = [];\n\t\t\t\t\t\tvar lastVisibleCatSel = undefined;\n\t\t\t\t\t\tvar lastVisibleCatSelVal = undefined;\n\t\t\t\t\t\tdocument.querySelectorAll(('.geoselector_res_cat')).forEach((childSel)=>{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(childSel == sel){selfMet = true; lastVisibleCatSel = childSel; return;}\n\t\t\t\t\t\t\tif(childSel != sel && !selfMet){return;}\n\t\t\t\t\t\t\tif(childSel.dataset.parentvalue == sel.options[sel.selectedIndex].value){childSel.style.display = 'block'; lastVisibleCatSel = childSel; }\n\t\t\t\t\t\t\telse{childSel.style.display = 'none'; childSel.selectedIndex = 0;}\n\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tlastVisibleCatSelVal = lastVisibleCatSel.options[lastVisibleCatSel.selectedIndex].value;\n\t\t\t\t\t\twhile(lastVisibleCatSelVal == 'A' && lastVisibleCatSel.dataset.parentvalue > 0){\n\n\t\t\t\t\t\t\tparentedOpts = Array.from(document.querySelectorAll(('.geoselector_res_cat')+' option')).filter((option)=>option.value==lastVisibleCatSel.dataset.parentvalue);\n\t\t\t\t\t\t\tif(parentedOpts.length == 0){break;}\n\t\t\t\t\t\t\tlastVisibleCatSel = parentedOpts[0].closest('select');\n\t\t\t\t\t\t\tlastVisibleCatSelVal = lastVisibleCatSel.options[lastVisibleCatSel.selectedIndex].value;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\t\tthis.lastVisibleCatSel = lastVisibleCatSel;\n\t\t\t\t\t\tthis.lastVisibleCatSelVal = lastVisibleCatSelVal;\n\n\t\t\t\t\t\t\/\/operazioni ulteriori\n\t\t\t\t\t\tawait this.onCategorySelected(e,sel,lastVisibleCatSelVal);\n\t\n\n\t\t\t\t\t});\n\t\t\t\t\t\n\n\t\t\t\t\t\/\/console.log(fnName + ':  append nuova select');\n\t\t\t\t\twrapper.appendChild(sel);\n\t\t\t\t\t\n\t\t\t\t\tthis.categoriesSelects.push(sel);\n\n\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\/\/console.log(fnName + ':  creazione nuova option all');\n\t\t\t\t\t\tvar opt = document.createElement('option');\n\t\t\t\t\t\topt.innerText = this.texts.selectCategory ?? 'seleziona categoria';\n\t\t\t\t\t\topt.value = '';\n\t\t\t\t\t\topt.setAttribute('disabled',true);\n\t\t\t\t\t\topt.setAttribute('selected',true);\n\t\t\t\t\t\tsel.prepend(opt);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\tvar lab = document.createElement('label');\n\t\t\t\t\t\tlab.innerText = this.texts.selectCategory;\n\t\t\t\t\t\twrapper.insertBefore(lab,sel);\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\telse if(this.params.logEnabled){ console.log(fnName + ': select di categoria esistente: ',sel); }\n\t\t\t\t\n\t\t\t\t\/\/AGGIUNGI A SELECT ESISTENTE\n\t\t\t\tif(cat.id != 0){\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  aggiungo categoria a select: '+cat.slug); }\n\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\tnewOpt.innerText = this.fixTecnicaName(cat.name);\n\t\t\t\t\tnewOpt.value = cat.id;\n\t\t\t\t\t\n\t\t\t\t\t\/\/sel.appendChild(newOpt);\n\t\t\t\t\t\/\/return;\n\n\t\t\t\t\t\/\/verifica posizione alfabeticamente\n\t\t\t\t\tvar selLen = sel.options.length;\n\t\t\t\t\tif(selLen == 0){  sel.appendChild(newOpt); return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\/\/ Start from the end and find where to insert\n\t\t\t\t\tfor(var p = (selLen - 1); p >= 0; p--){ \n\t\t\t\t\t\tvar v = sel.options[p].value == '' ? '' : sel.options[p].innerText;\n\t\t\t\t\t\tif(newOpt.innerText.localeCompare(v) >= 0){ \n\t\t\t\t\t\t\tsel.options[p].after(newOpt);  \n\t\t\t\t\t\t\tbreak; \n\t\t\t\t\t\t}  \n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\t\t\t\t\n\t\t\t\n\t\t\t\/\/caggiungi option \"no category found\"\n\t\t\taddNoCatToSelect(idParentCat = undefined,wrapId = undefined ){\n\n\n\t\t\t\tlet fnName = 'ProductsList.addNoCatToSelect';\n\t\t\t\t\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  aggiungo valore \"no category found\" a select'); }\n\n\t\t\t\tif(idParentCat == undefined){ throw new Error(fnName+': valore idParentCat richiesto.'); }\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_cats';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tvar sel = (this.categoriesSelects.filter((s)=>{return s.dataset.parentvalue == idParentCat;})[0] ?? undefined);\n\t\t\t\t\n\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\tnewOpt.innerText = this.texts.noResult;\n\t\t\t\tnewOpt.value = '';\n\t\t\t\tnewOpt.setAttribute('disabled', true);\n\t\t\t\tnewOpt.classList.add('no-result');\n\t\t\t\tsel.appendChild(newOpt);\n\t\t\t\t\n\t\t\t\t\/\/riporta msg zero risultati\n\t\t\t\tthis.setLoaded(0);\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/crea select per addon prodotto\n\t\t\taddAddonToSelect(opt = undefined == undefined ? undefined : {'idAddon':0,'index': 0,'idAddonCategory':0,'idLinkedCategory':0,'isNoCart':false,'label':'Lorem','description':'ipsum', 'price': '0'},wrapId = undefined == undefined ? undefined : '' ){\n\n\t\t\t\tlet fnName = 'ProductsList.addAddonToSelect';\n\n\t\t\t\tif(opt.index === -1){ \/\/option dummy per creare la select\n\n\t\t\t\t\tif(this.params.logEnabled){console.log(fnName + ':  prima predisposizione select senza options');}\n\n\t\t\t\t}\n\n\t\t\t\tif(opt.idAddon == undefined){ throw new Error(fnName+`: valore {idAddon} richiesto.`); }\n\t\t\t\tif(opt.index == undefined){ throw new Error(fnName+`: valore {index} richiesto.`); }\n\t\t\t\tif(opt.idAddonCategory == undefined){ throw new Error(fnName+`: valore {idAddonCategory} richiesto.`); }\n\t\t\t\tif(opt.idLinkedCategory == undefined){ throw new Error(fnName+`: valore {idLinkedCategory} richiesto.`); }\n\t\t\t\tif(opt.isNoCart == undefined){ throw new Error(fnName+`: valore {isNoCart} richiesto.`); }\n\t\t\t\t\/\/if(this.fetchedAddons.length == 0){ throw new Error(fnName+`: nessun addon fetchato.`); }\t\n \n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_addons';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tif(this.params.logEnabled){console.log(fnName + ':  verifico esistenza select addon con idAddon: '+opt.idAddon);}\n\n\t\t\t\tvar sel = (this.addonSelects.filter((s)=>{return s.dataset.idAddon == opt.idAddon;})[0] ?? undefined);\n\n\t\t\t\t\/\/CREA NUOVA SELECT PER PARENT\n\t\t\t\tif(sel == undefined){\n\n\t\t\t\t\t\/\/console.log('creazione nuova select');\n\n\t\t\t\t\tsel = document.createElement('select');\n\t\t\t\t\tsel.setAttribute('required',true);\n\t\t\t\t\tsel.classList.add('geoselector_res_addon');\n\t\t\t\t\tsel.dataset.idAddon = opt.idAddon;\n\t\t\t\t\tsel.dataset.idAddonBlock = opt.id_block;\n\n\t\t\t\t\t\/\/listener cambio addon - adatta gerarchia\n\t\t\t\t\tsel.addEventListener('change', async (e)=>{\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  addon selection changed\/reset'); }\n\n\t\t\t\t\t\t\/\/RIMOZIONE ADDON PRECEDENTI, SOLO UNO ALLA VOLTA AMMESSO\n\t\t\t\t\t\tthis.lastVisibleAddonSelVals = [];\n\n\t\t\t\t\t\tvar lastVisibleAddonSelVal = JSON.parse(sel.options[sel.selectedIndex].value);\n\t\t\t\t\t\tvar lastVisibleAddonSelValsIndex = this.lastVisibleAddonSelVals.findIndex((v)=>v.idAddon == opt.idAddon) ?? -1;\n\t\t\t\t\t\tif(lastVisibleAddonSelValsIndex < 0){ this.lastVisibleAddonSelVals.push( lastVisibleAddonSelVal ); }\n\t\t\t\t\t\telse{ this.lastVisibleAddonSelVals[lastVisibleAddonSelValsIndex] = lastVisibleAddonSelVal; }\n\n\t\t\t\t\t\t\/\/operazioni ulteriori\n\t\t\t\t\t\tawait this.onAddonSelected(e,sel,lastVisibleAddonSelVal);\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/console.log(fnName + ':  append nuova select');\n\t\t\t\t\twrapper.appendChild(sel);\n\t\t\t\t\tthis.addonSelects.push(sel); \n\n\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\/\/console.log(fnName + ':  creazione nuova option all');\n\t\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\t\tnewOpt.innerText = this.texts.selectVariation ?? 'seleziona variazione';\n\t\t\t\t\t\tnewOpt.value = '';\n\t\t\t\t\t\tnewOpt.setAttribute('disabled',true);\n\t\t\t\t\t\tnewOpt.setAttribute('selected',true);\n\t\t\t\t\t\tsel.prepend(newOpt);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\tvar lab = document.createElement('label');\n\t\t\t\t\t\tlab.innerText = this.texts.selectVariation;\n\t\t\t\t\t\twrapper.insertBefore(lab,sel);\n\n\t\t\t\t\t}\n\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t\t\/\/AGGIUNGI A SELECT ESISTENTE\n\t\t\t\tif(opt.index >= 0){\n\n\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  aggiungo addon a select: '+opt.label); }\n\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\tnewOpt.innerText = opt.label;\n\t\t\t\t\tnewOpt.value = JSON.stringify(opt);\n\t\t\t\t\tsel.appendChild(newOpt);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/caggiungi option \"no attribute found\"\n\t\t\taddNoAddonToSelect(idAddon = undefined,wrapId = undefined ){\n\n\n\t\t\t\tlet fnName = 'ProductsList.addNoCatToSelect';\n\t\t\t\t\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  aggiungo valore \"no category found\" a select'); }\n\n\t\t\t\tif(idAddon == undefined){ throw new Error(fnName+': valore idAddon richiesto.'); }\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_addons';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tvar sel = (this.addonSelects.filter((s)=>{return s.dataset.idAddon == idAddon;})[0] ?? undefined);\n\t\t\t\t\n\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\tnewOpt.innerText = this.texts.noResult;\n\t\t\t\tnewOpt.value = '';\n\t\t\t\tnewOpt.setAttribute('disabled', true);\n\t\t\t\tnewOpt.classList.add('no-result');\n\t\t\t\tsel.appendChild(newOpt);\n\t\t\t\t\n\t\t\t\t\/\/riporta msg zero risultati\n\t\t\t\tthis.setLoaded(0);\n\t\t\t\t\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/crea select per attributo prodotto\n\t\t\taddAttributeToSelect(opt = undefined == undefined ? undefined : {'idAttribute':0,'idLinkedCategory':0,'required':true,'nameAttribute':'lorem','value':'ipsum'},wrapId = undefined == undefined ? undefined : '' ){\n\n\n\t\t\t\tlet fnName = 'ProductsList.addAttributeToSelect';\n\n\t\t\t\tif(opt.value === -1){ \/\/option dummy per creare la select\n\n\t\t\t\t\tif(this.params.logEnabled){console.log(fnName + ':  prima predisposizione select senza options');}\n\n\t\t\t\t}\n\n\t\t\t\topt = opt != undefined ? opt : {'idAttribute':undefined,'nameAttribute':undefined,'value':undefined};\n\t\t\t\tif(opt.idAttribute == undefined){ throw new Error(fnName+`: valore {idAttribute} richiesto.`); }\n\t\t\t\tif(opt.nameAttribute == undefined){ throw new Error(fnName+`: valore {nameAttribute} richiesto.`); }\n\t\t\t\tif(opt.value == undefined){ throw new Error(fnName+`: valore {value} richiesto.`); }\n\t\t\t\tif(opt.idLinkedCategory == undefined){ throw new Error(fnName+`: valore {idLinkedCategory} richiesto.`); }\n\t\t\t\tif(opt.required == undefined){ throw new Error(fnName+`: valore {required} richiesto.`); }\n\t\t\t\t\/\/if(this.fetchedAttributes.length == 0){ throw new Error(fnName+`: nessun attributo fetchato.`); }\t\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_attrs';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tvar sel = (this.attributeSelects.filter((s)=>{return s.dataset.idAttribute == opt.idAttribute;})[0] ?? undefined);\n\n\t\t\t\t\/\/CREA NUOVA SELECT PER ATTRIBUTO\n\t\t\t\tif(sel == undefined){\n\n\t\t\t\t\t\/\/console.log('creazione nuova select');\n\n\t\t\t\t\tsel = document.createElement('select');\n\t\t\t\t\tsel.setAttribute('required',true);\n\t\t\t\t\tsel.classList.add('geoselector_res_attr');\n\t\t\t\t\tsel.dataset.idAttribute = opt.idAttribute;\n\t\t\t\t\tsel.dataset.nameAttribute = opt.nameAttribute;\n\t\t\t\t\tsel.dataset.required = opt.required;\n\n\t\t\t\t\t\/\/listener cambio categoria - adatta gerarchia\n\t\t\t\t\tsel.addEventListener('change', async (e)=>{\n\n\t\t\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  attribute selection changed\/reset'); }\n\n\t\t\t\t\t\tvar lastVisibleAttrSelVal = JSON.parse(sel.options[sel.selectedIndex].value);\n\t\t\t\t\t\tvar lastVisibleAttrSelValsIndex = this.lastVisibleAttrSelVals.findIndex((v)=>v.idAttribute == opt.idAttribute) ?? -1;\n\t\t\t\t\t\tif(lastVisibleAttrSelValsIndex < 0){ this.lastVisibleAttrSelVals.push( lastVisibleAttrSelVal ); }\n\t\t\t\t\t\telse{ this.lastVisibleAttrSelVals[lastVisibleAttrSelValsIndex] = lastVisibleAttrSelVal; }\n\n\t\t\t\t\t\n\t\t\t\t\t\t\/\/operazioni ulteriori\n\t\t\t\t\t\tawait this.onAttributeSelected(e,sel,lastVisibleAttrSelVal);\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/console.log(fnName + ':  append nuova select');\n\t\t\t\t\twrapper.appendChild(sel);\n\t\t\t\t\tthis.attributeSelects.push(sel); \n\n\t\t\t\t\t\/\/aggiunta option per selezionare tutti i valori\n\t\t\t\t\tif(1==1){\n\n\n\t\t\t\t\t\tif(!opt.required){\n\n\t\t\t\t\t\t\t\/\/console.log(fnName + ':  creazione nuova option all');\n\t\t\t\t\t\t\tif(this.params.logEnabled){console.log(fnName + ':  aggiunta option per selezione tutti valori');}\n\t\t\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\t\t\t\/\/newOpt.innerText = (this.texts.all ?? 'Tutto');\n\t\t\t\t\t\t\tnewOpt.innerText = (this.texts.selectsAttribute.find((a)=>a.idAttribute == opt.idAttribute) ?? ({'all':(this.texts.all ?? 'Tutto')})).all;\n\t\t\t\t\t\t\topt.value = 'A'; \/\/temporaneo per aggiunta\n\t\t\t\t\t\t\tnewOpt.value = JSON.stringify(opt);\n\t\t\t\t\t\t\tsel.prepend(newOpt);\n\t\t\t\t\t\t\topt.value = -1; \/\/reset\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/aggiunta option descrittiva\n\t\t\t\t\tif(1==1){\t\n\n\t\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\t\tnewOpt.innerText = (this.texts.selectsAttribute.find((a)=>a.idAttribute == opt.idAttribute) ?? (this.texts.selectsAttribute[0] ?? {'text':'seleziona attributo'})).text;\n\t\t\t\t\t\tnewOpt.value = '';\n\t\t\t\t\t\tnewOpt.setAttribute('disabled',true);\n\t\t\t\t\t\tnewOpt.setAttribute('selected',true);\n\t\t\t\t\t\tsel.prepend(newOpt);\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\t\/\/aggiunta label\n\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\tvar lab = document.createElement('label');\n\t\t\t\t\t\tlab.innerText = (this.texts.selectsAttribute.find((a)=>a.idAttribute == opt.idAttribute) ?? (this.texts.selectsAttribute[0] ?? {'text':'seleziona attributo'})).text;\n\t\t\t\t\t\twrapper.insertBefore(lab,sel);\n\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/aggiunta barra progresso\n\t\t\t\t\tif(1==1){\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar bar = document.createElement('div');\n\t\t\t\t\t\tvar fill = document.createElement('span');\n\t\t\t\t\t\tbar.classList.add('progress-bar');\n\t\t\t\t\t\tfill.classList.add('progress-bar-fill');\n\t\t\t\t\t\tfill.style.width = '8%';\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.attributeSelects[(this.attributeSelects.length - 1)].progressBar = bar;\n\t\t\t\t\t\tthis.attributeSelects[(this.attributeSelects.length - 1)].progressFill = fill;\n\t\t\t\t\t\t\n\t\t\t\t\t\tbar.appendChild(fill);\n\t\t\t\t\t\twrapper.insertBefore(bar,sel);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\n\t\t\t\t}\n\n\t\t\t\t\/\/AGGIUNGI A SELECT ESISTENTE\n\t\t\t\tif(opt.value != -1){\n\n\t\t\t\t\t\/\/if(this.params.logEnabled){ console.log(fnName + ':  aggiungo valore attributo a select: '+opt.value); }\n\t\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\t\tnewOpt.innerText = opt.value;\n\t\t\t\t\tnewOpt.value = JSON.stringify(opt);\n\t\t\t\t\t\n\t\t\t\t\t\/\/verifica posizione alfabeticamente\n\t\t\t\t\tvar selLen = sel.options.length;\n\t\t\t\t\tif(selLen == 0){  sel.appendChild(newOpt); return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\/\/ Start from the end and find where to insert\n\t\t\t\t\tfor(var p = (selLen - 1); p >= 0; p--){ \n\t\t\t\t\t\tvar v = (sel.options[p].value == '' || sel.options[p].value.includes('\"A\"')) ? '' : sel.options[p].innerText;\n\t\t\t\t\t\tif(newOpt.innerText.localeCompare(v) >= 0){ \n\t\t\t\t\t\t\tsel.options[p].after(newOpt);  \n\t\t\t\t\t\t\tbreak; \n\t\t\t\t\t\t}  \n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\t\n\t\t\t\/\/caggiungi option \"no attribute found\"\n\t\t\taddNoAttributeToSelect(idAttribute = undefined,wrapId = undefined ){\n\n\n\t\t\t\tlet fnName = 'ProductsList.addNoAttributeToSelect';\n\t\t\t\t\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ':  aggiungo valore \"no attribute found\" a select'); }\n\n\t\t\t\tif(idAttribute == undefined){ throw new Error(fnName+': valore idAttribute richiesto.'); }\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_attrs';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tvar sel = (this.attributeSelects.filter((s)=>{return s.dataset.idAttribute == idAttribute;})[0] ?? undefined);\n\t\t\t\t\n\t\t\t\tvar newOpt = document.createElement('option');\n\t\t\t\tnewOpt.innerText = this.texts.noResult;\n\t\t\t\tnewOpt.value = '';\n\t\t\t\tnewOpt.setAttribute('disabled', true);\n\t\t\t\tnewOpt.classList.add('no-result');\n\t\t\t\t\n\t\t\t\tsel.appendChild(newOpt);\n\t\t\t\t\n\t\t\t\t\/\/riporta msg zero risultati\n\t\t\t\tthis.setLoaded(0);\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\t\/\/aggiungi pulsante di submit dei filtri\n\t\t\taddSubmitButton(\n\t\t\t\twrapId = undefined == undefined ? undefined : ''\n\t\t\t\t,classNames = undefined == undefined ? undefined : []\n\t\t\t\t,innerText =  undefined == undefined ? undefined : ''\n\t\t\t\t,onClick = undefined == undefined ? undefined : ()=>{}\n\t\t\t){\n\n\t\t\t\tlet fnName = 'ProductsList.addSubmitButton';\n\n\t\t\t\tonClick = onClick != undefined ? onClick : this.onFilterSubmit;\n\t\t\t\tclassNames = classNames != undefined ? classNames : [];\n\t\t\t\tinnerText = innerText != undefined ? innerText : (this.texts.filtersSubmit ?? 'Effettua Ricerca');\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_filter_submit';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){ if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tlet btn = document.createElement('button');\n\t\t\t\tbtn.setAttribute('type','button');\n\t\t\t\tbtn.disabled = true;\n\t\t\t\tbtn.classList.add('processing'); \n\t\t\t\tbtn.innerText = innerText;\n\t\t\t\tclassNames.forEach((c)=>{btn.classList.add(c);});\n\t\t\t\tbtn.addEventListener('click',onClick);\n\t\t\t\twrapper.appendChild(btn);\n\n\t\t\t\tthis.submitButton = btn;\n\n\t\t\t}\n\n\t\t\t\/\/aggiungi pulsante di reset dei filtri\n\t\t\taddResetButton(\n\t\t\t\twrapId = undefined == undefined ? undefined : ''\n\t\t\t\t,classNames = undefined == undefined ? undefined : []\n\t\t\t\t,innerText =  undefined == undefined ? undefined : ''\n\t\t\t\t,onClick = undefined == undefined ? undefined : ()=>{}\n\t\t\t){\n\n\t\t\t\tlet fnName = 'ProductsList.addResetButton';\n\n\t\t\t\tonClick = onClick != undefined ? onClick : this.onFilterReset;\n\t\t\t\tclassNames = classNames != undefined ? classNames : [];\n\t\t\t\tinnerText = innerText != undefined ? innerText : (this.texts.filtersReset ?? 'Reset');\n\n\t\t\t\tif(wrapId == undefined){wrapId =  'geoselector_res_filter_reset';}\n\t\t\t\tlet wrapper = document.querySelector('#'+wrapId);\n\t\t\t\tif(wrapper == undefined){ if(this.params.logEnabled){ throw new Error(fnName + ':  wrapper non trovato: '+wrapId);} }\n\n\t\t\t\tlet btn = document.createElement('button');\n\t\t\t\tbtn.setAttribute('type','button');\n\t\t\t\tbtn.disabled = true;\n\t\t\t\tbtn.classList.add('processing'); \n\t\t\t\tbtn.innerText = innerText;\n\t\t\t\tclassNames.forEach((c)=>{btn.classList.add(c);});\n\t\t\t\tbtn.addEventListener('click',onClick);\n\t\t\t\twrapper.appendChild(btn);\n\n\t\t\t\tthis.resetButton = btn;\n\n\t\t\t}\n\n\t\t\t\/\/imposta stato caricamento completato\n\t\t\tsetLoaded(productCount = undefined == undefined ? undefined : 0, dataMsg = undefined == undefined ? undefined : ''){\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.listProducts: rimuovo classe loading');}\n\t\t\t\tdataMsg = dataMsg == undefined ? this.texts.startSearch : dataMsg;\n\t\t\t\t\/\/this.resWrap.classList.remove('loading');\n\t\t\t\tthis.resWrap.classList.remove('processing');\n\t\t\t\tthis.resWrap.style.setProperty('--scroll-offset', this.resWrap.scrollTop + 'px');\n\t\t\t\t\n\t\t\t\tif(productCount != undefined && productCount == 0){ this.setMsg(this.texts.noResult,true,'error');}\n\t\t\t\telse{ this.setMsg(); }\n\t\t\t\n\n\t\t\t\t\n\n\t\t\t};\n\n\t\t\t\/\/imposta stato caricamento in corso\n\t\t\tsetLoading(dataMsg = undefined == undefined ? undefined : '') {\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.listProducts: imposto classe loading');}\n\t\t\t\tdataMsg = dataMsg == undefined ? this.texts.loadingSearch : dataMsg;\n\t\t\t\t\/\/this.resWrap.classList.add('loading');\n\t\t\t\tthis.resWrap.classList.add('processing');\n\t\t\t\tthis.setMsg(dataMsg,false,'warning');\n\t\t\t\tthis.resWrap.style.setProperty('--scroll-offset', this.resWrap.scrollTop + 'px');\n\t\t\t};\n\n\t\t\t\/\/disabilita\/abilita\/imposta processing pulsanti ricerca\n\t\t\ttoggleFormButtons(status = undefined, buttons = ['resetButton','submitButton']){\n\n\t\t\t\tvar disable = (buttons)=>{\n\n\t\t\t\t\tif(buttons.length>1){ \n\t\t\t\t\t\t\/\/document.querySelector('#geoselector_res').classList.add('loading'); \n\t\t\t\t\t\tdocument.querySelector('#geoselector_res').classList.add('processing');\n\t\t\t\t\t}\n\n\t\t\t\t\tbuttons.forEach((b)=>{\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('productList.toggleFormButtons: disabilito pulsante ' + b);}\n\t\t\t\t\t\tthis[b].disabled = true;\n\t\t\t\t\t\tthis[b].classList.remove('processed');\n\t\t\t\t\t\tthis[b].classList.remove('processing'); \n\t\t\t\t\t\tthis[b].innerText = b == 'submitButton' ? this.texts.filtersSubmit : this.texts.filtersReset;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tvar enable = (buttons)=>{\n\n\t\t\t\t\tif(buttons.length>1){ \n\t\t\t\t\t\t\/\/document.querySelector('#geoselector_res').classList.remove('loading'); \n\t\t\t\t\t\tdocument.querySelector('#geoselector_res').classList.remove('processing'); \n\t\t\t\t\t}\n\n\t\t\t\t\tbuttons.forEach((b)=>{\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('productList.toggleFormButtons: abilito pulsante ' + b);}\n\t\t\t\t\t\tthis[b].disabled = false;\n\t\t\t\t\t\tthis[b].classList.remove('processed');\n\t\t\t\t\t\tthis[b].classList.remove('processing'); \n\t\t\t\t\t\tthis[b].innerText = b == 'submitButton' ? this.texts.filtersSubmit : this.texts.filtersReset;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tvar processing = (buttons)=>{\n\n\t\t\t\t\tif(buttons.length>1){ \n\t\t\t\t\t\t\/\/document.querySelector('#geoselector_res').classList.add('loading'); \n\t\t\t\t\t\tdocument.querySelector('#geoselector_res').classList.add('processing'); \n\t\t\t\t\t}\n\n\t\t\t\t\tbuttons.forEach((b)=>{\n\t\t\t\t\t\tif(this.params.logEnabled){console.log('productList.toggleFormButtons: imposto come processing pulsante ' + b);}\n\t\t\t\t\t\tthis[b].disabled = false;\n\t\t\t\t\t\tthis[b].classList.remove('processed');\n\t\t\t\t\t\tthis[b].classList.add('processing');\n\t\t\t\t\t\tthis[b].innerText = this.texts.loading;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tif(status === 'processing'){processing(buttons); return;}\n\t\t\t\tif(status === true){enable(buttons); return;}\n\t\t\t\tif(status === false){disable(buttons); return;}\t\t\t\n\n\t\t\t\tbuttons.forEach((b)=>{\n\n\t\t\t\t\tif(this[b].disabled == true){\n\t\t\t\t\t\tif( this[b].classList.contains('processing')){\n\n\t\t\t\t\t\t\tif(this.params.logEnabled){console.log('productList.toggleFormButtons: pulsante ' + b + ' ancora in stato processing');}\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdisable([b]);\n\t\t\t\t\t}\n\t\t\t\t\telse{enable([b]);}\n\t\t\t\t});\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/imposta messaggio di stato\/descrizione\n\t\t\tsetMsg(msg = undefined,autoReset = false,alertLevel='info'){\n\n\t\t\t\tclearTimeout(this.timeoutMsgReset);\n\t\t\t\t\n\t\t\t\tif(msg == undefined){ msg = this.texts.startSearch; }\n\t\t\t\t\n\t\t\t\tvar alertLevels = ['info','warning','error','success'];\n\t\t\t\talertLevel = alertLevels.indexOf(alertLevel) >= 0 ? alertLevel : 'info';\n\n\t\t\t\tthis.resWrap.setAttribute('data-msg', msg);\n\t\t\t\talertLevels.forEach((al)=>{ this.resWrap.classList.remove(al); });\n\t\t\t\tthis.resWrap.classList.add(alertLevel);\n\t\t\t\t\n\t\t\t\tif(autoReset){\n\t\t\t\t\tthis.timeoutMsgReset = setTimeout(()=>{\n\t\t\t\t\t\tthis.resWrap.setAttribute( 'data-msg', this.texts.startSearch );\n\t\t\t\t\t\talertLevels.forEach((al)=>{ this.resWrap.classList.remove(al); });\n\t\t\t\t\t\tthis.resWrap.classList.add('info');\n\t\t\t\t\t},this.timeoutMsgResetMS ); \n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t\/\/reset elenco prodotti\n\t\t\tresetProductsList(){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.resetProductsList: richiesto reset della lista prodotti');}\n\t\t\t\tthis.backgroundLoad(false); \/\/disattiva caricamento in background\n\t\t\t\tthis.resWrap.innerHTML = '';\n\t\t\t\tthis.resWrap.style.setProperty('--scroll-offset', '0px');\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\tremoveProductByProdId(id = undefined == undefined ? undefined : 0){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.removeProductByProdId: richiesta rimozione prodotto singolo');}\n\t\t\t\tif(id == undefined){return;}\n\n\t\t\t\tvar remProdsCount = 0;\n\t\t\t\tvar fetchedProducts = [];\n\t\t\t\tvar listedProds = this.resWrap.querySelectorAll('.geoselector_res_el');\n\t\t\t\tthis.fetchedProducts.forEach((p)=>{ if(p.id != id){fetchedProducts.push(p);} });\n\t\t\t\tthis.fetchedProducts = fetchedProducts;\n\t\t\t\tlistedProds.forEach((p)=>{if(p.dataset.id == id){p.remove(); remProdsCount++; }});\n\t\t\t\t\/\/console.log('ProductsList.removeProductByProdId: num prodotti rimossi: '+remProdsCount);\n\n\t\t\t\treturn remProdsCount;\n\n\t\t\t}\n\n\t\t\tremoveProductsByClassName(className = ''){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.removeProductsByClassName: richiesta rimozione prodotti con classe comune');}\n\t\t\t\tvar remProdsCount = 0;\n\t\t\t\tvar prodToRem = [];\n\t\t\t\tthis.resWrap.querySelectorAll('.'+className).forEach((p)=>{prodToRem.push(p);});\n\t\t\t\tprodToRem.forEach((p)=>{if(this.removeProductByProdId(p.dataset.id) > 0){remProdsCount++;} });\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.removeProductsByClassName: num prodotti rimossi: '+remProdsCount);}\n\n\t\t\t}\n\n\t\t\t\/\/resetta prodotti fetchati\n\t\t\tresetProducts(){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.resetProducts: richiesto reset dei prodotti fetchati');}\n\t\t\t\tthis.backgroundLoad(false); \/\/disattiva caricamento in background\n\t\t\t\tthis.fetchedProducts = [];\n\t\t\t\tthis.isLastFetcheableProductPageReached = false;\n\t\t\t\tthis.lastFetchedProductPage = 0;\n\t\t\t\tthis.fetchProductsHasError = false;\n\t\t\t\tthis.lastUrlFetchedProducts = '';\n\n\t\t\t}\n\n\t\t\t\/\/mostra\/nascondi select categoria\n\t\t\ttoggleCategoriesVisibility(show = undefined == undefined ? undefined : false){\n\n\t\t\t\tif(this.categoriesSelects.length == 0){return;}\n\n\t\t\t\tfor(var s of this.categoriesSelects){ \n\n\t\t\t\t\ts.selectedIndex = 0;\n\t\t\t\t\ts.dispatchEvent(new Event('change', { bubbles: true }));\n\n\t\t\t\t\tif(show === true){ s.parentElement.style.display = 'block'; continue; }\n\t\t\t\t\tif(show === false){ s.parentElement.style.display = 'none'; continue; }\n\n\t\t\t\t\tif(s.parentElement.style.display == 'none'){ s.parentElement.style.display = 'block'; continue; }\n\t\t\t\t\ts.parentElement.style.display = 'none';\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t\/\/seleziona automaticamente categoria e nascondi la select se unica e ha una sola opzione \n\t\t\t\/\/altrimenti mostra la select\n\t\t\tautoManageCategories(){\n\n\t\t\t\tif(this.categoriesSelects.length != 1 || this.categoriesSelects[0].options.length != 2 ){ this.toggleCategoriesVisibility(true); return;}\n\t\t\t\tif(this.categoriesSelects[0].options.length == this.categoriesSelects[0].querySelectorAll('option[value=\"\"][disabled]').length){return;}\n\t\t\t\t\n\t\t\t\tvar s = this.categoriesSelects[0];\n\t\t\t\tif(s.options.length == 2 && s.options[0].disabled){\n\t\t\t\t\ts.selectedIndex = 1;\n\t\t\t\t\ts.dispatchEvent(new Event('change', { bubbles: true })); \n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/mostra\/nascondi select variazione (addon)\n\t\t\ttoggleAddonsVisibility(show = undefined == undefined ? undefined : false, keepOption = false){\n\t\t\t\t\n\t\t\t\tif(this.addonSelects.length == 0){return;}\n\n\t\t\t\tfor(var s of this.addonSelects){ \n\n\t\t\t\t\tif(!keepOption){ s.selectedIndex = 0; }\n\n\t\t\t\t\tif(show === true){ s.parentElement.style.display = 'block'; continue; }\n\t\t\t\t\tif(show === false){ s.parentElement.style.display = 'none'; continue; }\n\n\t\t\t\t\tif(s.parentElement.style.display == 'none'){ s.parentElement.style.display = 'block'; continue; }\n\t\t\t\t\ts.parentElement.style.display = 'none';\n\n\t\t\t\t};\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/seleziona automaticamente variazione e nascondi la select se unica e ha una sola opzione \n\t\t\t\/\/altrimenti mostra la select\n\t\t\tautoManageAddons(){\n\n\t\t\t\tif(this.addonSelects.length != 1 || this.addonSelects[0].options.length != 2 ){ this.toggleAddonsVisibility(true); return;}\n\t\t\t\tif(this.addonSelects[0].options.length == this.addonSelects[0].querySelectorAll('option[value=\"\"][disabled]').length){return;}\n\t\t\t\t\n\t\t\t\tvar s = this.addonSelects[0];\n\t\t\t\tif(s.options.length == 2 && s.options[0].disabled){\n\t\t\t\t\ts.selectedIndex = 1;\n\t\t\t\t\tthis.toggleAddonsVisibility(false,true); \/\/nascondi variazione singola preselezionata, ma mantieni valore\n\t\t\t\t\ts.dispatchEvent(new Event('change', { bubbles: true })); \/\/necessario per popolamento lastVisible\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/seleziona automaticamente attributo se unica e ha una sola opzione\n\t\t\t\/\/TODO: NASCONDERE SELECT? AL MOMENTO PREVEDE SELEZIONE \"TUTTO\" SE OPZIONALE \n\t\t\tautoManageAttributes(){\n\n\t\t\t\tif(this.attributeSelects.length != 1 || this.attributeSelects[0].options.length != 2 ){return;}\n\t\t\t\tif(this.attributeSelects[0].options.length == this.attributeSelects[0].querySelectorAll('option[value=\"\"][disabled]').length){return;}\n\t\t\t\t\n\t\t\t\tvar s = this.attributeSelects[0];\n\t\t\t\tif(s.options.length == 2 && s.options[0].disabled){\n\t\t\t\t\ts.selectedIndex = 1;\n\t\t\t\t\t\/\/this.toggleAddonsVisibility(false,true); \/\/nascondi variazione singola preselezionata, ma mantieni valore\n\t\t\t\t\ts.dispatchEvent(new Event('change', { bubbles: true }));  \/\/necessario per popolamento lastVisible\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\t\/\/funzione per tentare pulizia nome categoria tecnica usata impropriamente\n\t\t\tfixTecnicaName(str) {\n\t\t\t\tlet hasUnderscore = str.includes('_');\n\t\t\t\tlet cleaned = str.replace(\/[-_]\/g, ' ');\n\t\t\t\tif (hasUnderscore) {\n\t\t\t\t\tcleaned = cleaned.replace(\/\\b(tecnica|modalita|acquisto|cartografia)\\b\/gi, '').replace(\/\\s{2,}\/g, ' ');\n\t\t\t\t}\n\t\t\t\tcleaned = cleaned.trim();\n\t\t\t\tif (cleaned) {\n\t\t\t\t\tcleaned = cleaned[0].toUpperCase() + cleaned.slice(1);\n\t\t\t\t}\n\t\t\t\treturn cleaned;\n\t\t\t}\n\t\t\t\n\t\t\t\/\/resetta categorie\n\t\t\tresetCategories(removeSelects = false){\n\t\t\t\t\n\t\t\t\tvar fnName = 'ProductsList.resetCategories';\n\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': richiesto reset delle categorie');}\n\t\t\t\tif(1==1){ this.toggleCategoriesVisibility(false); }\n\t\t\t\tthis.fetchedCategories = [];\n\t\t\t\tthis.lastVisibleCatSel = undefined;\n\t\t\t\tthis.lastVisibleCatSelVal = undefined;\n\t\t\t\t\n\t\t\t\tif( ! removeSelects ){ return; }\n\t\t\t\t\n\t\t\t\tif(this.params.logEnabled){ console.log(fnName + ': richiesta rimozione delle select, oltre a options'); }\n\t\t\t\t\n\t\t\t\tthis.categoriesSelects.forEach((s)=>{\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.classList.contains( 'progress-bar') ) { s.previousElementSibling.remove(); }\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.tagName.toLowerCase() === 'label') { s.previousElementSibling.remove();}\n\t\t\t\t\ts.remove();\n\t\t\t\t});\n\t\t\t\tthis.categoriesSelects = [];\n\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\t\/\/resetta addon \n\t\t\tresetAddons(){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.resetAddons: richiesto reset degli addon');}\n\t\t\t\tif(1==1){ this.toggleAddonsVisibility(false); }\n\t\t\t\tthis.fetchedAddons = [];\n\t\t\t\tthis.lastVisibleAddonSelVals = [];\n\t\t\t\tthis.addonSelects.forEach((s)=>{\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.classList.contains( 'progress-bar') ) { s.previousElementSibling.remove(); }\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.tagName.toLowerCase() === 'label') { s.previousElementSibling.remove();}\n\t\t\t\t\ts.remove();\n\t\t\t\t});\n\t\t\t\tthis.addonSelects = [];\n\t\t\t\t\n\t\t\t\t\n\n\t\t\t}\n\n\t\t\t\/\/resetta attributi\n\t\t\tresetAttributes(){\n\n\t\t\t\tif(this.params.logEnabled){ console.log('ProductsList.resetAttributes: richiesto reset degli attributi');}\n\t\t\t\tthis.fetchedAttributes = [];\n\t\t\t\tthis.lastVisibleAttrSelVals = [];\n\t\t\t\tthis.attributeSelects.forEach((s)=>{\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.classList.contains( 'progress-bar') ) { s.previousElementSibling.remove(); }\n\t\t\t\t\tif (s.previousElementSibling && s.previousElementSibling.tagName.toLowerCase() === 'label') { s.previousElementSibling.remove(); }\n\t\t\t\t\ts.remove();\n\t\t\t\t});\n\t\t\t\tthis.attributeSelects = [];\n\n\t\t\t}\n\n            \/\/reset totale\n            reset(){\n\n\t\t\t\tthis.setLoading();\n\t\t\t\tthis.ctrlFetchAttributeValueHasProducts.abort();\n\t\t\t\tthis.backgroundLoad(false);\n                this.resetProductsList();\n\t\t\t\tthis.resetProducts();\n\t\t\t\tthis.resetCategories(this.params.filterCatInGeometry);\n\t\t\t\tthis.resetAddons();\n\t\t\t\tthis.resetAttributes();\n\n\t\t\t\tthis.setLoaded();\n\t\t\t\t\n            }\n\t\t\t\n\t\t\t\/\/abort di tuttele fetch attive\n\t\t\tabortAll(){\n\t\t\t\t\n\t\t\t\tthis.ctrlFetchProducts.abort();\n\t\t\t\tthis.ctrlFetchCategoryHasProducts.abort();\n\t\t\t\tthis.ctrlFetchAttributeValueHasProducts.abort();\n\t\t\t\tthis.ctrlFetchCollectionProducts.abort();\n\t\t\t\tthis.ctrlFetchTemp.abort();\n\t\t\t\t\n\t\t\t}\n\n        }\n\n\n        <\/script>\n\n\t\t\n\t\t<script>\n\t\t\t\n\t\tclass IgmGeoSelector{\n\t\t\t\n\t\t\tconstructor( wrapperId = 'geoselector' ,params = undefined == undefined ? undefined : {},texts = undefined == undefined ? undefined : {} ){\n\t\t\t\t\n\t\t\t\tthis.debug = {};\n\t\t\t\tthis.isInitializing = true;\n\t\t\t\t\n\t\t\t\t\/\/modelli endpoint tileserver\n\t\t\t\tthis.tileServerEndpoints  = {\n\t\t\t\t\t\t\t\n\t\t\t\t\t'igm' : {\n\t\t\t\t\t\t'token':'4242'\n\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return 'http:\/\/34.77.177.243\/cgi-bin\/big_tiffer?iz={z}&ix={x}&iy={y}&key='+this.token; }\n\t\t\t\t\t}\n\n\t\t\t\t\t,'igm_proxy_php' : {\n\t\t\t\t\t\t'token':'4242'\n\t\t\t\t\t\t,'minZoom':9\n\t\t\t\t\t\t,'maxZoom':14\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return '\/wp-proxy\/custom\/v1\/be_api_proxy_selettore_geografico_tileserver?iz={z}&ix={x}&iy={y}&key='+this.token; }\n\t\t\t\t\t}\n\n\t\t\t\t\t,'igm_proxy_nginx' : {\n\t\t\t\t\t\t'token':'4242'\n\t\t\t\t\t\t,'minZoom':9\n\t\t\t\t\t\t,'maxZoom':14\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return '\/cgi-bin\/big_tiffer?iz={z}&ix={x}&iy={y}&key='+this.token; }\n\t\t\t\t\t}\n\n\t\t\t\t\t,'openstreetmap_base' : {\n\t\t\t\t\t\t'token':null\n\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png'; }\n\t\t\t\t\t}\n\n\t\t\t\t\t,'arcgis_bw' : {\n\t\t\t\t\t\t'token':null\n\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/Canvas\/World_Light_Gray_Base\/MapServer\/tile\/{z}\/{y}\/{x}'; }\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t,'google' : {\n\t\t\t\t\t\t'token':''\n\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t,'maxBounds' : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/mt1.google.com\/vt\/lyrs=m&x={x}&y={y}&z={z}&key='+this.token; }\n\t\t\t\t\t}\n\t\t\t\t\t,'mapbox' : {\n\t\t\t\t\t\t'token':'pk.eyJ1IjoiY3Jpa2ZpbGlwcG8iLCJhIjoiY202dHVrZHhxMDBjbTJxczRsZXczaWEwNiJ9._kBSOhOeLd_AfUIDgAhDqg'\n\t\t\t\t\t\t,'minZoom':7\n\t\t\t\t\t\t,'maxZoom':15\n\t\t\t\t\t\t,maxBounds : [ [35.0, 5.5], [48.0, 25.0] ] \/\/ Sud-Ovest a Nord-Est Italia\n\t\t\t\t\t\t,'centerCoordinates':[41.535712,12.324200]\n\t\t\t\t\t\t,getUrl : function(){ return 'https:\/\/api.mapbox.com\/styles\/v1\/mapbox\/streets-v11\/tiles\/{z}\/{x}\/{y}?access_token='+this.token; }\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t\/\/modelli endpoint geocoding\n\t\t\t\tthis.geoCodingEndpoints = {\n\t\t\t\t\t\t\n\t\t\t\t\t'nominatim' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t'token' : null\n\t\t\t\t\t\t,'limitResults' : 5\n\t\t\t\t\t\t,'code_EPSG' : 'EPSG:4326'\n\t\t\t\t\t\t,getUrl : function(query = 'roma'){ \n\t\t\t\t\t\t\treturn  `https:\/\/nominatim.openstreetmap.org\/search?format=geocodejson&limit=${this.limitResults}&q=${query}`; \n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t,'igm' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t'token' : null\n\t\t\t\t\t\t,'limitResults' : 5\n\t\t\t\t\t\t,'code_EPSG' : 'EPSG:3857'\n\t\t\t\t\t\t,getUrl : function(query = 'roma'){ \n\t\t\t\t\t\t\treturn  `http:\/\/34.77.177.243\/porta-magna\/secret\/geocoder?n=${this.limitResults}&q=${query}`; \n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t,'igm_proxy_php' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t'token' : null\n\t\t\t\t\t\t,'limitResults' : 5\n\t\t\t\t\t\t,'code_EPSG' : 'EPSG:3857'\n\t\t\t\t\t\t,getUrl : function(query = 'roma'){ \n\t\t\t\t\t\t\treturn  `\/wp-proxy\/custom\/v1\/be_api_proxy_selettore_geografico_geocode?n=${this.limitResults}&q=${query}`; \n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t,'igm_proxy_nginx' : {\n\t\t\t\t\t\t\n\t\t\t\t\t\t'token' : null\n\t\t\t\t\t\t,'limitResults' : 5\n\t\t\t\t\t\t,'code_EPSG' : 'EPSG:3857'\n\t\t\t\t\t\t,getUrl : function(query = 'roma'){ \n\t\t\t\t\t\t\treturn  `\/porta-magna\/geocoder?n=${this.limitResults}&q=${query}`; \n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t};\n\t\n\t\t\t\tthis.params = params ?? {};\n\t\t\t\t\n\t\t\t\tthis.texts = texts ?? {};\n\n\t\t\t\t\/\/INIZIALIZZA MAPPA LEAFLET\n\t\t\t\tif(1==1){\n\n\t\t\t\t\tthis.mapSearch = {};\n\t\t\t\t\tthis.mapSearch.dom = document.querySelector('#geoselector_map');\n\t\t\t\t\tthis.mapSearch.geoSelector = new GeoSelector('geoselector_map',this.params.mapSearch.GeoSelector,this.texts.mapSearch.GeoSelector);\n\n\n\t\t\t\t\t\/\/LISTENER VARI\n\t\t\t\n\t\t\t\t\t\/\/evidenzia pulsanti attivi\n\t\t\t\t\tthis.mapSearch.geoSelector.map.on('draw:drawstart', (e) => {\n\n\t\t\t\t\t\tif(e.layerType == 'rectangle' && !this.btnDrawPolygon.classList.contains('active_btn')){ this.btnDrawPolygon.classList.add('active_btn'); }\n\t\t\t\t\t\telse if(e.layerType == 'marker' && !this.btnDrawPoint.classList.contains('active_btn')){ this.btnDrawPoint.classList.add('active_btn'); }\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/de-evidenzia pulsanti non pi\u00f9 attivi\n\t\t\t\t\tthis.mapSearch.geoSelector.map.on('draw:drawstop', (e) => {\n\n\t\t\t\t\t\tthis.btnDrawPolygon.classList.remove('active_btn');\n\t\t\t\t\t\tthis.btnDrawPoint.classList.remove('active_btn');\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/se tutto rimosso con pulsante dedicato\n\t\t\t\t\tthis.mapSearch.geoSelector.map.on('removeAll', async (e) => {\n\n\t\t\t\t\t\t\/\/stoppa eventuale autoload in corso\n\t\t\t\t\t\tif(this.mapSearch.geoSelector.params.logEnabled){ console.log('GeoSelector.removeAll: richiedo disattivazione backgroundLoad'); }\n\t\t\t\t\t\tawait this.prdSearch.productsList.backgroundLoad(false);\n\n\t\t\t\t\t\tif(this.mapSearch.geoSelector.params.logEnabled){ console.log('GeoSelector.removeAll: rimozione prodotti in elenco'); }\n\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProductsList();\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProducts();\n\n\t\t\t\t\t\tthis.setInpSelectedAreaValue(''); \/\/pulisci area selezionata\n\t\t\t\t\t\tthis.prdSearch.productsList.reset(); \/\/pulisci prodotti\n\n\t\t\t\t\t\t\/\/reset zoom\n\t\t\t\t\t\tthis.mapSearch.geoSelector.map.setZoom(this.mapSearch.geoSelector.map.getMinZoom());\n\n\t\t\t\t\t\t\/\/rimozione eventuali disegni residui \n\t\t\t\t\t\t\/*\n\t\t\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t\t\tif(this.mapSearch.geoSelector.params.logEnabled){ console.log('GeoSelector.removeAll: seconda rimozione prodotti elenco differita'); }\n\t\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList();\n\t\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts();\n\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t*\/\n\t\t\t\t\t\t\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/se poligoni rimossi\n\t\t\t\t\tthis.mapSearch.geoSelector.map.on('removeAllPolygons', (e) => {\n\n\t\t\t\t\t\tif(\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.polygons.user.length == 0 \n\t\t\t\t\t\t\t&& this.mapSearch.geoSelector.points.user.length == 0\n\t\t\t\t\t\t\t&& this.mapSearch.geoSelector.polygons.locations.length == 0 \n\t\t\t\t\t\t\t&& this.mapSearch.geoSelector.points.locations.length == 0\n\t\t\t\t\t\t ){\n\t\t\t\t\t\t\tthis.setInpSelectedAreaValue('');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\/\/se punti rimossi\n\t\t\t\t\tthis.mapSearch.geoSelector.map.on('removeAllPoints', (e) => {\n\n\t\t\t\t\t\tif(\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.polygons.user.length == 0 \n\t\t\t\t\t\t   \t&& this.mapSearch.geoSelector.points.user.length == 0\n\t\t\t\t\t\t\t&& this.mapSearch.geoSelector.polygons.locations.length == 0 \n\t\t\t\t\t\t   \t&& this.mapSearch.geoSelector.points.locations.length == 0\n\t\t\t\t\t\t ){\n\t\t\t\t\t\t\tthis.setInpSelectedAreaValue('');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\t\t\t\t\t\n\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/INIZIALIZZA SEZIONE RISULTATI\n\t\t\t\tif(1==1){\n\n\t\t\t\t\tthis.prdSearch = {};\n\t\t\t\t\tthis.prdSearch.productsList = new ProductsList('geoselector_res_els',this.params.prdSearch.ProductsList,this.texts.prdSearch.ProductsList);\n\t\t\t\t\tthis.prdSearch.dom = this.prdSearch.productsList.resWrap;\n\t\t\t\t\t\n\t\t\t\t\t\/\/funzione a listing prodotti : RIMUOVI DISEGNI RISULTATI E PRD SELEZIONATI\n\t\t\t\t\t\/\/eseguita solo se argomento listProducts(onListProducts) \u00e8 undefined\n\t\t\t\t\tthis.prdSearch.productsList.setOnListProducts( () => { \n\n\t\t\t\t\t\t\/\/rimuovi poligoni prodotto precedenti\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['listed','products','layers']);\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['listed','products','layers']);\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a prodotto aggiunto a lista \n\t\t\t\t\t\/\/eseguita solo se argomento listProducts(onProductAdded) \u00e8 undefined\n\t\t\t\t\tthis.prdSearch.productsList.setOnProductAdded( (addedProd) => { \n\n\n\t\t\t\t\t\tif(addedProd.dataset.geometry == undefined || addedProd.dataset.geometry == 'undefined'){ console.log('prdSearch.productsList: il prodotto non ha geometria'); return;}\n\n\t\t\t\t\t\t\/\/se non c'\u00e8 layer, disegna geometria prodotto su mappa\n\t\t\t\t\t\t\/\/this.mapSearch.geoSelector.drawProductWkt(addedProd.dataset.geometry,'listed',false,false,false); \n\n\t\t\t\t\t\t\/\/aggiungi popup immagine\n\t\t\t\t\t\tvar img = addedProd.querySelector('.geoselector_res_img');\n\t\t\t\t\t\tif (img) {\n\t\t\t\t\t\t\tvar imgWrap = document.createElement('div');\n\t\t\t\t\t\t\tvar imgLowQualityNote = document.createElement('p');\n\t\t\t\t\t\t\tvar imgClone = img.cloneNode(true);\n\t\t\t\t\t\t\timg.id = addedProd.id + \"_thumbnail\";\n\t\t\t\t\t\t\timgClone.classList.add('geoselector_res_img_popup');\n\t\t\t\t\t\t\timgLowQualityNote.innerText = this.prdSearch.productsList.texts.lowQualityImage;\n\t\t\t\t\t\t\timgLowQualityNote.classList.add('geoselector_res_img_popup_low_quality_note');\n\t\t\t\t\t\t\timgWrap.id = addedProd.id + \"_img_popup\";\n\t\t\t\t\t\t\timgWrap.appendChild(imgLowQualityNote);\n\t\t\t\t\t\t\timgWrap.appendChild(imgClone);\n\t\t\t\t\t\t\taddedProd.appendChild(imgWrap);\n\t\t\t\t\t\t\tnew CssPopup(imgWrap.id, {'customTriggerId':img.id}, {'title':(addedProd.querySelector('.geoselector_res_desc')?.innerText ?? ''),'description' : '','buttonClose':this.texts.prdSearch.CssPopup.buttonClose });\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a richiesta geometria prodotto (button)\n\t\t\t\t\tthis.prdSearch.productsList.setOnProductDrawRequest( async (addedProd) => {\n\n\t\t\t\t\t\t\/\/PARAMETRI CATEGORIA PRODOTTO\n\t\t\t\t\t\tvar catParams = this.prdSearch.productsList.params.filterCategories.filter((c)=>{\n\t\t\t\t\t\t\treturn c.id == (this.prdSearch.productsList.lastVisibleCatSelVal ?? -1); \n\t\t\t\t\t\t} )[0] ?? {};\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/CENTRA E ZOOMMA\n\n\t\t\t\t\t\tvar center = true; \/\/this.mapSearch.geoSelector.getCurrentDraw() == undefined ? true : false; \n\t\t\t\t\t\tvar zoom = catParams.autoZoom ?? false; \/\/this.mapSearch.geoSelector.getCurrentDraw() == undefined ? true : false; \n\t\t\t\t\t\tvar bringToFront = true;\n\t\t\t\t\t\tvar highlightMarker = true;\n\t\t\t\t\t\tif(this.mapSearch.geoSelector.associatedLayerIndex >= 0){highlightMarker = false;} \/\/layer non richiede highlighting\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/AGGIUGI MARKER\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(addedProd.dataset.geometry != undefined && addedProd.dataset.geometry != 'undefined'){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawProductWkt(addedProd.dataset.geometry,'products',true,center,zoom,bringToFront,highlightMarker); \n\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onProductDrawRequest: disegno geometria prodotto : ' + addedProd.dataset.geometry); }\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/rimuovi pulsante attivo precedente\n\t\t\t\t\t\tthis.prdSearch.dom.querySelectorAll('.geoselector_res_geom.processed').forEach((btn)=>{btn.classList.remove('processed')});\n\n\t\t\t\t\t\t\/\/imposta pulsante come attivo\n\t\t\t\t\t\tvar btn = addedProd.querySelector('.geoselector_res_geom');\n\t\t\t\t\t\tbtn.classList.add('processed');\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/----------\n\t\t\t\t\t\t\/\/GESTIONE COLLEZIONI\n\t\t\t\t\t\t\/\/----------\n\n\t\t\t\t\t\t\/\/rimuovi classi loader e collection precedenti\n\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.querySelectorAll('.collectionLoader').forEach((p)=>{p.classList.remove('collectionLoader');});\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resWrap.querySelectorAll('.collection').forEach((p)=>{p.classList.remove('collection');});\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se gi\u00e0 caricata\n\t\t\t\t\t\tif(addedProd.classList.contains('collection')){\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductDrawRequest: collezione prodotto gi\u00e0 caricata');} \n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\/\/ottieni prodotti collezione\n\t\t\t\t\t\tif(addedProd.dataset.collection == undefined || addedProd.dataset.collection == 'undefined'){ if(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductDrawRequest: il prodotto non ha collezione');} return;}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.setLoading(this.prdSearch.productsList.texts.loadingCollection);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/collezioni in stessa zona \n\t\t\t\t\t\tvar wkt = undefined;\n\t\t\t\t\t\tif(1 == 1){\n\t\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\t\t\t\t\t\t\tvar wkt = latlng == undefined ? undefined :  this.mapSearch.geoSelector.latlngToWkt(latlng);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar srcCategories = (this.prdSearch.productsList.lastVisibleCatSelVal == 'A' ? undefined : ([this.prdSearch.productsList.lastVisibleCatSelVal ?? undefined])); \/\/mantieni categorie selezionate\n\n\t\t\t\t\t\tvar srcTag = undefined;\n\t\t\t\t\t\tif(srcCategories != undefined && srcCategories[0] != undefined){\n\t\t\t\t\t\t\tsrcTag = this.prdSearch.productsList.params.filterCategories.filter((c)=>c.id == srcCategories[0])[0]?.idCustomTag ?? undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar srcAttributesNames = ['pa_collezione'];\n\t\t\t\t\t\tvar srcAttributesValues = [addedProd.dataset.collection];\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.lastVisibleAttrSelVals.forEach((a)=>{\n\n\t\t\t\t\t\t\tif(a.value == 'A'){return;}\n\t\t\t\t\t\t\tsrcAttributesNames.push(a.nameAttribute);\n\t\t\t\t\t\t\tsrcAttributesValues.push(a.value);\n\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tvar collectionFetchedProducts = await this.prdSearch.productsList.fetchProducts(\n\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \/\/geometria\n\t\t\t\t\t\t\t\/*srcCategories*\/ srcCategories, \/\/categorie prodotto\n\t\t\t\t\t\t\t\/*srcTag*\/ srcTag, \/\/tag prodotto  (undefined mantiene valore di classe)\n\t\t\t\t\t\t\t\/*srcAttrNames*\/ srcAttributesNames, \/\/nome attributo -> collezione\n\t\t\t\t\t\t\t\/*srcAttrVals*\/ srcAttributesValues, \/\/val attributo -> collezione\n\t\t\t\t\t\t\t\/*pageNum*\/ 1, \/\/numero pagina (undefined mantiene valore di classe)\n\t\t\t\t\t\t\t\/*resNum*\/ 25, \/\/prod per pagina (undefined mantiene valore di classe)\n\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ false, \/\/false: la funzione non \u00e8 invocata da autoloader\n\t\t\t\t\t\t\t\/*isAtomic*\/ true, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchCollectionProducts\n\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductDrawRequest: geometrie collezione trovate: '+collectionFetchedProducts.length);} \t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/rimuovi collezioni precedenti\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['collection']);\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.removeProductsByClassName('collection');\n\n\t\t\t\t\t\t\/\/rimuovi classi collection precedenti\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resWrap.querySelectorAll('.collectionLoader').forEach((p)=>{p.classList.remove('collectionLoader');});\n\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.querySelectorAll('.collection').forEach((p)=>{p.classList.remove('collection');});\n\n\t\t\t\t\t\t\/\/aggiungi classe loader\n\t\t\t\t\t\taddedProd.classList.add('collectionLoader');\n\n\t\t\t\t\t\t\/\/aggiungi prodotti collezione e assegna classe collection\n\t\t\t\t\t\tthis.prdSearch.productsList.listProducts(\n\t\t\t\t\t\t\tcollectionFetchedProducts\n\t\t\t\t\t\t\t,()=>{},\n\t\t\t\t\t\t\t(addedProdColl)=>{\n\t\t\t\t\t\t\t\tif(addedProdColl.dataset.geometry == undefined || addedProdColl.dataset.geometry == 'undefined'){ if(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductDrawRequest: il prodotto non ha geometria');} return;}\n\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawProductWkt(addedProdColl.dataset.geometry,'collection',false,false,false); \n\t\t\t\t\t\t\t\taddedProdColl.classList.add('collection'); \/\/solo prodotti aggiunti per collezione, non gi\u00e0 presenti in elenco\n\t\t\t\t\t\t\t\t\/\/addedProdColl.dataset.originalOrder = addedProdColl.style.order; \/\/salva ordine precedente\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t,addedProd.dataset.id \/\/id oltre il quale aggiungere prodotto\n\t\t\t\t\t\t\t,'collection' \/\/classe sempre aggiunta a prodotto nuovo\/esistente\n\t\t\t\t\t\t\t,addedProd.style.order \/\/ordine collezione aggiunto sempre a prodotto nuovo\/esistente\n\t\t\t\t\t\t);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/aggiungi poligoni a array collection\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor( var cp of collectionFetchedProducts ){\n\t\t\t\t\t\t\tif( addedProd.dataset.id == cp.id) { continue; } \/\/scarta prodotto stesso\n\t\t\t\t\t\t\tvar wkt = (cp.attributes ?? []).filter(a=>a.name == 'geometria')[0]?.options[0] ?? null;\n\t\t\t\t\t\t\tif(cp == null){ continue; }\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawProductWkt(wkt,'collection',false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.setLoaded();\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a richiesta aggiunta prodotto a carrello (button)\n\t\t\t\t\tthis.prdSearch.productsList.setOnProductCartRequest( async (addedProd) => {\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductCartRequest: richiesta aggiunta a carrello');}\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.lastVisibleAddonSelVals[0]?.isNoCart ?? false){\n\t\t\t\t\t\t\talert(this.prdSearch.productsList.texts.addonNoCart);\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductCartRequest: addon non consente aggiunta a carrello');}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tvar btn = addedProd.querySelector('.geoselector_res_cart');\n\t\t\t\t\t\tbtn.classList.add('processing');\n\n\t\t\t\t\t\tvar formData = new URLSearchParams();\n\t\t\t\t\t\tformData.append('product_id', addedProd.dataset.id);\n\t\t\t\t\t\tformData.append('quantity', 1);\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.lastVisibleAddonSelVals.length > 0){\n\t\t\t\t\t\t\tformData.append('yith_wapo[]['+ this.prdSearch.productsList.lastVisibleAddonSelVals[0].idAddon +']', this.prdSearch.productsList.lastVisibleAddonSelVals[0].index); \/\/ addon\n\t\t\t\t\t\t\tformData.append('yith_wapo_product_id', addedProd.dataset.id);\n\t\t\t\t\t\t\tformData.append('yith_wapo_product_img', '');\n\t\t\t\t\t\t\tformData.append('yith_wapo_is_single', 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar res = await fetch('\/?wc-ajax=add_to_cart', {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t'Content-Type': 'application\/x-www-form-urlencoded',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbody: formData\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar data = await res.json();\n\t\t\t\t\t\tbtn.classList.remove('processing');\n\n\t\t\t\t\t\tvar notices = [];\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tvar notices = await fetch('\/?wc-ajax=my_get_wc_notices', { method: 'GET' });\n\t\t\t\t\t\t\tnotices = await notices.json();\n\t\t\t\t\t\t\tnotices = notices?.data?.notices_html ?? '';\n\t\t\t\t\t\t\tif ( ! Array.isArray(notices) ){ notices = [ notices ]; }\n\t\t\t\t\t\t}catch(e){notices = [];}\n\n\t\t\t\t\t\tif((data.error ?? false) == false){\n\t\t\t\t\t\t\tbtn.classList.add('processed');\n\t\t\t\t\t\t\twindow.setTimeout(()=>{btn.classList.remove('processed');},2000);\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductCartRequest: prodotto aggiunto a carrello',data);}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tbtn.classList.add('not_processed');\n\t\t\t\t\t\t\twindow.setTimeout(()=>{btn.classList.remove('not_processed');},2000);\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductCartRequest: errore aggiunta a carrello',data,formData.toString());}\n\t\t\t\t\t\t\tif(notices.length == 0){ notices.push(\"\\n<ul class=\\\"woocommerce-error\\\" role=\\\"alert\\\">\\n\\t\\t\\t<li>\\n\\t\\t\\tError.\\t\\t<\/li>\\n\\t<\/ul>\\n\");}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.onProductCartRequest: messaggi aggiunta a carrello',notices);}\n\n\t\t\t\t\t\tnotices.forEach((notice)=>{\n\n\t\t\t\t\t\t\tvar msgs = [notice];\n\n\t\t\t\t\t\t\t\/\/verifica se \u00e8 una lista di errori e scomponi\n\t\t\t\t\t\t\tvar tempContainer = document.createElement('div');\n\t\t\t\t\t\t\ttempContainer.innerHTML = notice;\n\t\t\t\t\t\t\tvar ul = tempContainer.querySelector('ul.woocommerce-error');\n\t\t\t\t\t\t\tvar lis = [];\n\t\t\t\t\t\t\tif (ul) { lis = Array.from(ul.querySelectorAll('li')); }\n\t\t\t\t\t\t\tif (lis.length > 1) {\n\t\t\t\t\t\t\t\tmsgs = lis.map(li => {\n\t\t\t\t\t\t\t\t\tvar newUl = ul.cloneNode(false);\n\t\t\t\t\t\t\t\t\tnewUl.appendChild(li.cloneNode(true)); \/\/ aggiungi una copia del singolo li\n\t\t\t\t\t\t\t\t\treturn newUl.outerHTML;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar msgCollection = [];\n\n\t\t\t\t\t\t\t\/\/crea elemento messaggio \n\t\t\t\t\t\t\tfor(var [m,msg] of msgs.entries()){\n\n\t\t\t\t\t\t\t\t\/\/calcolo distanza altri messaggi da top\n\t\t\t\t\t\t\t\tvar topDistance = 70;\n\t\t\t\t\t\t\t\tdocument.querySelectorAll('.floating-wc-msg:last-child').forEach((existingMsg)=>{\n\n\t\t\t\t\t\t\t\t\tvar height = 0;\n\t\t\t\t\t\t\t\t\tvar top = 0;\n\t\t\t\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\t\t\t\ttop = parseInt(window.getComputedStyle(existingMsg).top.replace('px',''));\n\t\t\t\t\t\t\t\t\t\theight = parseInt(window.getComputedStyle(existingMsg).height.replace('px','')); \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch(e){ height = 0; top = 0; }\n\t\t\t\t\t\t\t\t\ttopDistance = top + height + 5;\n\n\t\t\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t\t\tvar divMsg = document.createElement('div');\n\t\t\t\t\t\t\t\tdivMsg.innerHTML = msg;\n\t\t\t\t\t\t\t\tdivMsg.classList.add('floating-wc-msg');\n\t\t\t\t\t\t\t\tdivMsg.dataset.msgCollection = m;\n\t\t\t\t\t\t\t\tdivMsg.style.position = 'fixed';\n\t\t\t\t\t\t\t\tdivMsg.style.zIndex = '999';\n\t\t\t\t\t\t\t\tdivMsg.style.top = topDistance + 'px';\n\t\t\t\t\t\t\t\tdivMsg.style.right = '20px';\n\t\t\t\t\t\t\t\tdivMsg.style.width = '280px';\n\n\t\t\t\t\t\t\t\tdocument.body.appendChild(divMsg);\n\n\t\t\t\t\t\t\t\tmsgCollection.push(m);\n\n\t\t\t\t\t\t\t\t\/\/console.error('aggiungo messaggio: '+m); \n\n\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tmsgCollection.forEach((m)=>{ window.setTimeout(()=>{\n\t\t\t\t\t\t\t\t\/\/console.error('rimuovo messaggio: '+m); \n\t\t\t\t\t\t\t\tdocument.querySelector('[data-msg-collection=\"'+m+'\"]').remove();}, (2000 + (m * 100)) ); \n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/aggiornamento popup carrello in header\n\t\t\t\t\t\tthis.refreshHeaderCart();\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione eseguita a cambio valori categoria (imposta attributi e addon)\n\t\t\t\t\tthis.prdSearch.productsList.setOnCategorySelected( async (changeEvent, selectInput, selectedValue) => {\n\n\t\t\t\t\t\t\/\/disabilita pulsanti\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleFormButtons('processing');\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort tutte le fetch\n\t\t\t\t\t\tthis.prdSearch.productsList.abortAll();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/pulisci prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/rimuovi geometrie prodotto\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['products','collection','listed','layers']);\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['products','collection','listed','layers']);\n\n\t\t\t\t\t\t\/\/rimuovi addon e attributes\n\t\t\t\t\t\tthis.prdSearch.productsList.resetAddons();\n\t\t\t\t\t\tthis.prdSearch.productsList.resetAttributes();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/-------------------------\n\t\t\t\t\t\t\/\/ottenimento addon \n\t\t\t\t\t\t\/\/caricati prima causa tempi caricamento attributi\n\t\t\t\t\t\t\/\/-----------------------\n\n\t\t\t\t\t\tif(1==1){\n\n\n\t\t\t\t\t\t\tvar filterAddons = this.params.prdSearch.ProductsList.filterAddons.filter((filterAddon)=>filterAddon.idLinkedCategory == selectedValue);\n\t\t\t\t\t\t\tif(filterAddons.length > 0){\t\n\t\t\t\t\t\t\t\tfor (const filterAddon of filterAddons) {\n\n\t\t\t\t\t\t\t\t\t\/\/predisposizione select vuota\n\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.addAddonToSelect({\"idAddon\":filterAddon.idAddon,\"index\": -1,\"idAddonCategory\":filterAddon.idAddonCategory,\"idLinkedCategory\":filterAddon.idLinkedCategory,isNoCart:false,\"label\":\"Lorem\",\"description\":\"ipsum\", \"price\": \"0\"}); \n\n\t\t\t\t\t\t\t\t\tawait this.prdSearch.productsList.fetchAddons(\n\t\t\t\t\t\t\t\t\t\tfilterAddon.idAddonCategory,\n\t\t\t\t\t\t\t\t\t\tfilterAddon.idLinkedCategory,\n\t\t\t\t\t\t\t\t\t\tfilterAddon.noCartIndexes,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tvar linkedAddons = this.prdSearch.productsList.fetchedAddons;\n\t\t\t\t\t\t\t\tif(this.params.prdSearch.ProductsList.logEnabled){console.log('productsList.setOnCategorySelected: ottenuti i seguenti addon: '+JSON.stringify(linkedAddons));}\n\t\t\t\t\t\t\t\tlinkedAddons.forEach((linkedAddon)=>{\n\t\t\t\t\t\t\t\t\tlinkedAddon.options.forEach((adnOpt)=>{\n\t\t\t\t\t\t\t\t\t\tadnOpt.idAddon = linkedAddon.id;\n\t\t\t\t\t\t\t\t\t\tadnOpt.idLinkedCategory = linkedAddon.idLinkedCategory;\n\t\t\t\t\t\t\t\t\t\tadnOpt.idAddonCategory = linkedAddon.idAddonCategory;\n\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.addAddonToSelect(adnOpt); \n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\tif(this.params.prdSearch.ProductsList.logEnabled){console.log('productsList.setOnCategorySelected: nessun addon associato alla categoria');}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\/\/gestione automatica preselezione addon\n\t\t\t\t\t\t\tthis.prdSearch.productsList.autoManageAddons(); \n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\t\t\/\/-------------------------\n\t\t\t\t\t\t\/\/ottenimento valori attributi\n\t\t\t\t\t\t\/\/-----------------------\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (1==1){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar filterAttributes = this.params.prdSearch.ProductsList.filterAttributes.filter((filterAttribute)=>filterAttribute.idLinkedCategory == selectedValue);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(filterAttributes.length > 0){\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\/\/ottieni tutti i valori per attributo e filtra inferiori a valore minimo\n\t\t\t\t\t\t\t\tfor (var [fa,filterAttribute] of filterAttributes.entries()) {\n\n\t\t\t\t\t\t\t\t\t\/\/predisposizione select vuota\n\t\t\t\t\t\t\t\t\tif(fa == 0){\n\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.addAttributeToSelect( {\n\t\t\t\t\t\t\t\t\t\t\t'idAttribute':filterAttribute.id\n\t\t\t\t\t\t\t\t\t\t\t,\"idLinkedCategory\":filterAttribute.idLinkedCategory\n\t\t\t\t\t\t\t\t\t\t\t,\"required\":filterAttribute.required\n\t\t\t\t\t\t\t\t\t\t\t,'nameAttribute': (filterAttribute.slug ?? filterAttribute.name)\n\t\t\t\t\t\t\t\t\t\t\t,'value':-1\n\t\t\t\t\t\t\t\t\t\t}); \n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tawait this.prdSearch.productsList.fetchAttributes(\n\t\t\t\t\t\t\t\t\t\tfilterAttribute.id,\n\t\t\t\t\t\t\t\t\t\tfilterAttribute.idLinkedCategory,\n\t\t\t\t\t\t\t\t\t\tfilterAttribute.required\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\/\/rimozione valori inferiori\n\t\t\t\t\t\t\t\t\tif(filterAttribute.startNumberValue != undefined){\n\n\t\t\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ \n\t\t\t\t\t\t\t\t\t\t\tconsole.log('productsList.setOnCategorySelected: rimuovo valori attributo inferiori a minimo richiesto'); \n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tfor (var [fa,fetchedAttribute] of this.prdSearch.productsList.fetchedAttributes.entries()){\n\n\t\t\t\t\t\t\t\t\t\t\tif(fetchedAttribute.idLinkedCategory != filterAttribute.idLinkedCategory && fetchedAttribute.id != filterAttribute.id){continue;}\n\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.fetchedAttributes[fa].values = fetchedAttribute.values.filter((v)=>{\n\t\t\t\t\t\t\t\t\t\t\t\treturn v >= filterAttribute.startNumberValue;\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\/\/verifica avvenuta selezione geografica\n\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ \n\t\t\t\t\t\t\t\t\tconsole.log('productsList.setOnCategorySelected: verifico presenza geometria disegnata per inizializzazione attributi'); \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\n\t\t\t\t\t\t\t\tvar hasProducts = [];\n\n\t\t\t\t\t\t\t\t\/\/nessuna selezione geografica effettuata\n\t\t\t\t\t\t\t\tif(latlng == undefined){\n\n\t\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ \n\t\t\t\t\t\t\t\t\t\tconsole.log('productsList.setOnCategorySelected: nessuna geometria disegnata, impossibile verificare presenza prodotti per attributi'); \n\t\t\t\t\t\t\t\t\t} \n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\/\/selezione geografica effettuata correttamente\n\t\t\t\t\t\t\t\t\/\/verifica presenza prodotti in assoluto (senza attributi) per area geografica\n\t\t\t\t\t\t\t\telse{\n\n\t\t\t\t\t\t\t\t\tif(1==1){ \/\/per associazione a categoria selezionata\n\t\t\t\t\t\t\t\t\t\tvar srcCategories = (this.prdSearch.productsList.lastVisibleCatSelVal == 'A' ? undefined : ([this.prdSearch.productsList.lastVisibleCatSelVal ?? undefined])); \n\t\t\t\t\t\t\t\t\t\tvar srcTag = undefined;\n\t\t\t\t\t\t\t\t\t\tif(srcCategories != undefined && srcCategories[0] != undefined){ \/\/verifica tag diverso per categoria selezionata\n\t\t\t\t\t\t\t\t\t\t\t\tsrcTag = this.prdSearch.productsList.params.filterCategories.filter((c)=>c.id == srcCategories[0])[0]?.idCustomTag ?? undefined;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvar wkt = latlng == undefined ? undefined :  this.mapSearch.geoSelector.latlngToWkt(latlng);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\thasProducts = await this.prdSearch.productsList.fetchProducts(\n\t\t\t\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \n\t\t\t\t\t\t\t\t\t\t\/*srcCategories*\/ srcCategories, \n\t\t\t\t\t\t\t\t\t\t\/*srcTag*\/ srcTag, \/\/tag prodotto\n\t\t\t\t\t\t\t\t\t\t\/*srcAttrNames*\/ undefined,\n\t\t\t\t\t\t\t\t\t\t\/*srcAttrVals*\/ undefined,\n\t\t\t\t\t\t\t\t\t\t\/*pageNum*\/ 1,\n\t\t\t\t\t\t\t\t\t\t\/*resNum*\/ 1, \n\t\t\t\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ false,\n\t\t\t\t\t\t\t\t\t\t\/*isAtomic*\/ true, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchAttributeValueHasProducts\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif(hasProducts.length == 0 && this.params.prdSearch.ProductsList.logEnabled){\n\t\t\t\t\t\t\t\t\t\tconsole.log('productsList.setOnCategorySelected:nessun prodotto in area selezionata per attributo');\t\n\t\t\t\t\t\t\t\t\t\t\/\/aggiunta option dummy -> vedi loop\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\/\/ottenimento e aggiunta select attributi\n\t\t\t\t\t\t\t\tvar linkedAttributes =  this.prdSearch.productsList.fetchedAttributes;\n\t\t\t\t\t\t\t\tif(this.params.prdSearch.ProductsList.logEnabled){\n\t\t\t\t\t\t\t\t\tconsole.log('productsList.setOnCategorySelected: ottenuti i seguenti attributi: '+JSON.stringify(linkedAttributes));\n\t\t\t\t\t\t\t\t}\t\t\t\t\n\n\t\t\t\t\t\t\t\tfor (const linkedAttribute of linkedAttributes){\n\n\t\t\t\t\t\t\t\t\t\/\/nessun prodotto in area geografica (a prescindere da attributo)\n\t\t\t\t\t\t\t\t\tif(hasProducts.length == 0){\n\n\t\t\t\t\t\t\t\t\t\t\/\/aggiunta opzione disabilitata \"nessun valore attributo\"\n\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.addNoAttributeToSelect(linkedAttribute.id);\n\n\t\t\t\t\t\t\t\t\t\t\/\/ottieni select associata\n\t\t\t\t\t\t\t\t\t\tvar sel = this.prdSearch.productsList.attributeSelects.filter(s=>s.dataset.idAttribute == linkedAttribute.id)[0];\n\n\t\t\t\t\t\t\t\t\t\t\/\/rimuovi eventuale option per selezionare tutti i valori\n\t\t\t\t\t\t\t\t\t\tvar allValuesOption = sel.querySelector('option[value*=\"value\"][value*=\"A\" i]');\n\t\t\t\t\t\t\t\t\t\tif(allValuesOption){allValuesOption.remove();}\n\n\t\t\t\t\t\t\t\t\t\t\/\/imposta barra progresso al 100%\n\t\t\t\t\t\t\t\t\t\ttry{ sel.progressFill.style.width = '100%'; }catch(e){}\n\n\t\t\t\t\t\t\t\t\t\tcontinue; \n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\t\/\/ottenimento e aggiunta valori attributo\n\t\t\t\t\t\t\t\t\twindow.setTimeout( async ()=>{\n\n\t\t\t\t\t\t\t\t\t\t\/\/crea proxy per osservare abort\n\t\t\t\t\t\t\t\t\t\tvar abortLoop = false;\n\t\t\t\t\t\t\t\t\t\tvar proxyTarget = this.prdSearch.productsList.ctrlFetchAttributeValueHasProducts;\n\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.ctrlFetchAttributeValueHasProducts = new Proxy(proxyTarget, {\n\t\t\t\t\t\t\t\t\t\t\tset(obj, prop, value) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (prop === 'aborted' && value === true && !abortLoop) { abortLoop = true; }\n\t\t\t\t\t\t\t\t\t\t\t\tobj[prop] = value;\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tvar checkedOpts = [];\n\t\t\t\t\t\t\t\t\t\tvar validAtrOpts = [];\n\t\t\t\t\t\t\t\t\t\tvar sel = this.prdSearch.productsList.attributeSelects.filter(s=>s.dataset.idAttribute == linkedAttribute.id)[0];\n\n\t\t\t\t\t\t\t\t\t\t\/\/verifica e aggiunta valori attributo\n\t\t\t\t\t\t\t\t\t\tvar promises = linkedAttribute.values.map( async (atrOpt)=>{\n\n\t\t\t\t\t\t\t\t\t\t\tvar newProgressWidth = 0;\n\n\t\t\t\t\t\t\t\t\t\t\tdo{\n\n\t\t\t\t\t\t\t\t\t\t\t\tvar hasProducts = [0];\n\t\t\t\t\t\t\t\t\t\t\t\tcheckedOpts.push(atrOpt);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\/\/calcolo valore barra progresso\n\t\t\t\t\t\t\t\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tnewProgressWidth = ( checkedOpts.length == 0 ? 0 : (checkedOpts.length * 100 \/ linkedAttribute.values.length) );\n\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\/\/abilita pulsanti a primo trovato\n\t\t\t\t\t\t\t\t\t\t\t\tif(1==1 && validAtrOpts.length  == 1){ \n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.toggleFormButtons(true); \n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\/\/verifica esistenza prodotti per valore attributo\n\t\t\t\t\t\t\t\t\t\t\t\tif(1==1 && this.params.prdSearch.ProductsList.filterAttrInGeometry){\n\n\t\t\t\t\t\t\t\t\t\t\t\t\thasProducts = [];\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(abortLoop){break;}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/verifica esistenza prodotti per attributo (es. in selezione geografica - geometria)\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar hasProducts = await this.prdSearch.productsList.fetchProducts(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*srcCategories*\/ srcCategories, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*srcTag*\/ srcTag, \/\/tag prodotto\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*srcAttrNames*\/ [(linkedAttribute.slug ?? linkedAttribute.name)], \/\/nome attributo\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*srcAttrVals*\/ [atrOpt],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*pageNum*\/ 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*resNum*\/ 1, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ false,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*isAtomic*\/ true, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchAttributeValueHasProducts\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/console.log(hasProducts);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\/\/non aggiungere attributo privo di prodotti\n\t\t\t\t\t\t\t\t\t\t\t\tif(1==1 && hasProducts.length == 0){\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){console.log('productsList.setOnCategorySelected: per attributo '+linkedAttribute.name+' valore '+atrOpt+' non esistono prodotti, scarto.');}\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\/\/aggiungi valore attributo a select\n\t\t\t\t\t\t\t\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.addAttributeToSelect({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'idAttribute':linkedAttribute.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'nameAttribute':(linkedAttribute.slug ?? linkedAttribute.name),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'idLinkedCategory':linkedAttribute.idLinkedCategory,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'required':linkedAttribute.required,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'value':atrOpt\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalidAtrOpts.push(linkedAttribute);\n\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t}while(false);\n\n\t\t\t\t\t\t\t\t\t\t\t\/\/aggiorna barra progresso\n\t\t\t\t\t\t\t\t\t\t\ttry{ if(newProgressWidth > 8){ sel.progressFill.style.width = newProgressWidth  + '%'; } }catch(e){}\n\n\n\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tawait Promise.all(promises);\n\t\t\t\t\t\t\t\t\t\ttry{ sel.progressFill.style.width = '100%'; }catch(e){}\n\n\t\t\t\t\t\t\t\t\t\t\/\/rimozione proxy\n\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.ctrlFetchAttributeValueHasProducts = proxyTarget; \n\n\t\t\t\t\t\t\t\t\t\t\/\/nessun prodotto (problema: parte durante fetch valori attributi)\n\t\t\t\t\t\t\t\t\t\tif( 0==1 && ! this.prdSearch.productsList.ctrlFetchAttributeValueHasProducts.aborted && validAtrOpts.length == 0){\n\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.setAttribute('data-msg', this.prdSearch.productsList.texts.noResult);\n\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.classList.add('warning');\n\t\t\t\t\t\t\t\t\t\t\twindow.setTimeout(()=>{\n\t\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.setAttribute('data-msg', this.prdSearch.productsList.texts.startSearch);\n\t\t\t\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.resWrap.classList.remove('warning');\n\t\t\t\t\t\t\t\t\t\t\t},3000);\n\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t},0);\n\n\n\n\t\t\t\t\t\t\t\t} \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\tif(this.params.prdSearch.ProductsList.logEnabled){console.log('productsList.setOnCategorySelected: nessun attributo associato alla categoria');}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/\/gestione automatica preselezione attributi\n\t\t\t\t\t\t\tthis.prdSearch.productsList.autoManageAttributes(); \n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\n\t\t\t\t\t\t\/\/abilita pulsanti\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleFormButtons(true);\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione eseguita a cambio valori addon\n\t\t\t\t\tthis.prdSearch.productsList.setOnAddonSelected( async (changeEvent, selectInput, selectedValue) => {\n\n\t\t\t\t\t\t\/\/TODO, invece di reset, deve effettuare ricalcolo dei prezzi\n\n\t\t\t\t\t\t\/\/pulisci prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts();\n\n\t\t\t\t\t\t\/\/rimuovi geometrie prodotto\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['products','collection','listed','layers']);\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['products','collection','listed','layers']);\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione eseguita a cambio valori attribute\n\t\t\t\t\tthis.prdSearch.productsList.setOnAttributeSelected( async (changeEvent, selectInput, selectedValue) => {\n\n\t\t\t\t\t\t\/\/pulisci prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts();\n\n\t\t\t\t\t\t\/\/rimuovi geometrie prodotto\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['products','collection','listed','layers']);\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['products','collection','listed','layers']);\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione eseguita ad applicazione filtri\n\t\t\t\t\tthis.prdSearch.productsList.setOnFilterSubmit( () => {\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort fetch in corso\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.abortAll();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/metti in pause fetch categories\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.ctrlFetchCategoryHasProducts.pause();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/metti in pause fetch attributes\n\t\t\t\t\t\tthis.prdSearch.productsList.ctrlFetchAttributeValueHasProducts.pause();\n\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: richiesta submit filtri'); }\n\n\t\t\t\t\t\t\/\/reset prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons(['products','listed','collection','layers']);\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['products','listed','collection','layers']);\n\n\t\t\t\t\t\tthis.mapSearch.geoSelector.associatedLayerIndex = -1; \/\/reset stato layer per marker lista \n\n\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\t\t\t\t\t\tif(latlng == undefined){\n\t\t\t\t\t\t\t\/\/alert(this.texts.mainWrapper.DrawRequired); \n\t\t\t\t\t\t\tthis.setInpSelectedAreaValue('');\n\t\t\t\t\t\t\tthis.inpSelectedArea.reportValidity();\n\t\t\t\t\t\t\t\/\/igmGeoSelector.divToolsWrap.style.outline = '2px solid black';\n\t\t\t\t\t\t\t\/\/window.setTimeout(()=>{igmGeoSelector.divToolsWrap.style.outline = 'none';},1500);\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.error('productsList.onFilterSubmit: '+this.texts.mainWrapper.DrawRequired); }\n\t\t\t\t\t\t\tthis.prdSearch.productsList.abortAll(); \/\/abort fetch in corso\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: verifica validit\u00e0 campi filtri'); }\n\n\t\t\t\t\t\tfor (const s of this.prdSearch.productsList.categoriesSelects){if(!s.reportValidity()){ if(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: campo non valido',s); } return; }}\n\t\t\t\t\t\tfor (const s of this.prdSearch.productsList.attributeSelects){if(!s.reportValidity()){ if(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: campo non valido',s); } return; }}\n\t\t\t\t\t\tfor (const s of this.prdSearch.productsList.addonSelects){if(!s.reportValidity()){ if(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: campo non valido',s); } return; }}\n\n\n\t\t\t\t\t\t\/\/verifica esistenza layer in parametri\n\t\t\t\t\t\tif(1==1){\n\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: verifica presenza layer da caricare'); }\n\n\t\t\t\t\t\t\t\/\/ottieni attributo selezionato\n\t\t\t\t\t\t\tvar selectedAttribute = this.prdSearch.productsList.lastVisibleAttrSelVals[0] ?? null;\n\n\t\t\t\t\t\t\t\/\/se nessun attributo, verifica presenza layer per tutta la categoria\n\t\t\t\t\t\t\tif(selectedAttribute == null){ \n\t\t\t\t\t\t\t\tselectedAttribute = {\n\t\t\t\t\t\t\t\t\t'nameAttribute':'*'\n\t\t\t\t\t\t\t\t\t\t,'value':'*'\n\t\t\t\t\t\t\t\t\t\t\t,'idLinkedCategory':this.prdSearch.productsList.lastVisibleCatSelVal ?? 0\n\t\t\t\t\t\t\t\t}; \n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.associatedLayerIndex = this.prdSearch.productsList.params.layerCategories.findIndex((l) => { \n\t\t\t\t\t\t\t\treturn l.slugAttribute == (selectedAttribute.nameAttribute ?? '') && \n\t\t\t\t\t\t\t\t\tl.valueAttributeOption == (selectedAttribute.value ?? '') && \n\t\t\t\t\t\t\t\t\tl.idLinkedCategory == (selectedAttribute.idLinkedCategory ?? '')\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tvar categoryLayerParams = this.prdSearch.productsList.params.layerCategories[this.mapSearch.geoSelector.associatedLayerIndex];\n\n\t\t\t\t\t\t\tif(categoryLayerParams != undefined){\n\n\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterSubmit: carico layer prodotti'); }\n\n\t\t\t\t\t\t\t\t\/\/ottieni punti layer\n\t\t\t\t\t\t\t\tfor(const [v,valueAttribute] of (categoryLayerParams.data?.valuesAttribute ?? []).entries()){\n\n\t\t\t\t\t\t\t\t\tvar ausiliaryAttributes = categoryLayerParams.data?.ausiliaryAttributes[v] ?? [];\n\n\t\t\t\t\t\t\t\t\tthis.prdSearch.productsList.fetchLayerPoints(\n\t\t\t\t\t\t\t\t\t\tcategoryLayerParams.idLinkedCategory\n\t\t\t\t\t\t\t\t\t\t,categoryLayerParams.slugAttribute\n\t\t\t\t\t\t\t\t\t\t,( valueAttribute == null ? null : (typeof(valueAttribute) === 'string' ? valueAttribute : valueAttribute.value ) )  \/\/se \u00e8 stata usata una getter come parametro\n\t\t\t\t\t\t\t\t\t\t,ausiliaryAttributes\n\t\t\t\t\t\t\t\t\t).then(layerPoints => {\n\n\t\t\t\t\t\t\t\t\t\t\/\/disegna punti layer\n\t\t\t\t\t\t\t\t\t\tif( ! categoryLayerParams.data.stretchOnPolygon[v]){\n\t\t\t\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawCatLayerPoints(layerPoints,categoryLayerParams.data.iconUrls[v],categoryLayerParams.data.iconSizes[v],categoryLayerParams.data.iconAnchors[v]);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\/\/disegna immagine su poligono\n\t\t\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawCatLayerPolygons(layerPoints,categoryLayerParams.data.iconUrls[v]);\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\n\n\t\t\t\t\t\t\t\t\t}).catch(error => {\n\t\t\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.associatedLayerIndex = -1;\n\t\t\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints(['layers']);\n\t\t\t\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.error('productsList.onFilterSubmit: errore caricamento layer prodotti'); }\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\telse {\n\n\t\t\t\t\t\t\t\tthis.mapSearch.geoSelector.associatedLayerIndex = -1;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetTimeout( async () => {\n\n\t\t\t\t\t\t\t\/\/LAYER NON DISPONIBILE: abilita autoload nuovi prodotti\n\t\t\t\t\t\t\tif((this.mapSearch.geoSelector.associatedLayerIndex ?? -1) < 0){ this.prdSearch.productsList.backgroundLoad(); }\n\n\t\t\t\t\t\t\t\/\/LAYER ATTIVO: fetch solo prima pagina prodotti\n\t\t\t\t\t\t\t\/\/else { this.prdSearch.productsList.resWrap.dispatchEvent(new CustomEvent('scroll', { detail: { manual: true } })); }\n\t\t\t\t\t\t\telse{ await this.prdSearch.productsList.scrollEndReached(true); }\n\n\t\t\t\t\t\t\t\/\/ripristina fetch categories\n\t\t\t\t\t\t\t\/\/this.prdSearch.productsList.ctrlFetchCategoryHasProducts.resume();\n\n\t\t\t\t\t\t\t\/\/ripristina fetch attributes\n\t\t\t\t\t\t\tthis.prdSearch.productsList.ctrlFetchAttributeValueHasProducts.resume();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t},0);\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione eseguita a reset filtri\n\t\t\t\t\tthis.prdSearch.productsList.setOnFilterReset( () => {\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.onFilterReset: richiesta reset filtri'); }\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAll(); \/\/pulisci mappa\n\n\t\t\t\t\t\tthis.prdSearch.productsList.reset(); \/\/reset \n\n\t\t\t\t\t\tthis.setInpSelectedAreaValue('');\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a raggiungimento fine scroll prodotti\n\t\t\t\t\tthis.prdSearch.productsList.setOnScrollEndReached( async ()=>{\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.infinityScroll: verifico presenza geometria disegnata'); }\n\n\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\n\t\t\t\t\t\t\/\/nessuna selezione geografica effettuata\n\t\t\t\t\t\tif(latlng == undefined ){ if(this.prdSearch.productsList.params.logEnabled){ console.log('infinityScroll: nessuna geometria disegnata, esco.'); } return;}\n\n\t\t\t\t\t\tvar wkt = latlng == undefined ? undefined :  this.mapSearch.geoSelector.latlngToWkt(latlng);\n\t\t\t\t\t\tvar resetPrvDraws = latlng == undefined ? undefined : ()=>{}; \/\/rimuovi disegni precedenti (undefined mantiene funzione settata)\n\t\t\t\t\t\tvar drawProducts = latlng == undefined ? ()=>{} : undefined; \/\/disegna prodotti listati (undefined mantiene funzione settata)\n\t\t\t\t\t\tvar srcCategories = (this.prdSearch.productsList.lastVisibleCatSelVal == 'A' ? undefined : ([this.prdSearch.productsList.lastVisibleCatSelVal ?? undefined])); \/\/mantieni categorie selezionate\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/se layer associato, verifica da parametri se disegnare anche prodotti dell'elenco\n\t\t\t\t\t\tdrawProducts = this.prdSearch.productsList.params.layerCategories[this.mapSearch.geoSelector.associatedLayerIndex]?.data?.drawProductList == false ? ()=>{} : drawProducts;\n\n\t\t\t\t\t\tvar srcTag = undefined;\n\t\t\t\t\t\tif(srcCategories != undefined && srcCategories[0] != undefined){\n\t\t\t\t\t\t\tsrcTag = this.prdSearch.productsList.params.filterCategories.filter((c)=>c.id == srcCategories[0])[0]?.idCustomTag ?? undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.infinityScroll, ' + (latlng === undefined ? 'disegno non rilevato, resetto disegni prodotto' : 'disegno rilevato, mantengo disegni prodotto')); }\n\n\t\t\t\t\t\tvar srcAttributesNames = [];\n\t\t\t\t\t\tvar srcAttributesValues = [];\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.lastVisibleAttrSelVals.forEach((a)=>{\n\n\t\t\t\t\t\t\tif(a.value == 'A'){return;}\n\t\t\t\t\t\t\tsrcAttributesNames.push(a.nameAttribute);\n\t\t\t\t\t\t\tsrcAttributesValues.push(a.value);\n\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\tvar newFetchedProducts = await this.prdSearch.productsList.fetchProducts(\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \n\t\t\t\t\t\t\t\/*srcCategories*\/ srcCategories,   \/\/mantieni categoria selezionata\n\t\t\t\t\t\t\t\/*srcTag*\/ srcTag, \/\/tag prodotto\n\t\t\t\t\t\t\t\/*srcAttrNames*\/ srcAttributesNames, \/\/nome attributo\n\t\t\t\t\t\t\t\/*srcAttrVals*\/ srcAttributesValues, \/\/val attributo\n\t\t\t\t\t\t\t\/*pageNum*\/ undefined, \/\/(this.prdSearch.productsList.lastFetchedProductPage), \/\/numero pagina successivo\n\t\t\t\t\t\t\t\/*resNum*\/ undefined,  \/\/prod per pagina (undefined mantiene valore di classe)\n\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ undefined,\n\t\t\t\t\t\t\t\/*isAtomic*\/ undefined, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchTemp\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.listProducts(\n\t\t\t\t\t\t\tnewFetchedProducts,\n\t\t\t\t\t\t\tresetPrvDraws,\/\/rimuovi disegni precedenti\n\t\t\t\t\t\t\tdrawProducts\/\/disegna prodotti listati\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a autoload eseguita in background (se attivo)\n\t\t\t\t\tthis.prdSearch.productsList.setOnBackgroundLoad( async ()=>{ \n\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.backgroundLoad: verifico presenza disegno ricerca'); }\n\n\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\n\t\t\t\t\t\t\/\/nessuna selezione geografica effettuata, disattiva autoload\n\t\t\t\t\t\tif(latlng == undefined ){\n\n\t\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.backgroundLoad: nessun disegno ricerca rilevato, richiedo disattivazione backgroundLoad'); }\n\t\t\t\t\t\t\tthis.prdSearch.productsList.backgroundLoad(false);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.logEnabled){ console.log('productsList.backgroundLoad: disegno ricerca rilevato, mantengo disegni prodotto'); }\n\n\t\t\t\t\t\tvar wkt = latlng == undefined ? undefined :  this.mapSearch.geoSelector.latlngToWkt(latlng);\n\t\t\t\t\t\tvar resetPrvDraws = latlng == undefined ? undefined : ()=>{}; \/\/rimuovi disegni precedenti (undefined mantiene funzione settata)\n\t\t\t\t\t\tvar drawProducts = latlng == undefined ? ()=>{} : undefined; \/\/disegna prodotti listati (undefined mantiene funzione settata)\n\t\t\t\t\t\tvar srcCategories = (this.prdSearch.productsList.lastVisibleCatSelVal == 'A' ? undefined : ([this.prdSearch.productsList.lastVisibleCatSelVal ?? undefined])); \/\/mantieni categorie selezionate\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/se layer associato, verifica da parametri se disegnare anche prodotti dell'elenco\n\t\t\t\t\t\tdrawProducts = this.prdSearch.productsList.params.layerCategories[this.mapSearch.geoSelector.associatedLayerIndex]?.data?.drawProductList == false ? ()=>{} : drawProducts;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/console.error(drawProducts);\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar srcTag = undefined;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(srcCategories != undefined && srcCategories[0] != undefined){\n\t\t\t\t\t\t\tsrcTag = this.prdSearch.productsList.params.filterCategories.filter((c)=>c.id == srcCategories[0])[0]?.idCustomTag ?? undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/this.debug = srcTag;\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar srcAttributesNames = [];\n\t\t\t\t\t\tvar srcAttributesValues = [];\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.lastVisibleAttrSelVals.forEach((a)=>{\n\n\t\t\t\t\t\t\tif(a.value == 'A'){return;}\n\t\t\t\t\t\t\tsrcAttributesNames.push(a.nameAttribute);\n\t\t\t\t\t\t\tsrcAttributesValues.push(a.value);\n\n\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\t\/\/this.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\tvar newFetchedProducts = await this.prdSearch.productsList.fetchProducts(\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \n\t\t\t\t\t\t\t\/*srcCategories*\/ srcCategories,   \/\/mantieni categoria selezionata\n\t\t\t\t\t\t\t\/*srcTag*\/ srcTag, \/\/tag prodotto\n\t\t\t\t\t\t\t\/*srcAttrNames*\/ srcAttributesNames, \/\/nome attributo\n\t\t\t\t\t\t\t\/*srcAttrVals*\/ srcAttributesValues, \/\/val attributo\n\t\t\t\t\t\t\t\/*pageNum*\/ undefined, \/\/(this.prdSearch.productsList.lastFetchedProductPage), \/\/numero pagina successivo\n\t\t\t\t\t\t\t\/*resNum*\/ undefined,  \/\/prod per pagina (undefined mantiene valore di classe)\n\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ true,\n\t\t\t\t\t\t\t\/*isAtomic*\/ false, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchProducts\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.prdSearch.productsList.listProducts(\n\t\t\t\t\t\t\tnewFetchedProducts,\n\t\t\t\t\t\t\tresetPrvDraws,\/\/rimuovi disegni precedenti\n\t\t\t\t\t\t\tdrawProducts\/\/disegna prodotti listati\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t});\t\n\t\t\t\t\t\n\t\t\t\t\t\/\/elenco categorie e addon iniziale\n\t\t\t\t\t\/\/nota: rimosse categorie non padre\n\t\t\t\t\twindow.setTimeout(async ()=>{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/crea select per tutte le categorie prodotto (se non richiesto filtro disponibilit\u00e0 per geometria)\n\t\t\t\t\t\tif( ! this.prdSearch.productsList.params.filterCatInGeometry){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tawait this.setCategories(false); \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/aggiungi pulsante submit\n\t\t\t\t\t\tthis.prdSearch.productsList.addSubmitButton(\n\t\t\t\t\t\t\t'geoselector_res_btns_submit' \/\/wrapper\n\t\t\t\t\t\t\t,['geoselector_res_draw_btn'] \/\/ classe da aggiungere\n\t\t\t\t\t\t\t,undefined \/\/funzione submit (mantiene onFilterSubmit settata preced.)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\/\/aggiungi pulsante reset\n\t\t\t\t\t\tthis.prdSearch.productsList.addResetButton(\n\t\t\t\t\t\t\t'geoselector_res_btns_submit' \/\/wrapper\n\t\t\t\t\t\t\t,['geoselector_res_draw_btn'] \/\/ classe da aggiungere\n\t\t\t\t\t\t\t,undefined \/\/funzione submit (mantiene onFilterReset settata preced.)\n\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\/\/abilita pulsanti\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleFormButtons(true);\n\t\t\t\t\t\t\n\n\t\t\t\t\t},0);\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\/\/wrapper strumenti ricerca\n\t\t\t\tthis.divToolsWrap = document.querySelector('#geoselector_res_tools');\n\t\t\t\t\n\t\t\t\t\/\/INIZIALIZZA STATO SELEZIONE AREA\n\t\t\t\tif(1==1){\n\n\t\t\t\t\tthis.divSelectedArea = document.querySelector('#geoselector_res_area');\n\n\t\t\t\t\tthis.noInputSelectedArea = document.createElement('div');\n\t\t\t\t\tthis.noInputSelectedArea.classList.add('noinput');\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.display = 'block';\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.position = 'absolute';\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.width = '100%';\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.height = '100%';\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.top = 0;\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.left = 0;\n\t\t\t\t\t\/\/this.noInputSelectedArea.style.zIndex = 1;\n\n\t\t\t\t\tthis.lblSelectArea = document.createElement('label');\n\t\t\t\t\tthis.lblSelectArea.innerText = this.texts.mainWrapper.lblSelectedArea;\n\n\t\t\t\t\tthis.inpSelectedArea = document.createElement('textarea');\n\t\t\t\t\tthis.inpSelectedArea.style.resize = 'none';\n\t\t\t\t\t\/\/this.inpSelectedArea.type = 'text';\n\t\t\t\t\tthis.inpSelectedArea.setAttribute('tabindex', '-1');\n\t\t\t\t\tthis.inpSelectedArea.setAttribute('required','required');\n\t\t\t\t\tthis.inpSelectedArea.placeholder = this.texts.mainWrapper.noAreaSelected;\n\t\t\t\t\tthis.setInpSelectedAreaValue('');\n\t\t\t\t\t\n\t\t\t\t\t\/\/popup di avviso personalizzato\n\t\t\t\t\tthis.warningRequiredSelectedArea = document.createElement('div');\n\t\t\t\t\tthis.warningRequiredSelectedArea.id = 'use_area_selection_tools';\n\t\t\t\t\tthis.warningRequiredSelectedArea.style.display = 'none';\n\t\t\t\t\tthis.warningRequiredSelectedArea.innerHTML = this.texts.mainWrapper.useAreaSelectionTools;\n\t\t\t\t\tthis.divToolsWrap.appendChild(this.warningRequiredSelectedArea);\n\t\t\t\t\tthis.inpSelectedArea.addEventListener('input',()=>{ \n\t\t\t\t\t\tthis.inpSelectedArea.value = ''; \n\t\t\t\t\t\tif('timeoutBlurSelectedArea' in this){ clearTimeout(this.timeoutBlurSelectedArea); }\n\t\t\t\t\t\tthis.inpSelectedArea.blur(); \n\t\t\t\t\t});\n\t\t\t\t\tthis.inpSelectedArea.addEventListener('focus',()=>{ \n\t\t\t\t\t\tsetTimeout(()=>{  this.inpSelectedArea.blur();  },10);\n\t\t\t\t\t\tthis.warningRequiredSelectedArea.style.removeProperty('display');\n\t\t\t\t\t\tthis.timeoutBlurSelectedArea = setTimeout(()=>{  this.warningRequiredSelectedArea.style.display = 'none'; },1500); \n\t\t\t\t\t});\n\t\t\t\t\t\n\n\t\t\t\t\tthis.divSelectedArea.appendChild(this.noInputSelectedArea);\n\t\t\t\t\tthis.divSelectedArea.appendChild(this.lblSelectArea);\n\t\t\t\t\tthis.divSelectedArea.appendChild(this.inpSelectedArea);\n\n\t\t\t\t}\n\n\t\t\t\t\/\/INIZIALIZZA RICERCA PER LOCALITA\n\t\t\t\tif(1==1){\n\n\t\t\t\t\tthis.locSearch = {};\n\t\t\t\t\tthis.locSearch.AutoCompleteSelect2 = new AutoCompleteSelect2('geoselector_src',this.params.locSearch.AutoComplete,this.texts.locSearch.AutoComplete);\n\t\t\t\t\tthis.locSearch.dom = this.locSearch.AutoCompleteSelect2.input;\n\t\t\t\t\tthis.locSearch.cssPopup = new CssPopup('geoselector_src',this.params.locSearch.CssPopup,this.texts.locSearch.CssPopup);\n\t\t\t\t\t\n\n\t\t\t\t\t\/\/funzione ad apertura popup localita\n\t\t\t\t\tthis.locSearch.cssPopup.setOnOpen(()=>{\n\t\t\t\t\t\tthis.locSearch.AutoCompleteSelect2.reset();\n\t\t\t\t\t\tthis.mapSearch.geoSelector.stopAllDrawing();\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\/\/funzione fetch dati geocoding\n\t\t\t\t\tthis.locSearch.AutoCompleteSelect2.setFetchOptions(async ()=>{\n\n\t\t\t\t\t\tvar query = this.locSearch.dom.value;\n\t\t\t\t\t\tif(this.locSearch.AutoCompleteSelect2.params.logEnabled){ console.log('AutoCompleteSelect2.setFetchOptions: query ricerca: '+query); }\n\t\t\t\t\t\tvar rest = this.params.locSearch.AutoComplete.geoCodingEndpoint.getUrl(query);\n\t\t\t\t\t\tif(this.locSearch.AutoCompleteSelect2.params.logEnabled){ console.log('AutoCompleteSelect2.setFetchOptions: rest url: '+rest); }\n\t\t\t\t\t\tvar response = await fetch(rest);\t\t\t\t\t\n\t\t\t\t\t\tresponse = await response.json();\n\t\t\t\t\t\tif(this.locSearch.AutoCompleteSelect2.params.logEnabled){ console.log('AutoCompleteSelect2.setFetchOptions: response data: '+JSON.stringify(response)); }\n\n\t\t\t\t\t\tresponse.features.forEach((f)=>{\n\n\t\t\t\t\t\t\tf.value = f.geometry;\n\n\t\t\t\t\t\t\tf.text = undefined;\n\t\t\t\t\t\t\ttry{f.text = f.properties.nome;}catch(e){f.text = undefined;}\n\t\t\t\t\t\t\tif(f.text != undefined){try{f.text = f.text + (f.properties.prov ? ' (' + f.properties.prov + ')' : '');}catch(e){f.text = f.properties.nome;}}\n\t\t\t\t\t\t\tif(f.text == undefined){try{f.text = f.properties.geocoding.label;}catch(e){f.text = undefined;}}\n\t\t\t\t\t\t\tif(f.text == undefined){try{f.properties.geocoding.name;}catch(e){f.text = undefined;}}\n\t\t\t\t\t\t\tif(f.text == undefined){return;}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\treturn response.features;\n\n\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a selezione localit\u00e0\n\t\t\t\t\tthis.locSearch.AutoCompleteSelect2.setOnOptionSelected(async ()=>{\n\n\n\t\t\t\t\t\t\/\/rimuovi popup\n\t\t\t\t\t\tthis.locSearch.cssPopup.close();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se ancora in inizializzazione\n\t\t\t\t\t\tif( this.isInitializing || this.mapSearch.geoSelector.isAreaTesting ){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort fetch in corso\n\t\t\t\t\t\tthis.prdSearch.productsList.abortAll();\n\n\t\t\t\t\t\t\/\/ottieni geometria da autocomplete\n\t\t\t\t\t\tvar feature = {'geometry':this.locSearch.AutoCompleteSelect2.selectedOptionValue};\n\t\t\t\t\t\t\/\/this.debug.feature = feature;\n\n\t\t\t\t\t\t\/\/rimuovi tutti i poligoni e punti\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons();\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints();\n\n\t\t\t\t\t\t\/\/rimuovi valore parser coordinate\n\t\t\t\t\t\t\/\/this.crdSearch.coordinatesParser.reset();\n\n\t\t\t\t\t\t\/\/disegna geometria su mappa\n\t\t\t\t\t\tvar code_EPSG = this.params.locSearch.AutoComplete.geoCodingEndpoint.code_EPSG;\n\t\t\t\t\t\tvar geomType = feature.geometry.type;\n\t\t\t\t\t\tif(geomType == 'Polygon'){\n\t\t\t\t\t\t\tvar latlng = code_EPSG == 'EPSG:3857' ? this.mapSearch.geoSelector.webMercatorToLatlng(feature.geometry.coordinates[0]) : this.mapSearch.geoSelector.GeoJSONToLatLng(feature.geometry.coordinates[0]);\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawPolygon(latlng,'locations',true,true,true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(geomType == 'Point'){\n\t\t\t\t\t\t\tvar latlng = code_EPSG == 'EPSG:3857' ? this.mapSearch.geoSelector.webMercatorToLatlng([feature.geometry.coordinates]) : this.mapSearch.geoSelector.GeoJSONToLatLng([feature.geometry.coordinates]);\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawPoint(latlng,'locations',true,true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tif(this.locSearch.AutoCompleteSelect2.params.logEnabled){ console.error('AutoCompleteSelect2.setOnOptionSelected: geometry type not valid: '+geomType); }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\/\/reset prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\tthis.setInpSelectedAreaValue(this.texts.mainWrapper.locationAreaSelected);\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleAddonsVisibility(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif( this.prdSearch.productsList.params.filterCatInGeometry){ await this.setCategories(true); }\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.autoManageCategories();\n\n\n\t\t\t\t\t}); \n\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\/\/INIZIALIZZA RICERCA PER COORDINATE\n\t\t\t\tif(1==1){ \n\n\t\t\t\t\tthis.crdSearch = {};\n\t\t\t\t\tthis.crdSearch.coordinatesParser = new CoordinatesParser('geoselector_crd',this.params.crdSearch.coordinatesParser,this.texts.crdSearch.CoordinatesParser);\n\t\t\t\t\tthis.crdSearch.cssPopup = new CssPopup('geoselector_crd',this.params.crdSearch.CssPopup,this.texts.crdSearch.CssPopup);\n\t\t\t\t\tthis.crdSearch.dom = this.crdSearch.coordinatesParser.input;\n\n\t\t\t\t\t\/\/funzione ad apertura popup parser\n\t\t\t\t\tthis.crdSearch.cssPopup.setOnOpen(()=>{\n\t\t\t\t\t\tthis.crdSearch.coordinatesParser.reset();\n\t\t\t\t\t\tthis.mapSearch.geoSelector.stopAllDrawing();\n\t\t\t\t\t});\n\n\t\t\t\t\t\/\/funzione a parsing coordinate avvenuto\n\t\t\t\t\tthis.crdSearch.coordinatesParser.setOnCoordsParsed(async ()=>{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/rimuovi popup\n\t\t\t\t\t\tthis.crdSearch.cssPopup.close();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se ancora in inizializzazione\n\t\t\t\t\t\tif( this.isInitializing || this.mapSearch.geoSelector.isAreaTesting ){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort fetch in corso\n\t\t\t\t\t\tthis.prdSearch.productsList.abortAll();\n\n\t\t\t\t\t\t\/\/rimuovi poligoni e punti\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPolygons();\n\t\t\t\t\t\tthis.mapSearch.geoSelector.removeAllPoints();\n\n\t\t\t\t\t\t\/\/pulisci ricerca per localit\u00e0\n\t\t\t\t\t\tthis.locSearch.AutoCompleteSelect2.reset();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/disegna marker e poligono di intorno con coordinate parsate\n\t\t\t\t\t\tif(this.crdSearch.coordinatesParser.parsedCoords != null){\n\n\t\t\t\t\t\t\tvar latlng = [this.crdSearch.coordinatesParser.parsedCoords];\n\n\t\t\t\t\t\t\t\/\/this.mapSearch.geoSelector.drawPoint(latlng,'locations',true,true);\n\n\t\t\t\t\t\t\tlatlng = this.mapSearch.geoSelector.latlngPoint2latlngPolygon(latlng,this.crdSearch.coordinatesParser.params.polygonSize); \/\/converti a intorno del punto\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.drawPolygon(latlng,'locations',true,true);\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\/\/reset prodotti\n\t\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\t\tthis.setInpSelectedAreaValue(this.texts.mainWrapper.coordinatesAreaSelected);\n\t\t\t\t\t\t\tthis.prdSearch.productsList.toggleAddonsVisibility(false);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif( this.prdSearch.productsList.params.filterCatInGeometry){ await this.setCategories(true); }\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.prdSearch.productsList.autoManageCategories();\n\n\n\t\t\t\t\t\t}\n\n\n\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/PULSANTI TOOL\n\t\t\t\tif(1==1){\n\n\n\t\t\t\t\tdocument.querySelector('#geoselector_res_tools label').innerText = this.texts.mainWrapper.lblSelectArea;\n\n\t\t\t\t\tthis.btnDrawPolygon = document.querySelector('#geoselector_res_draw_btn_polygon');\n\t\t\t\t\tif(this.btnDrawPolygon != undefined){\n\t\t\t\t\t\tthis.btnDrawPolygon.innerText = this.texts.mainWrapper.btnDrawPolygon;\n\t\t\t\t\t\tthis.btnDrawPolygon.addEventListener('click',()=>{\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.stopAllDrawing();\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.polygonDrawer();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.btnDrawPoint = document.querySelector('#geoselector_res_draw_btn_point');\n\t\t\t\t\tif(this.btnDrawPoint != undefined){\n\t\t\t\t\t\tthis.btnDrawPoint.innerText = this.texts.mainWrapper.btnDrawPoint;\n\t\t\t\t\t\tthis.btnDrawPoint.addEventListener('click',()=>{\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.stopAllDrawing();\n\t\t\t\t\t\t\tthis.mapSearch.geoSelector.pointDrawer();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t\/\/INIZIALIZZA RICERCA CON SELEZIONE AREA\n\t\t\t\tif(1==1){\n\n\n\t\t\t\t\t\/\/elenca prodotti da area disegnata da utente (nota: scatenato solo da strumenti dedicati)\n\t\t\t\t\tthis.mapSearch.geoSelector.setOnAreaSelected( async () => {\n\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se ancora in inizializzazione\n\t\t\t\t\t\tif( this.isInitializing || this.mapSearch.geoSelector.isAreaTesting ){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se disegno esistente\n\t\t\t\t\t\tif(this.mapSearch.geoSelector.getCurrentDraw() == undefined){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort fetch in corso\n\t\t\t\t\t\tthis.prdSearch.productsList.abortAll();\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/reset prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\tthis.setInpSelectedAreaValue(this.texts.mainWrapper.polygonAreaSelected); \/\/TODO:SPOSTARE IN PRDSEARCH\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleAddonsVisibility(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(this.prdSearch.productsList.params.filterCatInGeometry){  await this.setCategories(true);  }\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.autoManageCategories();\n\n\t\t\t\t\t});\n\n\n\t\t\t\t}\n\n\t\t\t\t\/\/INIZIALIZZA RICERCA CON SELEZIONE PUNTO\n\t\t\t\tif(1==1){\n\n\n\t\t\t\t\t\/\/elenca prodotti da punto disegnato da utente (nota: scatenato solo da strumenti dedicati)\n\t\t\t\t\tthis.mapSearch.geoSelector.setOnPointSelected( async () => {\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se ancora in inizializzazione\n\t\t\t\t\t\tif( this.isInitializing || this.mapSearch.geoSelector.isAreaTesting ){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica se disegno esistente\n\t\t\t\t\t\tif(this.mapSearch.geoSelector.getCurrentDraw() == undefined){ return; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/abort fetch in corso\n\t\t\t\t\t\tthis.prdSearch.productsList.abortAll();\n\n\t\t\t\t\t\t\/\/reset prodotti\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProductsList(); \/\/reset prodotti elenco\n\t\t\t\t\t\tthis.prdSearch.productsList.resetProducts(); \/\/reset prodotti fetched\n\n\t\t\t\t\t\t\/\/ottieni ed elenca prodotti da area trovata\n\t\t\t\t\t\tvar latlng = this.mapSearch.geoSelector.getCurrentDraw();\n\n\t\t\t\t\t\t\/\/nessuna selezione geografica effettuata\n\t\t\t\t\t\tif(latlng == undefined ){return;}\n\n\t\t\t\t\t\t\/\/aggiungi poligono di intorno del punto\n\t\t\t\t\t\tlatlng = this.mapSearch.geoSelector.latlngPoint2latlngPolygon(latlng,0.0004); \/\/converti a intorno del punto \/\/valore minimo: param. clickedPolygonSize \n\t\t\t\t\t\tthis.mapSearch.geoSelector.drawPolygon(latlng,'user',true,true);\n\n\t\t\t\t\t\tthis.setInpSelectedAreaValue(this.texts.mainWrapper.markerAreaSelected);\n\t\t\t\t\t\tthis.prdSearch.productsList.toggleAddonsVisibility(false);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif( this.prdSearch.productsList.params.filterCatInGeometry){ await this.setCategories(true); }\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.prdSearch.productsList.autoManageCategories();\n\t\t\t\t\t\t\n\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/CONVERSIONE IMMAGINI MARKER A BLOB\n\t\t\t\tif(1==1){\n\t\t\t\t\t\n\t\t\t\t\tdocument.addEventListener('DOMContentLoaded',async ()=>{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/icona principale\n\t\t\t\t\t\tthis.mapSearch.geoSelector.params.marker.url = await this.getBlobUrl(this.mapSearch.geoSelector.params.marker.url);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/layers\n\t\t\t\t\t\tfor (var [lc,layerCategory] of this.prdSearch.productsList.params.layerCategories.entries()){\n\t\t\t\t\t\t\tfor( var [iu,iconUrl] of layerCategory.data.iconUrls.entries() ){\n\t\t\t\t\t\t\t\tthis.prdSearch.productsList.params.layerCategories[lc].data.iconUrls[iu] = await this.getBlobUrl(iconUrl);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.isInitializing = false;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\/\/funzione wrapper common per impostare categorie a cambio di selezione geografica e a inizializzazione\n\t\t\tasync setCategories(filterCatInGeometry = false){\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tthis.prdSearch.productsList.setLoading(); \/\/imposta classe loading su wrapper\t\n\t\t\t\t\n\t\t\t\t\/\/reset e refetch categorie\n\t\t\t\tif(filterCatInGeometry){\n\t\t\t\t\t\n\t\t\t\t\tthis.prdSearch.productsList.resetCategories(true); \/\/rimuovi select categorie\n\t\t\t\t\tthis.prdSearch.productsList.addCatToSelect({'id':0,'name':'base','slug':\"base\",'parent':0}); \/\/crea select categorie iniziale\n\t\t\t\t\t\n\t\t\t\t\tvar wkt = this.mapSearch.geoSelector.getCurrentDraw();\n\t\t\t\t\tif(wkt == undefined){ this.prdSearch.productsList.setLoaded();  return;}\n\t\t\t\t\twkt = this.mapSearch.geoSelector.latlngToWkt(wkt);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\tthis.prdSearch.productsList.toggleFormButtons('processing',['submitButton','resetButton']); \/\/imposta classse loading su pulsanti\n\t\t\t\t\n\t\n\t\t\t\tvar idsCategory = this.params.prdSearch.ProductsList.filterCategories.map(c=>c.id)\n\t\t\t\tawait this.prdSearch.productsList.fetchCategories(idsCategory);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\/\/crea proxy per osservare abort\n\t\t\t\tvar abortLoop = false;\n\t\t\t\tvar proxyTarget = this.prdSearch.productsList.ctrlFetchCategoryHasProducts;\n\t\t\t\tthis.prdSearch.productsList.ctrlFetchCategoryHasProducts = new Proxy(proxyTarget, {\n\t\t\t\t\tset(obj, prop, value) {\n\t\t\t\t\t\tif (prop === 'aborted' && value === true && !abortLoop) { abortLoop = true; }\n\t\t\t\t\t\tobj[prop] = value;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\/\/crea select per tutte le categorie prodotto\n\t\t\t\tvar promises = this.prdSearch.productsList.fetchedCategories.map( async (cat) => {\n\t\t\t\t\t\n\t\t\t\t\tif(abortLoop){ return; }\n\t\t\t\t\t\n\t\t\t\t\t\/\/verifica presenza TODO!!!!\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\/\/verifica disponibilit\u00e0 per geometria\n\t\t\t\t\tif(filterCatInGeometry){\n\t\t\t\t\t\t\n\t\t\t\t\t\tawait this.prdSearch.productsList.ctrlFetchCategoryHasProducts.checkPause();\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\/\/verifica esistenza prodotti per attributo (es. in selezione geografica - geometria)\n\t\t\t\t\t\tvar hasProducts = await this.prdSearch.productsList.fetchProducts(\n\t\t\t\t\t\t\t\/*srcWKT*\/ wkt, \n\t\t\t\t\t\t\t\/*srcCategories*\/ [cat.id], \n\t\t\t\t\t\t\t\/*srcTag*\/ this.prdSearch.productsList.params.idProductTag, \/\/tag prodotto\n\t\t\t\t\t\t\t\/*srcAttrNames*\/ undefined, \/\/nome attributo\n\t\t\t\t\t\t\t\/*srcAttrVals*\/ undefined,\n\t\t\t\t\t\t\t\/*pageNum*\/ 1,\n\t\t\t\t\t\t\t\/*resNum*\/ 1, \n\t\t\t\t\t\t\t\/*isBackgroundLoading*\/ false,\n\t\t\t\t\t\t\t\/*isAtomic*\/ true, \/\/true: esegui in maniera anonima, senza registrare dati in classe \n\t\t\t\t\t\t\t\/*fetchController*\/ this.prdSearch.productsList.ctrlFetchCategoryHasProducts\n\t\t\t\t\t\t);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif( hasProducts.length == 0 ){ return; }\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\/\/aggiungo categoria delle fetchate\n\t\t\t\t\tthis.prdSearch.productsList.addCatToSelect(cat);\n\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tawait Promise.all(promises);\n\t\t\t\t\n\t\t\t\t\/\/rimozione proxy\n\t\t\t\tthis.prdSearch.productsList.ctrlFetchCategoriesHasProducts = proxyTarget; \n\t\t\t\t\n\t\t\t\tthis.prdSearch.productsList.resetCategories(false); \n\t\t\t\t\n\t\t\t\tthis.prdSearch.productsList.setLoaded();\n\t\t\t\tthis.prdSearch.productsList.toggleFormButtons(true,['submitButton','resetButton']);\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\n\t\t\t\/\/imposta valore campo \"area selezionata\"\n\t\t\t\/\/TODO:SPOSTARE IN PRDSEARCH\n\t\t\tsetInpSelectedAreaValue(val){\n\t\t\t\t\n\t\t\t\tif(this.inpSelectedArea == undefined){return;}\n\n\t\t\t\tvar isPlaceholder = false;\n\n\t\t\t\tif(val == ''){\n\t\t\t\t\tval = this.inpSelectedArea.placeholder;\n\t\t\t\t\tisPlaceholder = true;\n\t\t\t\t}\n\n\t\t\t\t\/\/adatta altezza textarea\n\t\t\t\tthis.inpSelectedArea.rows = 1;\n\t\t\t\tthis.inpSelectedArea.value = val;\n\t\t\t\tif(this.inpSelectedArea.scrollHeight > this.inpSelectedArea.clientHeight + 0.5){ this.inpSelectedArea.rows = 2; }\n\n\t\t\t\tif(isPlaceholder){this.inpSelectedArea.value = '';}\n\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\t\t\n\t\t\t\/\/aggiorna dati popup carrello\n\t\t\trefreshHeaderCart() {\n\t\t\t\t\n\t\t\t\tfunction rhc(){\n\t\t\t\t\ttry{\n\t\t\t\t\t\t$.ajax({\n\t\t\t\t\t\t\turl: wc_cart_fragments_params.wc_ajax_url.replace('%%endpoint%%', 'get_refreshed_fragments'),\n\t\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\t\tsuccess: function (data) {\n\n\t\t\t\t\t\t\t\tif (data && data.fragments) {\n\t\t\t\t\t\t\t\t\t$.each(data.fragments, function (selector, html) {\n\t\t\t\t\t\t\t\t\t\t$(selector).replaceWith(html);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}catch(e){}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsetTimeout(rhc,100);\n\t\t\t\tsetTimeout(rhc,500);\n\t\t\t\tsetTimeout(rhc,1000);\n\t\t\t\tsetTimeout(rhc,1500);\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\/\/converti immagine remota a blob locale\n\t\t\tasync getBlobUrl(imageUrl) {\n\t\t\t\ttry {\n\t\t\t\t\tif(imageUrl == false){return false;}\n\t\t\t\t\tif(imageUrl == undefined){return undefined;}\n\t\t\t\t\tconst response = await fetch(imageUrl);\n\t\t\t\t\tconst blob = await response.blob();\n\t\t\t\t\treturn URL.createObjectURL(blob);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Errore nel fetch del blob:', error);\n\t\t\t\t\treturn imageUrl;  \/\/ Fallback all'URL originale\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\n\t\t<\/script>\n\n\t\t\n\t\t\t\t<div class=\"elementor-shortcode\">\n\t\t<div id=\"geoselector_wrap\">\n\n\t\t\t<!--MAPPA-->\n\t\t\t<div id=\"geoselector_map\"><\/div>\n\n\t\t\t<!--STRUMENTI-->\n\t\t\t<div id=\"geoselector_res\" class=\"\">\n\n\t\t\t\t<div id=\"geoselector_res_tools\">\n\n\t\t\t\t\t<label><\/label>\n\n\t\t\t\t\t<!--riga pulsanti tool-->\n\t\t\t\t\t<div class=\"geoselector_res_btns_row geoselector_res_wrp\">\n\t\t\t\t\t\t<button type=\"button\" id=\"geoselector_res_draw_btn_point\" class=\"geoselector_res_draw_btn\"><\/button>\n\t\t\t\t\t\t<button type=\"button\" id=\"geoselector_res_draw_btn_polygon\" class=\"geoselector_res_draw_btn\"><\/button>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<!--riga pulsanti tool-->\n\t\t\t\t\t<div class=\"geoselector_res_btns_row geoselector_res_wrp\">\n\t\t\t\t\t\t<div id=\"geoselector_crd\" class=\"geoselector_res_wrp\"><\/div>\n\t\t\t\t\t\t<div id=\"geoselector_src\" class=\"geoselector_res_wrp\"><\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\n\n\t\t\t\t<\/div>\n\n\t\t\t\t<!--stato selezione area-->\n\t\t\t\t<div id=\"geoselector_res_area\">\n\t\t\t\t<\/div>\n\n\t\t\t\t<!--filtri categorie-->\n\t\t\t\t<div id=\"geoselector_res_cats\">\n\t\t\t\t<\/div>\n\n\t\t\t\t<!--filtri tag-->\n\t\t\t\t<div id=\"geoselector_res_attrs\">\n\t\t\t\t<\/div>\n\n\t\t\t\t<!--filtri categorie addon-->\n\t\t\t\t<div id=\"geoselector_res_addons\">\n\t\t\t\t<\/div>\n\t\t\t\n\t\t\t\t<!--riga pulsanti submit-->\n\t\t\t\t<div id=\"geoselector_res_btns_submit\" class=\"geoselector_res_btns_row geoselector_res_wrp\">\n\t\t\t\t<\/div>\n\n\t\t\t\t<!--elenco risultati-->\n\t\t\t\t<div id=\"geoselector_res_els\" >\n\n\t\t\t\t\t<!--risultato modello-->\n\t\t\t\t\t<div id=\"geoselector_res_el_0\" class=\"geoselector_res_el\" data-geometria=\"\" tabindex=\"0\">\n\t\t\t\t\t\t<div class=\"geoselector_res_img\" style=\"background:grey;\"><\/div>\n\t\t\t\t\t\t<div class=\"geoselector_res_cnt\" >\n\t\t\t\t\t\t\t<a class=\"geoselector_res_desc\" ><\/a>\n\t\t\t\t\t\t\t<div class=\"geoselector_res_data\">\n\t\t\t\t\t\t\t\t<div class=\"geoselector_res_dets\">\n\t\t\t\t\t\t\t\t\t<div class=\"geoselector_res_det geoselector_res_price\"><span class=\"name\">Eur <\/span><span class=\"value\"><\/span><\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"geoselector_res_det geoselector_res_cat\"><span class=\"name\"><\/span><span class=\"value\"><\/span><\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"geoselector_res_attrs\">\t\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"geoselector_res_btns\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"geoselector_res_geom geoselector_res_btn\"><span class=\"icon\"><\/span><span class=\"value\"><\/span><\/button>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"geoselector_res_cart geoselector_res_btn\"><span class=\"icon\"><\/span><span class=\"value\"><\/span><\/button>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t<\/div>\n\n\t\t\t<\/div>\n\n\t\t<\/div>\n\n\t\t<script>\n\t\t\tconst igmGeoSelector = new IgmGeoSelector(\n\t\t\t\t'geoselector_wrap'\n\t\t\t\t,parametriSelettoreGeografico['foto_aeree'].parametri\n\t\t\t\t,parametriSelettoreGeografico['foto_aeree'].localizzazioni['en-US']\n\t\t\t);\n\n\t\t<\/script>\n\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-174a495 e-flex e-con-boxed e-con e-parent\" data-id=\"174a495\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-73503cd elementor-widget elementor-widget-heading\" data-id=\"73503cd\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Data Sheets<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-06408ec e-con-full e-flex e-con e-child\" data-id=\"06408ec\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-3cdcd54 e-con-full e-flex e-con e-child\" data-id=\"3cdcd54\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-cecd0a0 e-con-full e-flex e-con e-child\" data-id=\"cecd0a0\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-254ee92 e-con-full e-flex e-con e-child\" data-id=\"254ee92\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-56184c5 elementor-widget elementor-widget-heading\" data-id=\"56184c5\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/descrizione-prodotti\/cartografia-stampata\/\">Printed Maps<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9fc7ef4 e-con-full e-flex e-con e-child\" data-id=\"9fc7ef4\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6325759 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"6325759\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ddb7a8b e-con-full e-flex e-con e-child\" data-id=\"ddb7a8b\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-adde4fc e-con-full e-flex e-con e-child\" data-id=\"adde4fc\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f0b5091 elementor-widget elementor-widget-heading\" data-id=\"f0b5091\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/product-description\/historical-maps\/\">Historical Maps<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ce6c84 e-con-full e-flex e-con e-child\" data-id=\"5ce6c84\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e8a4133 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"e8a4133\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-33f4da9 e-con-full e-flex e-con e-child\" data-id=\"33f4da9\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-e9002c8 e-con-full e-flex e-con e-child\" data-id=\"e9002c8\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-274bbfb e-con-full e-flex e-con e-child\" data-id=\"274bbfb\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-7e67c37 e-con-full e-flex e-con e-child\" data-id=\"7e67c37\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7e05ee9 elementor-widget elementor-widget-heading\" data-id=\"7e05ee9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/product-description\/digital-maps\/\">Digital Maps<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4654682 e-con-full e-flex e-con e-child\" data-id=\"4654682\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eb5a2e6 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"eb5a2e6\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b4c174e e-con-full e-flex e-con e-child\" data-id=\"b4c174e\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-1e8e85c e-con-full e-flex e-con e-child\" data-id=\"1e8e85c\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-accc43d elementor-widget elementor-widget-heading\" data-id=\"accc43d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/product-description\/geodetic-elements\/\">Geodetic Elements<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a2dd2fe e-con-full e-flex e-con e-child\" data-id=\"a2dd2fe\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-219ea50 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"219ea50\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4b8b8af e-con-full e-flex e-con e-child\" data-id=\"4b8b8af\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a6cf283 e-con-full e-flex e-con e-child\" data-id=\"a6cf283\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-fa0d641 e-con-full e-flex e-con e-child\" data-id=\"fa0d641\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f6614fb e-con-full e-flex e-con e-child\" data-id=\"f6614fb\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0a0fdd9 elementor-widget elementor-widget-heading\" data-id=\"0a0fdd9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/product-description\/aerial-photos\/\">Aerial Photos<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-37b7ac9 e-con-full e-flex e-con e-child\" data-id=\"37b7ac9\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e2f842e elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"e2f842e\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-64d4b78 e-con-full e-flex e-con e-child\" data-id=\"64d4b78\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-cfb6555 e-con-full e-flex e-con e-child\" data-id=\"cfb6555\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c65d086 elementor-widget elementor-widget-heading\" data-id=\"c65d086\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/igmi.esercito.difesa.it\/en\/product-description\/index-maps\/\">Map Catalogue<\/a><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4a41522 e-con-full e-flex e-con e-child\" data-id=\"4a41522\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5543e72 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"5543e72\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-97dedd0 e-flex e-con-boxed e-con e-parent\" data-id=\"97dedd0\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-9adfe88 e-flex e-con-boxed e-con e-child\" data-id=\"9adfe88\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b749a37 elementor-widget elementor-widget-heading\" data-id=\"b749a37\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Product Categories<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b2ce325 e-flex e-con-boxed e-con e-parent\" data-id=\"b2ce325\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-09d7e58 e-con-full e-flex e-con e-child\" data-id=\"09d7e58\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-90ce767 e-flex e-con-boxed e-con e-child\" data-id=\"90ce767\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f34137 elementor-pagination-type-bullets elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-n-carousel\" data-id=\"1f34137\" data-element_type=\"widget\" data-settings=\"{&quot;carousel_items&quot;:[{&quot;_id&quot;:&quot;658f11a&quot;,&quot;slide_title&quot;:&quot;Slide #2&quot;},{&quot;_id&quot;:&quot;b4b6599&quot;,&quot;slide_title&quot;:&quot;Slide #2&quot;},{&quot;_id&quot;:&quot;ecafc9e&quot;,&quot;slide_title&quot;:&quot;Slide #3&quot;},{&quot;_id&quot;:&quot;d25dd46&quot;,&quot;slide_title&quot;:&quot;Slide #4&quot;},{&quot;_id&quot;:&quot;573ebfa&quot;,&quot;slide_title&quot;:&quot;Slide #5&quot;},{&quot;_id&quot;:&quot;1c0b21e&quot;,&quot;slide_title&quot;:&quot;Slide #6&quot;}],&quot;offset_sides&quot;:&quot;right&quot;,&quot;image_spacing_custom&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:25,&quot;sizes&quot;:[]},&quot;slides_to_show_tablet&quot;:&quot;2&quot;,&quot;slides_to_show_mobile&quot;:&quot;1&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500,&quot;offset_width&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:80,&quot;sizes&quot;:[]},&quot;offset_width_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;offset_width_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;arrows&quot;:&quot;yes&quot;,&quot;pagination&quot;:&quot;bullets&quot;,&quot;image_spacing_custom_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-n-carousel swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Carosello\" dir=\"ltr\">\n\t\t\t<div class=\"swiper-wrapper\" aria-live=\"off\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"1\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d80942e e-flex e-con-boxed e-con e-child\" data-id=\"d80942e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-664abc6 e-con-full e-flex e-con e-child\" data-id=\"664abc6\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-807ae82 elementor-widget elementor-widget-heading\" data-id=\"807ae82\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Aerial Photos<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b74e06c elementor-widget elementor-widget-text-editor\" data-id=\"b74e06c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Explore the Italian Military Geographic Institute&#8217;s aerial photo archives: more than 300,000 photograms of Italy and some foreign states, taken between 1927 and 2010. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c917eee elementor-widget elementor-widget-button\" data-id=\"c917eee\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"2\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9710069 e-flex e-con-boxed e-con e-child\" data-id=\"9710069\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-15f4335 e-con-full e-flex e-con e-child\" data-id=\"15f4335\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0fc4f0d elementor-widget elementor-widget-heading\" data-id=\"0fc4f0d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Cartography<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1a7e05b elementor-widget elementor-widget-text-editor\" data-id=\"1a7e05b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Discover the official cartography of Italy produced by IGMI: accurate and updated maps, all realized with state-of-the-art technologies.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-00ec3df elementor-widget elementor-widget-button\" data-id=\"00ec3df\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/en\/cartography\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"3\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-da8a2c1 e-flex e-con-boxed e-con e-child\" data-id=\"da8a2c1\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-8d4b4f2 e-con-full e-flex e-con e-child\" data-id=\"8d4b4f2\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-beddf1a elementor-widget elementor-widget-heading\" data-id=\"beddf1a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Historical Maps<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aebdc0f elementor-widget elementor-widget-text-editor\" data-id=\"aebdc0f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Discover a unique collection of historical maps, perfect for scholars, collectors and enthusiasts.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1513fbe elementor-widget elementor-widget-button\" data-id=\"1513fbe\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/carte-storiche\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"4\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"4 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0931f65 e-flex e-con-boxed e-con e-child\" data-id=\"0931f65\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-887986a e-con-full e-flex e-con e-child\" data-id=\"887986a\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bb64e38 elementor-widget elementor-widget-heading\" data-id=\"bb64e38\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Terrestrial Photos<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-10b3463 elementor-widget elementor-widget-text-editor\" data-id=\"10b3463\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tThousands of historic, panoramic and terrestrial images of Italy and overseas territories, taken between 1876 and 1945\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-981f5a7 elementor-widget elementor-widget-button\" data-id=\"981f5a7\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/foto-terrestri\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"5\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"5 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bba104b e-flex e-con-boxed e-con e-child\" data-id=\"bba104b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-45c2d6c e-con-full e-flex e-con e-child\" data-id=\"45c2d6c\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c962907 elementor-widget elementor-widget-heading\" data-id=\"c962907\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Geodetic Elements<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-147a6ce elementor-widget elementor-widget-text-editor\" data-id=\"147a6ce\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tOn line purchasing of high quality IGMI products.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7067a73 elementor-widget elementor-widget-button\" data-id=\"7067a73\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/en\/geodetic-elements\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" data-slide=\"6\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"6 of 6\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2029f07 e-flex e-con-boxed e-con e-child\" data-id=\"2029f07\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-4d10b34 e-con-full e-flex e-con e-child\" data-id=\"4d10b34\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-56af4a7 elementor-widget elementor-widget-heading\" data-id=\"56af4a7\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Books and Magazines<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-42de1e8 elementor-widget elementor-widget-text-editor\" data-id=\"42de1e8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tIncrease your knowledge of the territory by the Italian Military Geographic Institute&#8217;s publications.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54f45cc elementor-widget elementor-widget-button\" data-id=\"54f45cc\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/igmi.esercito.difesa.it\/libri-e-riviste\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-arrow-right\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\" aria-label=\"Previous\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\" aria-label=\"Next\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Home \/ Negozio \/ Foto Aeree Aerial Photos Data Sheets Printed Maps Historical Maps Digital Maps Geodetic Elements Aerial Photos Map Catalogue Product Categories Aerial Photos Explore the Italian Military Geographic Institute&#8217;s aerial photo archives: more than 300,000 photograms of Italy and some foreign states, taken between 1927 and 2010. Cartography Discover the official cartography [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1625915","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Aerial Photos - Istituto Geografico Militare<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aerial Photos - Istituto Geografico Militare\" \/>\n<meta property=\"og:description\" content=\"Home \/ Negozio \/ Foto Aeree Aerial Photos Data Sheets Printed Maps Historical Maps Digital Maps Geodetic Elements Aerial Photos Map Catalogue Product Categories Aerial Photos Explore the Italian Military Geographic Institute&#8217;s aerial photo archives: more than 300,000 photograms of Italy and some foreign states, taken between 1927 and 2010. Cartography Discover the official cartography [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\" \/>\n<meta property=\"og:site_name\" content=\"Istituto Geografico Militare\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-24T10:04:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\",\"url\":\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\",\"name\":\"Aerial Photos - Istituto Geografico Militare\",\"isPartOf\":{\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#website\"},\"datePublished\":\"2025-04-14T07:28:51+00:00\",\"dateModified\":\"2026-04-24T10:04:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/igmi.esercito.difesa.it\/en\/homepage\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aerial Photos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#website\",\"url\":\"https:\/\/igmi.esercito.difesa.it\/en\/\",\"name\":\"Istituto Geografico Militare\",\"description\":\"Ente cartografico dello stato\",\"publisher\":{\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/igmi.esercito.difesa.it\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#organization\",\"name\":\"Istituto Geografico Militare\",\"url\":\"https:\/\/igmi.esercito.difesa.it\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/igmi.esercito.difesa.it\/wp-content\/uploads\/2025\/04\/Logo-igm.webp\",\"contentUrl\":\"https:\/\/igmi.esercito.difesa.it\/wp-content\/uploads\/2025\/04\/Logo-igm.webp\",\"width\":1320,\"height\":1696,\"caption\":\"Istituto Geografico Militare\"},\"image\":{\"@id\":\"https:\/\/igmi.esercito.difesa.it\/en\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Aerial Photos - Istituto Geografico Militare","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/","og_locale":"en_US","og_type":"article","og_title":"Aerial Photos - Istituto Geografico Militare","og_description":"Home \/ Negozio \/ Foto Aeree Aerial Photos Data Sheets Printed Maps Historical Maps Digital Maps Geodetic Elements Aerial Photos Map Catalogue Product Categories Aerial Photos Explore the Italian Military Geographic Institute&#8217;s aerial photo archives: more than 300,000 photograms of Italy and some foreign states, taken between 1927 and 2010. Cartography Discover the official cartography [&hellip;]","og_url":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/","og_site_name":"Istituto Geografico Militare","article_modified_time":"2026-04-24T10:04:05+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/","url":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/","name":"Aerial Photos - Istituto Geografico Militare","isPartOf":{"@id":"https:\/\/igmi.esercito.difesa.it\/en\/#website"},"datePublished":"2025-04-14T07:28:51+00:00","dateModified":"2026-04-24T10:04:05+00:00","breadcrumb":{"@id":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/igmi.esercito.difesa.it\/en\/aerial-photos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/igmi.esercito.difesa.it\/en\/homepage\/"},{"@type":"ListItem","position":2,"name":"Aerial Photos"}]},{"@type":"WebSite","@id":"https:\/\/igmi.esercito.difesa.it\/en\/#website","url":"https:\/\/igmi.esercito.difesa.it\/en\/","name":"Istituto Geografico Militare","description":"Ente cartografico dello stato","publisher":{"@id":"https:\/\/igmi.esercito.difesa.it\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/igmi.esercito.difesa.it\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/igmi.esercito.difesa.it\/en\/#organization","name":"Istituto Geografico Militare","url":"https:\/\/igmi.esercito.difesa.it\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/igmi.esercito.difesa.it\/en\/#\/schema\/logo\/image\/","url":"https:\/\/igmi.esercito.difesa.it\/wp-content\/uploads\/2025\/04\/Logo-igm.webp","contentUrl":"https:\/\/igmi.esercito.difesa.it\/wp-content\/uploads\/2025\/04\/Logo-igm.webp","width":1320,"height":1696,"caption":"Istituto Geografico Militare"},"image":{"@id":"https:\/\/igmi.esercito.difesa.it\/en\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/pages\/1625915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/comments?post=1625915"}],"version-history":[{"count":1,"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/pages\/1625915\/revisions"}],"predecessor-version":[{"id":1672399,"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/pages\/1625915\/revisions\/1672399"}],"wp:attachment":[{"href":"https:\/\/igmi.esercito.difesa.it\/en\/wp-json\/wp\/v2\/media?parent=1625915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}