wonder-image 2.1.2-alpha.21 → 2.1.2-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/head.css +1 -1
- package/dist/backend/head.css.map +1 -1
- package/dist/backend/head.js +1 -1
- package/dist/backend/head.js.map +1 -1
- package/dist/frontend/body-end.js +1 -1
- package/dist/frontend/body-end.js.map +1 -1
- package/dist/frontend/head.css +1 -1
- package/dist/frontend/head.css.map +1 -1
- package/dist/frontend/head.js +1 -1
- package/dist/frontend/head.js.map +1 -1
- package/package.json +2 -2
package/dist/frontend/head.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{var e={1192(e){e.exports="function check() {\n \n document.querySelectorAll(\"form .wi-submit\").forEach(button => {\n \n button.removeAttribute(\"disabled\");\n \n var inputList = button.form.elements;\n\n for (let i = 0; i < inputList.length; i++) {\n\n var input = inputList[i];\n\n if (input.closest && input.closest('[data-wi-conditional-hidden=\"true\"]')) { continue; }\n\n if (input.required) {\n if (input.type == 'checkbox' || input.type == 'radio') {\n if (input.checked == false) { button.setAttribute(\"disabled\", null); }\n } else {\n if (input.value == \"\") { button.setAttribute(\"disabled\", null); }\n }\n }\n\n if (!input.validity.valid) {\n button.setAttribute(\"disabled\", null);\n }\n\n }\n\n })\n\n}\n\nfunction togglePassword(el, id) {\n\n var input = document.getElementById(id);\n\n if (input.type == 'password') {\n input.type = 'text'\n el.classList.remove('bi-eye');\n el.classList.add('bi-eye-slash');\n }else{\n input.type = 'password'\n el.classList.remove('bi-eye-slash');\n el.classList.add('bi-eye');\n }\n\n}\n\nfunction checkNumber(event) {\n\n event.target.value = event.target.value.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');\n \n}\n\nfunction labelPositionTop(event) {\n\n event.target.parentElement.classList.add('compiled');\n\n}\n\nfunction labelPosition(event) {\n\n var container = event.target.parentElement;\n\n if (event.target.value == '' && event.target !== document.activeElement) {\n container.classList.remove('compiled');\n } else {\n container.classList.add('compiled');\n }\n\n}\n\nfunction customDateRange(element) {\n\n var inputFrom = element.querySelector('input.wi-daterange-from');\n var inputTo = element.querySelector('input.wi-daterange-to');\n\n if (inputFrom.value != '') {\n $('#'+inputTo.id).datepicker('option', 'minDate', inputFrom.value);\n }\n\n}\n\nfunction customDateTimeRange(element) {\n\n var inputFrom = element.querySelector('input.wi-datetimerange-from');\n var inputTo = element.querySelector('input.wi-datetimerange-to');\n\n if (inputFrom.value != '') {\n $('#'+inputTo.id).datetimepicker('option', 'minDate', inputFrom.value);\n }\n\n}\n\nfunction datePickerOptions(element, toggle) {\n\n var options = {\n showAnim: 'slideDown',\n yearRange: '1900:3000',\n showOn: 'focus',\n dateFormat: 'dd/mm/yy',\n changeYear: true,\n changeMonth: true,\n showMonthAfterYear: true,\n hideIfNoPrevNext: true,\n firstDay: 1,\n dayNames: [ 'Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato' ],\n dayNamesShort: [ 'Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab' ],\n dayNamesMin: [ 'Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa' ],\n monthNames: [ 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre' ],\n monthNamesShort: [ 'Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic' ],\n beforeShow: function () { toggle(true); },\n onClose: function () { toggle(false); },\n };\n\n if (element.dataset.wiMinDate) { options.minDate = element.dataset.wiMinDate; }\n if (element.dataset.wiMaxDate) { options.maxDate = element.dataset.wiMaxDate; }\n\n return options;\n\n}\n\nfunction setDatePickerError(input, message) {\n\n var container = input.parentElement;\n var alert = container.querySelector('.alert-error');\n\n input.setCustomValidity(message);\n container.classList.add('input-error');\n\n if (!alert) { return; }\n\n alert.replaceChildren();\n var icon = document.createElement('i');\n icon.className = 'bi bi-exclamation-triangle';\n alert.append(icon, document.createTextNode(' '+message));\n\n}\n\nfunction validateSelectDate(event) {\n\n var input = event.currentTarget;\n var date = input.value;\n\n if (date === '' || typeof moment !== 'function') { return; }\n\n var label = input.dataset.wiDateLabel || 'data';\n var parsed = moment(date, 'DD/MM/YYYY', true);\n\n if (!parsed.isValid()) {\n setDatePickerError(input, 'La '+label+' deve essere formato gg/mm/aaaa');\n return;\n }\n\n removeInputError(input);\n\n if (input.dataset.wiMinDate && parsed.isBefore(moment(input.dataset.wiMinDate, 'DD/MM/YYYY'), 'day')) {\n setDatePickerError(input, 'La '+label+' deve essere maggiore del '+input.dataset.wiMinDate);\n }\n\n if (input.dataset.wiMaxDate && parsed.isAfter(moment(input.dataset.wiMaxDate, 'DD/MM/YYYY'), 'day')) {\n setDatePickerError(input, 'La '+label+' deve essere minore del '+input.dataset.wiMaxDate);\n }\n\n}\n\nfunction setDatePicker(input) {\n\n if (input.dataset.wiDatePickerReady === 'true') { return; }\n\n var container = input.parentElement;\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n };\n\n $(input).datepicker(datePickerOptions(input, toggle));\n\n if (input.value !== '') {\n $(input).datepicker('setDate', input.value);\n }\n\n if (input.dataset.wiSelectDate === 'true') {\n input.addEventListener('change', validateSelectDate);\n }\n\n input.dataset.wiDatePickerReady = 'true';\n\n}\n\nfunction setDateRangePicker(container) {\n\n if (container.dataset.wiDateRangeReady === 'true') { return; }\n\n var inputFrom = container.querySelector('input.wi-daterange-from');\n var inputTo = container.querySelector('input.wi-daterange-to');\n\n if (!inputFrom || !inputTo) { return; }\n\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n customDateRange(container);\n };\n var options = datePickerOptions(inputFrom, toggle);\n\n [inputFrom, inputTo].forEach(function (input) {\n $(input).datepicker(options);\n if (input.value !== '') { $(input).datepicker('setDate', input.value); }\n });\n\n container.dataset.wiDateRangeReady = 'true';\n\n}\n\nfunction setDateTimeRangePicker(container) {\n\n if (container.dataset.wiDateTimeRangeReady === 'true') { return; }\n\n var inputFrom = container.querySelector('input.wi-datetimerange-from');\n var inputTo = container.querySelector('input.wi-datetimerange-to');\n\n if (!inputFrom || !inputTo) { return; }\n\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n customDateTimeRange(container);\n };\n var options = datePickerOptions(inputFrom, toggle);\n options.controlType = 'select';\n options.oneLine = true;\n options.timeFormat = 'HH:mm';\n options.stepMinute = 5;\n\n [inputFrom, inputTo].forEach(function (input) {\n $(input).datetimepicker(options);\n });\n\n container.dataset.wiDateTimeRangeReady = 'true';\n\n}\n\nfunction setDateInputs(container = document) {\n\n container.querySelectorAll(\"[data-wi-date-picker='true']\").forEach(setDatePicker);\n container.querySelectorAll(\"[data-wi-date-range='true']\").forEach(setDateRangePicker);\n container.querySelectorAll(\"[data-wi-date-time-range='true']\").forEach(setDateTimeRangePicker);\n\n}\n\nfunction checkLabel() {\n\n document.querySelectorAll(\"[data-wi-label='true']\").forEach(element => {\n \n var container = element.parentElement;\n\n if (element.value == '') {\n container.classList.remove('compiled');\n } else {\n container.classList.add('compiled');\n }\n \n });\n\n}\n\nfunction checkInputFile(event) {\n\n var input = event.target;\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n\n var maxFile = input.dataset.wiMaxFile;\n var maxSize = input.dataset.wiMaxSize;\n var prettyMaxSize = ((maxSize/1024)/1024).toFixed(2); // MB\n\n var prettyErrorFile = \"<i class='bi bi-exclamation-triangle'></i> Hai caricato troppi file! Puoi caricare massimo \"+maxFile+\" file\";\n var prettyErrorSize = \"<i class='bi bi-exclamation-triangle'></i> Hai caricato file troppo grandi! Le dimensioni massime sono di \"+prettyMaxSize+\"Mb\";\n\n var files = input.files;\n\n inputContainer.classList.remove('input-error');\n errorContainer.innerHTML = '';\n\n for (var x in files) {\n\n if(files[x].size > maxSize){\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = prettyErrorSize;\n input.value = \"\";\n break;\n\n }\n\n }\n\n if (files.length > maxFile) {\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = prettyErrorFile;\n input.value = \"\";\n\n }\n \n}\n\nfunction inputError(input, error, errorIcon = \"<i class='bi bi-exclamation-triangle'></i>\") {\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = errorIcon+' '+error;\n input.setCustomValidity(error);\n\n}\n\nfunction removeInputError(input) {\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n \n inputContainer.classList.remove('input-error');\n errorContainer.innerHTML = \"\";\n input.setCustomValidity(\"\");\n\n}\n\nfunction setInput() {\n\n setDateInputs();\n\n document.querySelectorAll(\"[data-wi-max-file]\").forEach(element => {\n element.addEventListener(\"change\", checkInputFile);\n });\n\n document.querySelectorAll(\"[data-wi-max-size]\").forEach(element => {\n element.addEventListener(\"change\", checkInputFile);\n });\n \n document.querySelectorAll(\"[data-wi-label='true']\").forEach(element => {\n element.addEventListener(\"input\", labelPosition);\n element.addEventListener(\"change\", labelPosition);\n element.addEventListener(\"focusin\", labelPositionTop);\n element.addEventListener(\"focusout\", labelPosition);\n });\n\n document.querySelectorAll(\"[data-wi-check='true']\").forEach(element => {\n element.addEventListener(\"keyup\", check);\n element.addEventListener(\"change\", check);\n element.addEventListener(\"focusin\", check);\n element.addEventListener(\"focusout\", check);\n });\n\n document.querySelectorAll(\"[data-wi-list-input='true']\").forEach(element => {\n element.addEventListener(\"keyup\", searchInput);\n element.addEventListener(\"focusin\", searchInput);\n element.addEventListener(\"focusin\", (event) => { delay(300).then(() => { showList(event) }) });\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"focusout\", hideList);\n element.addEventListener(\"change\", controlList);\n element.addEventListener(\"focusout\", controlList);\n });\n\n document.querySelectorAll(\"[data-wi-search-input='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchResults);\n element.addEventListener(\"change\", controlList);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-search-text='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchText);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-search-radio='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchRadio);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n document.querySelectorAll(\"[data-wi-phone='true']\").forEach(element => {\n checkPhone(element);\n });\n\n setConditional();\n check();\n setAutonumeric();\n setGoogleMapsApi();\n setInputCountry();\n setRecaptcha();\n\n}\n"},2578(e){e.exports="function searchInput(event) {\n \n var inputId = event.target.id;\n var inputValue = event.target.value.toLowerCase();\n \n document.querySelectorAll('#list_'+inputId+' input').forEach(x => {\n \n var keyword = x.dataset.wiKeyword.toLowerCase();\n\n if (keyword.includes(inputValue)) {\n x.parentElement.style.display = 'block';\n } else {\n x.parentElement.style.display = 'none';\n }\n \n });\n \n}\n\n// const event_CheckInput = new Event(\"wi-check-input\");\n\nfunction checkInput(event) {\n \n var container = event.target;\n\n if (container.localName == 'div') {\n var checkbox = container.querySelector('input');\n } else {\n var checkbox = container;\n }\n\n var inputId = checkbox.dataset.wiInput;\n\n checkbox.checked = true;\n\n var input = document.querySelector('#'+inputId);\n input.value = checkbox.dataset.wiName;\n // input.dispatchEvent(event_CheckInput);\n\n check();\n\n}\n\nfunction controlList(event) {\n\n var element = event.target;\n var container = event.target.parentElement;\n \n var l = element.dataset.wiListArray.split('|');\n var v = element.value.toLowerCase();\n\n if (v != '') {\n if (l.includes(v)) {\n\n removeInputError(element);\n\n container.querySelectorAll('input[type=radio]').forEach(e => {\n\n var name = e.dataset.wiName;\n\n if (name.toLowerCase() == v) {\n e.checked = true;\n } else {\n e.checked = false;\n }\n\n });\n \n } else {\n \n inputError(element, 'Campo non corretto')\n container.querySelectorAll('input[type=radio]:checked').forEach(e => { e.checked = false; });\n \n }\n }\n\n check();\n\n}\n\n\nfunction showList(event) { event.target.parentElement.classList.add('wi-list-active'); }\n\nfunction hideList(event) { event.target.parentElement.classList.remove('wi-list-active'); }\n\nfunction searchText(event) { searchResults(event, \"text\"); }\n\nfunction searchRadio(event) { searchResults(event, \"radio\"); }\n\nfunction searchResults(event, result) {\n\n var input = event.target;\n\n var container = input.parentElement;\n\n var list = container.querySelector('.wi-input-list');\n var listValue = list.querySelector('.wi-input-list-body');\n var listFooter = list.querySelector('.wi-input-list-footer');\n\n var inputId = input.id;\n var inputName = input.dataset.wiName;\n var inputValue = input.value.toLowerCase();\n\n var inputUrl = input.dataset.wiSearchUrl;\n\n if (result == 'radio') {\n var radioName = \"name='\"+inputName+\"'\";\n } else {\n var radioName = \"\";\n }\n\n $.ajax({\n type: \"POST\",\n url: inputUrl,\n data: { \n post: 'true',\n search: inputValue\n }, \n success: function (data) {\n\n const response = JSON.parse(data);\n const nResponse = response.length;\n \n var listHTML = \"\";\n\n for (let index = 0; index < nResponse; index++) {\n\n const value = response[index]['value'];\n const label = response[index]['label'];\n const inputValue = response[index]['input-value'];\n\n listHTML += \"<div class='wi-input-list-value' data-wi-list-value='true'><input data-wi-input='\"+inputId+\"' type='radio' \"+radioName+\" data-wi-name='\"+inputValue+\"' value='\"+value+\"'>\"+label+\"</div>\";\n\n }\n\n if (inputValue == '') {\n listFooter.innerHTML = \"Cosa stai cercando?\";\n } else if (nResponse == 1) {\n listFooter.innerHTML = nResponse+\" risultato\";\n } else if (nResponse != 1) {\n listFooter.innerHTML = nResponse+\" risultati\";\n }\n\n listValue.innerHTML = listHTML;\n\n document.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.querySelector('input').setAttribute('aria-label', element.textContent.trim());\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n },\n error: function (XMLHttpRequest) {\n ajaxRequestError(XMLHttpRequest);\n loadingSpinner();\n }\n });\n\n}\n\nfunction textListValue (input, value) {\n\n var form = input.form;\n var inputName = input.dataset.wiName.replace('-text', '');\n \n if (value == '') {\n\n input.value = '';\n\n if (inputChecked = form.querySelector('input[name=\"'+inputName+'\"]:checked')) {\n inputChecked.checked = false;\n }\n\n } else {\n\n if (form.querySelector('input[name=\"'+inputName+'\"][value=\"'+value+'\"]')) {\n form.querySelector('input[name=\"'+inputName+'\"][value=\"'+value+'\"]').click();\n checkLabel(); \n }\n\n }\n\n checkLabel();\n\n}\n\nfunction textListOptions(input, options) {\n \n var listHTML = \"\";\n var listArray = [];\n\n var form = input.form;\n var inputId = input.id;\n var inputAttribute = input.dataset.wiInputAttribute;\n var inputLabel = input.labels[0];\n var inputName = input.dataset.wiName.replace('-text', '');;\n\n var listContainer = form.querySelector('#list_'+inputId);\n\n input.dataset.wiListArray = \"\";\n listContainer.innerHTML = \"\";\n\n for (var optionValue in options) {\n\n var optionId = \"value_\"+code();\n var optionLabel = options[optionValue];\n\n listArray.push(optionLabel);\n \n listHTML += \"<div class='wi-input-list-value' data-wi-list-value='true'><input id='\"+optionId+\"' data-wi-keyword='\"+optionValue+\" \"+optionLabel+\"' data-wi-input='\"+inputId+\"' data-wi-name='\"+optionLabel+\"' type='radio' name='\"+inputName+\"' value='\"+optionValue+\"'>\"+optionLabel+\"</div>\";\n\n }\n\n if (listHTML == \"\") {\n\n input.required = false;\n input.disabled = true;\n inputLabel.innerHTML = inputLabel.innerHTML.replace('*', '');\n\n } else {\n\n if (inputAttribute.indexOf('required') != '-1') { \n\n input.required = true;\n\n if (inputLabel.innerHTML.indexOf('*') == '-1') { \n inputLabel.innerHTML = inputLabel.innerHTML+'*' \n }\n\n }\n\n input.dataset.wiListArray = listArray.join('|').toLowerCase();\n listContainer.innerHTML = listHTML;\n\n }\n\n listContainer.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.querySelector('input').setAttribute('aria-label', element.textContent.trim());\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n checkLabel();\n\n}\n"},5365(e){e.exports="var recaptchaPending = new Set();\nvar recaptchaWidgets = new WeakMap();\nvar recaptchaObserved = new WeakSet();\nvar recaptchaScript = null;\nvar recaptchaObserver = null;\n\nfunction setRecaptchaInput() {\n if (!window.grecaptcha || !grecaptcha.enterprise || !grecaptcha.enterprise.render) { return; }\n recaptchaPending.forEach(function (element) {\n if (!element.isConnected || recaptchaWidgets.has(element)) {\n recaptchaPending.delete(element);\n return;\n }\n var form = element.closest('form');\n if (!form) { return; }\n var action = element.dataset.wiAction || form.id || 'undefined';\n function updateToken(token) {\n form.querySelector('input[name=\"g-recaptcha-token\"]').value = token;\n form.querySelector('input[name=\"g-recaptcha-action\"]').value = token ? action : '';\n check();\n }\n var widget = grecaptcha.enterprise.render(element, {\n sitekey: element.dataset.wiSiteKey,\n action: action,\n theme: element.dataset.wiTheme,\n size: element.dataset.wiSize,\n callback: updateToken,\n 'expired-callback': function () { updateToken(''); },\n 'error-callback': function () { updateToken(''); }\n });\n recaptchaWidgets.set(element, widget);\n recaptchaPending.delete(element);\n });\n}\n\nfunction requestRecaptcha(element) {\n if (recaptchaWidgets.has(element)) { return; }\n recaptchaPending.add(element);\n if (window.grecaptcha && grecaptcha.enterprise && grecaptcha.enterprise.render) {\n setRecaptchaInput();\n return;\n }\n if (recaptchaScript) { return; }\n recaptchaScript = document.querySelector('script[src*=\"/recaptcha/enterprise.js\"]');\n if (recaptchaScript) {\n recaptchaScript.addEventListener('load', setRecaptchaInput, { once: true });\n return;\n }\n recaptchaScript = document.createElement('script');\n recaptchaScript.async = true;\n recaptchaScript.src = 'https://www.google.com/recaptcha/enterprise.js?onload=setRecaptchaInput&render=explicit';\n recaptchaScript.onerror = function () {\n recaptchaScript.remove();\n recaptchaScript = null;\n };\n document.head.appendChild(recaptchaScript);\n}\n\nfunction setRecaptcha() {\n if (!recaptchaObserver && 'IntersectionObserver' in window) {\n recaptchaObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) { requestRecaptcha(entry.target); }\n });\n }, { rootMargin: '300px' });\n }\n document.querySelectorAll('form .g-recaptcha').forEach(function (element) {\n if (recaptchaObserved.has(element)) { return; }\n recaptchaObserved.add(element);\n var form = element.closest('form');\n form.addEventListener('focusin', function () { requestRecaptcha(element); });\n form.addEventListener('pointerdown', function () { requestRecaptcha(element); }, { passive: true });\n if (recaptchaObserver) { recaptchaObserver.observe(element); }\n else { requestRecaptcha(element); }\n });\n}\n"},7060(e){e.exports="function scrolla(selector){\n \n if (document.querySelector(selector)) {\n\n var element = document.querySelector(selector);\n\n var headerHeight = '80';\n\n if (document.querySelector('header')) {\n headerHeight = document.querySelector('header').offsetHeight;\n }\n\n element.style.scrollMargin = headerHeight+'px';\n element.scrollIntoView({ behavior: 'smooth' });\n\n } else {\n\n console.error(\"Selettore ( \"+selector+\" ) non valido\");\n\n }\n\n}\n\nvar keys = {37: 1, 38: 1, 39: 1, 40: 1};\n\nfunction preventDefault(e) {\n e.preventDefault();\n}\n\nfunction preventDefaultForScrollKeys(e) {\n if (keys[e.keyCode]) {\n preventDefault(e);\n return false;\n }\n}\n\n// modern Chrome requires { passive: false } when adding event\nvar supportsPassive = false;\ntry {\n window.addEventListener(\"test\", null, Object.defineProperty({}, 'passive', {\n get: function () { supportsPassive = true; } \n}));\n} catch(e) {}\n\nvar wheelOpt = supportsPassive ? { passive: false } : false;\nvar wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';\n\n// call this to Disable\nfunction disableAllScroll() {\n window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF\n window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop\n window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile\n window.addEventListener('keydown', preventDefaultForScrollKeys, false);\n}\n\n// call this to Enable\nfunction enableAllScroll() {\n window.removeEventListener('DOMMouseScroll', preventDefault, false);\n window.removeEventListener(wheelEvent, preventDefault, wheelOpt); \n window.removeEventListener('touchmove', preventDefault, wheelOpt);\n window.removeEventListener('keydown', preventDefaultForScrollKeys, false);\n}\n\nfunction disableScroll() {\n document.querySelector('body').classList.add('block-scroll');\n}\n\nfunction enableScroll() {\n document.querySelector('body').classList.remove('block-scroll');\n}"},2758(e){e.exports="function configTooltip(triggerEL, tooltipEL, config) {\n\n var middleware = [\n FloatingUIDOM.offset(4),\n FloatingUIDOM.flip(), \n FloatingUIDOM.shift({ padding: 4 })\n ];\n\n if (config.arrow) { middleware.push( FloatingUIDOM.arrow({ element: tooltipEL.querySelector('.arrow') }) ); }\n\n FloatingUIDOM.computePosition(triggerEL, tooltipEL, {\n placement: config.placement,\n middleware: middleware\n }).then(({x, y, placement, middlewareData}) => {\n\n Object.assign(tooltipEL.style, { left: `${x}px`, top: `${y}px` });\n\n if (config.arrow) {\n\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n \n Object.assign(tooltipEL.querySelector('.arrow').style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n });\n \n }\n\n });\n\n}\n\nfunction createTooltip(event) {\n\n var tooltipId = 'tooltip-'+code();\n var element = event.target;\n var elData = element.dataset;\n\n var options = [];\n options.title = elData.wiTitle ?? 'ND';\n options.placement = elData.wiPlacement ?? 'top';\n options.arrow = elData.wiArrow == 'true' ? true : false;\n options.class = elData.wiClass ?? '';\n\n element.setAttribute(\"aria-describedby\", tooltipId);\n\n var tooltipContent = options.title;\n\n if (options.arrow) { tooltipContent += '<div class=\"arrow\"></div>'; }\n\n var tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.innerHTML = tooltipContent;\n \n tooltip.setAttribute(\"role\", 'tooltip');\n tooltip.setAttribute(\"class\", 'tooltip '+options.class);\n\n tooltip.style.display = 'block';\n\n document.body.appendChild(tooltip);\n\n configTooltip(element, tooltip, options);\n\n}\n\nfunction removeTooltip() { document.querySelectorAll('.tooltip').forEach(tooltip => { tooltip.remove(); }); }\n\nfunction setTooltip() {\n\n document.querySelectorAll('[data-wi-toggle=\"tooltip\"]').forEach(el => {\n \n [\n ['mouseenter', createTooltip],\n ['mouseleave', removeTooltip],\n ['focus', createTooltip],\n ['blur', removeTooltip],\n ].forEach(([event, listener]) => { el.addEventListener(event, listener); });\n \n });\n\n}"},373(e){e.exports="function loadingSpinner(action = 'toggle') {\n\n const spinner = document.getElementById('loading-spinner');\n let shouldShow;\n\n if (action === 'toggle') {\n shouldShow = spinner.classList.contains('d-none');\n } else {\n shouldShow = action;\n }\n\n if (shouldShow) {\n if (spinner.classList.contains('d-none')) {\n spinner.classList.remove('d-none', 'no-interaction');\n disableScroll();\n }\n } else {\n if (!spinner.classList.contains('d-none')) {\n spinner.classList.add('d-none', 'no-interaction');\n enableScroll();\n }\n }\n\n}"},8882(e){e.exports='function canvasFullPage(elementId, draw = false) {\n\n var element = document.createElement("CANVAS");\n element.id = elementId;\n element.style.position = "fixed";\n element.style.top = 0;\n element.style.left = 0;\n element.style.zIndex = 999999;\n element.style.background = \'#ffffff\';\n element.style.touchAction = \'none\';\n element.style.msTouchAction = \'none\';\n\n fullPage(element);\n\n window.addEventListener(\'resize\', () => { fullPage(element) });\n\n if (draw) { canvasDraw(element); }\n\n}\n\nfunction canvasReset(element) {\n \n var ctx = element.getContext("2d");\n ctx.clearRect(0, 0, element.width, element.height);\n ctx.restore();\n\n}\n\nfunction canvasDraw(element) {\n\n var ctx = element.getContext("2d");\n \n let offset = position(element);\n let painting = false;\n\n function drawStart() {\n offset = position(element);\n painting = true;\n draw(e);\n }\n\n function drawEnd() {\n painting = false;\n ctx.beginPath();\n }\n\n function draw(e) {\n\n if (!painting) return;\n ctx.lineWidth = 1;\n ctx.lineCap = "round";\n ctx.strokeStyle = "black";\n\n if (e.type == \'touchmove\'){\n var x = e.touches[0].clientX;\n var y = e.touches[0].clientY;\n } else if (e.type == \'mousemove\'){\n var x = e.clientX;\n var y = e.clientY;\n }\n\n var offsetX = offset.left;\n var offsetY = offset.top;\n\n var x = x - offsetX;\n var y = y - offsetY;\n\n ctx.lineTo(x, y);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x, y);\n\n }\n\n element.addEventListener("mousedown", drawStart);\n element.addEventListener("touchstart", drawStart);\n element.addEventListener("mouseup", drawEnd);\n element.addEventListener("touchend", drawEnd);\n element.addEventListener("mousemove", draw);\n element.addEventListener("touchmove", draw);\n\n}'},6944(e){e.exports='async function postData(url, data) {\n\n loadingSpinner();\n\n if (data === undefined) {\n\n console.error("Non è stato passato alcun dato alla funzione postData()");\n alertToast(800);\n\n } else {\n \n var form = (data instanceof FormData === false) ? createPostData(data) : data;\n\n return await fetch(url, {\n method: "POST",\n body: form\n })\n .then((response) => { \n\n if (response.ok) {\n\n return response.json().catch((error) => { \n\n console.error("Il file non risponde in JSON!");\n throw new Error(802);\n\n });\n\n } else {\n\n console.error("Impossibile connettersi o trovare il file!");\n throw new Error(802);\n\n }\n \n })\n .then((value) => { \n \n if (value.status == 200) {\n\n loadingSpinner(); \n return value;\n\n } else if (value.status == 401) {\n\n throw new Error(911);\n\n } else if (value.status) {\n\n throw new Error(value.status);\n \n } else {\n\n console.error("La risposta deve avere il seguente formato: ", {\n success: true,\n status:\t200,\n response: {}\n });\n\n throw new Error(803);\n\n }\n\n })\n .catch((error) => { \n \n loadingSpinner(); \n alertToast(error.message); \n\n })\n\n }\n\n}\n\nfunction createPostData(array = {}) {\n\n var data = new FormData();\n\n Object.keys(array).forEach(key => {\n data.append(key, array[key]);\n });\n\n return data;\n\n}\n\n// Vecchie funzioni\nfunction fetchResponse(response) {\n \n if (response.ok) {\n\n return response.json();\n\n } else {\n\n alertToast(802);\n console.error("Impossibile connettersi o trovare il file!");\n return false;\n\n }\n\n}\n\nfunction fetchValue(value) {\n \n if (value == false) {\n \n return false;\n \n } else {\n\n if (value.status == 200) {\n return value;\n } else if (value.status == 401) {\n alertToast(911);\n return false;\n } else if (value.status == undefined) {\n alertToast(803);\n return false;\n } else {\n alertToast(value.status);\n return false;\n }\n\n }\n\n}\n\nfunction fetchError(error) {\n \n alertToast(802);\n console.error("Il file non risponde in JSON!");\n\n}'},8197(e){e.exports="var AUTONUMERIC_NUMBER = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nvar AUTONUMERIC_PRICE = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbol: '€',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nvar AUTONUMERIC_PERCENTIGE = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbol: '%',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nfunction customAutonumeric(element, autonumeric) {\n\n var option = {};\n\n if (autonumeric.caretPositionOnFocus != undefined) { \n option.caretPositionOnFocus = autonumeric.caretPositionOnFocus; \n }\n\n if (element.dataset.wiNumberDecimal != undefined) { \n option.decimalPlacesShownOnFocus = element.dataset.wiNumberDecimal;\n option.decimalPlaces = element.dataset.wiNumberDecimal;\n } else {\n if (autonumeric.decimalPlacesShownOnFocus != undefined) {\n option.decimalPlacesShownOnFocus = autonumeric.decimalPlacesShownOnFocus;\n }\n }\n\n if (element.dataset.wiNumberDecimalSeparator != undefined) { \n option.decimalCharacter = element.dataset.wiNumberDecimalSeparator;\n } else {\n if (autonumeric.decimalCharacter != undefined) {\n option.decimalCharacter = autonumeric.decimalCharacter;\n }\n }\n\n if (element.dataset.wiNumberGroupSeparator != undefined) { \n option.digitGroupSeparator = element.dataset.wiNumberGroupSeparator;\n } else {\n if (autonumeric.digitGroupSeparator != undefined) {\n option.digitGroupSeparator = autonumeric.digitGroupSeparator;\n }\n }\n\n // AutoNumeric non parte se decimali e migliaia hanno lo stesso segno:\n // vince il decimale chiesto dal campo e le migliaia restano senza separatore.\n if (option.decimalCharacter != undefined && option.decimalCharacter === option.digitGroupSeparator) {\n option.digitGroupSeparator = '';\n }\n\n // Con la virgola decimale anche il punto (quello del tastierino) scrive i decimali.\n if (option.decimalCharacter != undefined && option.decimalCharacter !== '.') {\n option.decimalCharacterAlternative = '.';\n }\n\n if (autonumeric.onInvalidPaste != undefined) { \n option.onInvalidPaste = autonumeric.onInvalidPaste; \n }\n\n if (element.dataset.wiNumberSymbol != undefined) { \n option.currencySymbol = element.dataset.wiNumberSymbol;\n } else {\n if (autonumeric.currencySymbol != undefined) {\n option.currencySymbol = autonumeric.currencySymbol;\n }\n }\n\n if (element.dataset.wiNumberSymbolPlacement != undefined) { \n option.currencySymbolPlacement = element.dataset.wiNumberSymbolPlacement;\n } else {\n if (autonumeric.currencySymbolPlacement != undefined) {\n option.currencySymbolPlacement = autonumeric.currencySymbolPlacement;\n }\n }\n\n if (autonumeric.outputFormat != undefined) { \n option.outputFormat = autonumeric.outputFormat; \n }\n\n if (autonumeric.unformatOnSubmit != undefined) { \n option.unformatOnSubmit = autonumeric.unformatOnSubmit; \n }\n\n if (autonumeric.modifyValueOnWheel != undefined) { \n option.modifyValueOnWheel = autonumeric.modifyValueOnWheel; \n }\n\n return option;\n \n}\n\nfunction setAutonumeric(container = document) {\n \n container.querySelectorAll(\"[data-wi-number='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n \n if (el === null) {\n\n new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_NUMBER)); \n \n }\n\n });\n\n container.querySelectorAll(\"[data-wi-price='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n if (el === null) { new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_PRICE)); }\n\n });\n \n container.querySelectorAll(\"[data-wi-percentige='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n if (el === null) { new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_PERCENTIGE)); }\n\n });\n\n}"},1367(e){e.exports='function wiConditionalControls(field, name) {\n\n var scope = field.form || document;\n var controls = [];\n var normalizedName = String(name || "").replace(/\\[\\]$/, "");\n\n scope.querySelectorAll("[name]").forEach(function(control) {\n var controlName = String(control.name || "").replace(/\\[\\]$/, "");\n\n if (controlName === normalizedName) { controls.push(control); }\n });\n\n return controls;\n\n}\n\nfunction wiConditionalDriverValues(field, name) {\n\n var values = [];\n var controls = wiConditionalControls(field, name);\n var hasValueControl = controls.some(function(control) {\n return (control.type || "").toLowerCase() !== "hidden";\n });\n\n controls.forEach(function(control) {\n\n var type = (control.type || "").toLowerCase();\n\n if (type === "hidden" && hasValueControl) { return; }\n\n if (type === "radio" || type === "checkbox") {\n if (control.checked) { values.push(String(control.value)); }\n return;\n }\n\n if (control.multiple && control.options) {\n Array.from(control.options).forEach(function(option) {\n if (option.selected) { values.push(String(option.value)); }\n });\n return;\n }\n\n if (control.value !== undefined && control.value !== "") {\n values.push(String(control.value));\n }\n\n });\n\n return values;\n\n}\n\nfunction wiConditionalDriverValue(field, name) {\n\n var values = wiConditionalDriverValues(field, name);\n\n return values.length ? values[values.length - 1] : "";\n\n}\n\nfunction wiConditionalWrapper(field) {\n\n var explicit = field.closest("[data-wi-conditional-container]");\n if (explicit) { return explicit; }\n\n var row = field.closest("[data-wi-input-row]");\n if (row) { return row; }\n\n var wonder = field.closest(".wi-input-container");\n if (wonder) {\n var wonderParent = wonder.parentElement;\n\n if (field.form && wonderParent && wonderParent.parentElement === field.form && wonderParent.children.length === 1) {\n return wonderParent;\n }\n\n return wonder;\n }\n\n var floating = field.closest(".form-floating");\n if (floating) { return floating.parentElement || floating; }\n\n var bootstrap = field.closest(\'[id^="container-"]\');\n if (bootstrap) { return bootstrap.parentElement || bootstrap; }\n\n var group = field.closest("[data-wi-date-range], [data-wi-date-time-range], .input-group");\n if (group) { return group.parentElement || group; }\n\n return field.parentElement;\n\n}\n\nfunction wiSetConditionalVisibility(field, show) {\n\n var wrapper = wiConditionalWrapper(field);\n\n if (!field.dataset.wiConditionalRequired) {\n field.dataset.wiConditionalRequired = field.required ? "required" : "optional";\n }\n\n field.required = show && field.dataset.wiConditionalRequired === "required";\n\n if (!wrapper) { return; }\n\n if (!wrapper.dataset.wiConditionalDisplayCaptured) {\n wrapper.dataset.wiConditionalDisplayCaptured = "1";\n wrapper.dataset.wiConditionalDisplay = wrapper.style.display || "";\n wrapper.dataset.wiConditionalAriaHidden = wrapper.getAttribute("aria-hidden") || "";\n wrapper.dataset.wiConditionalAriaHiddenPresent = wrapper.hasAttribute("aria-hidden") ? "1" : "0";\n }\n\n if (show) {\n wrapper.style.display = wrapper.dataset.wiConditionalDisplay || "";\n\n if (wrapper.dataset.wiConditionalAriaHiddenPresent === "1") {\n wrapper.setAttribute("aria-hidden", wrapper.dataset.wiConditionalAriaHidden);\n } else {\n wrapper.removeAttribute("aria-hidden");\n }\n\n wrapper.removeAttribute("data-wi-conditional-hidden");\n return;\n }\n\n wrapper.style.display = "none";\n wrapper.setAttribute("aria-hidden", "true");\n wrapper.setAttribute("data-wi-conditional-hidden", "true");\n\n}\n\nfunction wiEvaluateConditional() {\n\n document.querySelectorAll("[data-visible-when], [data-hidden-when]").forEach(function(field) {\n\n var isVisibleRule = field.hasAttribute("data-visible-when");\n var name = isVisibleRule ? field.dataset.visibleWhen : field.dataset.hiddenWhen;\n var list = (isVisibleRule ? field.dataset.visibleWhenValues : field.dataset.hiddenWhenValues) || "";\n var expected = list.split(",").map(function(item) { return item.trim(); });\n var current = wiConditionalDriverValues(field, name);\n\n if (!current.length) { current = [""]; }\n\n var matches = current.some(function(value) { return expected.indexOf(value) !== -1; });\n var show = isVisibleRule ? matches : !matches;\n\n wiSetConditionalVisibility(field, show);\n\n });\n\n if (typeof check === "function") { check(); }\n\n}\n\nfunction setConditional(container = document) {\n\n var selector = "[data-visible-when], [data-hidden-when]";\n var fields = Array.from(container.querySelectorAll(selector));\n\n if (container.matches && container.matches(selector)) {\n fields.unshift(container);\n }\n\n if (!fields.length) { return; }\n\n fields.forEach(function(field) {\n\n var name = field.dataset.visibleWhen || field.dataset.hiddenWhen;\n if (!name) { return; }\n\n wiConditionalControls(field, name).forEach(function(control) {\n if (control.wiConditionalBound === true) { return; }\n\n control.wiConditionalBound = true;\n control.dataset.wiConditionalBound = "1";\n control.addEventListener("change", wiEvaluateConditional);\n control.addEventListener("input", wiEvaluateConditional);\n });\n\n });\n\n wiEvaluateConditional();\n\n}\n'},7059(e){e.exports="function setRequired(element, required = true) {\n \n labelAsterisk(element, required);\n\n element.required = required;\n\n}\n\nfunction setDisabled(element, disabled = true) {\n \n labelAsterisk(element, disabled ? false : true);\n\n if (disabled) {\n if (element.type === 'checkbox' || element.type === 'radio') { element.checked = false; }\n }\n\n element.disabled = disabled;\n\n}\n\nfunction labelAsterisk(input, asterisk = true)\n{\n\n if (input.labels) {\n \n var label = input.labels[0];\n var labelValue = label.innerHTML;\n var hasAsterisk = (labelValue.substring(labelValue.length - 1) == '*') ? true : false;\n \n if (asterisk) {\n if (!hasAsterisk) { label.innerHTML = labelValue+'*'; }\n } else {\n if (hasAsterisk) { label.innerHTML = labelValue.replace('*', ''); }\n }\n\n }\n\n}\n\nfunction changeInputId(el) \n{\n\n const idEl = 'field_' + code(10).toLowerCase();\n const labelEl = el.parentElement.querySelector('.wi-label, .wi-checkbox-label');\n\n if (labelEl !== null) {\n el.id = idEl;\n labelEl.htmlFor = idEl;\n }\n\n}"},2700(e){e.exports="function setGoogleMapsApi() {\n\n if (document.querySelector(\"[data-wi-search-place]\")) {\n\n /**\n * \n * Se ci sono degli input Place chiama le API di Google Place\n * Documentazione: https://developers.google.com/maps/documentation/javascript/place-autocomplete?hl=it\n * \n */\n\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.src = 'https://maps.googleapis.com/maps/api/js?key='+GOOGLE_API_KEY+'&loading=async&libraries=places&callback=initGoogleMapsPlace'; \n\n document.head.appendChild(script);\n \n }\n\n}\n\nfunction initGoogleMapsPlace() {\n\n document.querySelectorAll(\"[data-wi-search-place='true']\").forEach(input => {\n\n var callback = input.dataset.wiCallback ?? checkInputPlace;\n\n input.disabled = false;\n // Il campo abilitato da Places non e' una modifica dell'utente\n window.wiSaveBar?.absorb(input);\n \n var options = {};\n\n if (input.dataset.wiRestriction && input.dataset.wiRestriction != '[]') { \n\n var restrictions = JSON.parse(input.dataset.wiRestriction);\n options.componentRestrictions = restrictions; \n \n }\n\n options.fields = [ \"address_components\", \"geometry\" ];\n options.types = [ \"address\" ];\n \n var googlePlace = new google.maps.places.Autocomplete(input, options);\n\n input.addEventListener(\"change\", () => { placeNeedCheck(input); });\n googlePlace.addListener(\"place_changed\", () => { window[callback](input, googlePlace); });\n\n });\n\n}\n\nfunction placeNeedCheck(input) {\n\n inputError(input, 'Indirizzo non valido, è necessario selezionare un indirizzo dall\\'elenco!');\n\n}\n"},3883(e){e.exports="function isInternationalPhone(value) {\n\n return /^\\s*(\\+|00)/.test(String(value || ''));\n\n}\n\nfunction formatPhone(value, trimEnd) {\n\n value = String(value || '');\n\n // Numero nazionale: solo cifre, al massimo 10, a gruppi 3-3-4.\n if (!isInternationalPhone(value)) {\n var digits = value.replace(/\\D/g, '').slice(0, 10);\n return [digits.slice(0, 3), digits.slice(3, 6), digits.slice(6, 10)]\n .filter(Boolean)\n .join(' ');\n }\n\n // Numero internazionale (+ o 00): prefisso e gruppi come digitati, al massimo 15 cifre.\n var result = /^\\s*\\+/.test(value) ? '+' : '';\n var count = 0;\n var separator = false;\n\n value.replace(/^\\s*\\+/, '').split('').forEach(function (character) {\n if (!/\\d/.test(character)) {\n separator = count > 0;\n return;\n }\n\n if (count >= 15) { return; }\n\n if (separator) { result += ' '; }\n result += character;\n separator = false;\n count++;\n });\n\n if (separator && !trimEnd && count < 15) { result += ' '; }\n\n return result;\n\n}\n\nfunction checkPhone(element) {\n\n if (!element || element.dataset.wiPhoneInitialized === 'true') { return; }\n element.dataset.wiPhoneInitialized = 'true';\n\n var format = function (event) {\n var cursor = typeof element.selectionStart === 'number' ? element.selectionStart : null;\n var atEnd = cursor !== null && cursor >= element.value.length;\n var digitsBeforeCursor = cursor === null\n ? null\n : element.value.slice(0, cursor).replace(/[^\\d+]/g, '').length;\n var value = formatPhone(element.value, !event || event.type === 'change');\n\n if (element.value !== value) { element.value = value; }\n\n if (digitsBeforeCursor !== null && typeof element.setSelectionRange === 'function') {\n var position = atEnd ? value.length : 0;\n var digitsSeen = 0;\n while (!atEnd && position < value.length && digitsSeen < digitsBeforeCursor) {\n if (/[\\d+]/.test(value[position])) { digitsSeen++; }\n position++;\n }\n element.setSelectionRange(position, position);\n }\n };\n\n element.addEventListener('input', format);\n element.addEventListener('change', format);\n format();\n\n}\n"},6338(e){e.exports='// Loader dell\'API Google Maps JS (Dynamic Library Import) + marker builder di default.\n// Uso: await requireGoogleMaps([\'maps\', \'places\', \'marker\']); poi inizializzare la mappa.\nasync function requireGoogleMaps(libs = [ \'maps\', \'places\', \'marker\' ], options = {}) {\n\n const {\n key = (typeof GOOGLE_API_KEY !== \'undefined\' ? GOOGLE_API_KEY : \'\'),\n v = \'weekly\',\n language = null\n } = options;\n\n const params = { key, v };\n if (language) { params.language = language; }\n\n (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})(params);\n\n for (const lib of libs) {\n await google.maps.importLibrary(lib);\n }\n\n}\n\n// Builder di default per il contenuto di un AdvancedMarkerElement.\n// properties: { id, type, icon, image, name, address, url, badgeText }\n// Per un markup diverso passare la propria funzione a MapManager.addAdvancedMarker().\nfunction gmapMarkerConstructor(properties) {\n\n const content = document.createElement("div");\n\n if (properties.id) { content.id = `marker-${properties.id}`; }\n content.classList.add("wi-marker");\n if (properties.type) { content.classList.add(`wi-marker-${properties.type}`); }\n\n const image = properties.image ? `\n <div class="w-30 b-r-10 o-hidden">\n <div class="f-3-2">\n ${properties.image}\n </div>\n </div>` : \'\';\n\n const address = properties.address ? `<div class="text-small mt-1">${properties.address}</div>` : \'\';\n\n const badge = properties.url ? `\n <div class="features mt-2">\n <a href="${properties.url}" class="badge badge-primary">\n ${properties.badgeText ?? \'\'}\n </a>\n </div>` : \'\';\n\n content.innerHTML = `\n <div class="icon">\n <div class="f-1-1">\n ${properties.icon ?? \'\'}\n </div>\n </div>\n <div class="details">\n ${image}\n <div class="${properties.image ? \'w-70 pl-2\' : \'w-100\'} box-border">\n <div class="text fw-400">${properties.name ?? \'\'}</div>\n ${address}\n ${badge}\n </div>\n </div>\n `;\n\n return content;\n\n}\n\n// Espande/comprime un marker (classe .highlight su .wi-marker)\nfunction toggleHighlight(markerView) {\n\n if (!markerView || !markerView.content || !markerView.content.classList) { return; }\n\n if (markerView.content.classList.contains("highlight")) {\n markerView.content.classList.remove("highlight");\n markerView.zIndex = null;\n } else {\n markerView.content.classList.add("highlight");\n markerView.zIndex = 1;\n }\n\n}\n'},8636(e){e.exports="function position(element, showItem = false) {\n\n var rect = element.getBoundingClientRect();\n\n if (showItem) {\n\n var width = rect.right - rect.left;\n var height = rect.bottom - rect.top;\n\n var element = document.createElement(\"DIV\");\n element.style.position = \"fixed\";\n element.style.top = rect.top+'px';\n element.style.left = rect.left+'px';\n element.style.width = width+'px';\n element.style.height = height+'px';\n element.style.zIndex = 999999;\n element.style.background = 'rgba(255, 0, 0, .2)';\n document.body.appendChild(element);\n\n }\n\n return rect;\n\n}\n\nfunction fullPage(element) {\n element.width = window.innerWidth;\n element.height = window.innerHeight;\n}\n\nfunction copyText(text, icon = null) {\n\n if (icon != null) {\n document.querySelectorAll('.bi-clipboard-check').forEach(element => {\n element.classList.remove('bi-clipboard-check')\n element.classList.add('bi-clipboard');\n });\n }\n\n navigator.clipboard.writeText(text).then(() => {\n if (icon != null) {\n icon.classList.remove('bi-clipboard');\n icon.classList.add('bi-clipboard-check');\n }\n },() => {\n if (icon != null) {\n icon.classList.remove('bi-clipboard');\n icon.classList.add('bi-clipboard-x');\n }\n });\n\n}\n\n// Messaggio testuale di una risposta 4xx in JSON ({ response: '...' }); null altrimenti.\n// Gli errori 5xx restano generici per non mostrare dettagli interni.\nfunction ajaxResponseMessage(request) {\n\n if (!request || request.readyState != 4 || request.status < 400 || request.status > 499) {\n return null;\n }\n\n try {\n var message = JSON.parse(request.responseText).response;\n } catch {\n return null;\n }\n\n return typeof message === 'string' && message.trim() !== '' ? message.trim() : null;\n\n}\n\nfunction ajaxRequestError(request) {\n \n if (request.readyState == 4) {\n alertToast(802);\n } else if (request.readyState == 0) {\n alertToast(801);\n } else {\n alertToast(800);\n }\n\n}\n\nfunction code(codeLength = 10) {\n\n var result = '';\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n var charactersLength = characters.length;\n\n for ( var i = 0; i < codeLength; i++ ) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n\n return result;\n\n}\n\nfunction isMobile() {\n\n if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {\n return true;\n } else {\n return false;\n }\n \n}\n\nfunction delay(time) {\n\n return new Promise(resolve => setTimeout(resolve, time));\n\n}\n\n// Previene l'uscita dalla pagina\nfunction preventPageExit(event) {\n \n event.preventDefault();\n event.returnValue = true;\n\n}"},5827(e){e.exports='function setVideoJS() {\n\n document.querySelectorAll(".video-js").forEach(element => {\n videojs(element);\n });\n\n}'},4642(e){e.exports=function(e){function n(e){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",e)}try{"undefined"!=typeof execScript&&"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener?execScript(e):"undefined"!=typeof eval?eval.call(null,e):n("EvalError: No eval function available")}catch(e){n(e)}}},7077(e,n,t){t(4642)(t(1192))},9213(e,n,t){t(4642)(t(2578))},8124(e,n,t){t(4642)(t(5365))},8393(e,n,t){t(4642)(t(7060))},673(e,n,t){t(4642)(t(2758))},3038(e,n,t){t(4642)(t(373))},9111(e,n,t){t(4642)(t(8882))},2347(e,n,t){t(4642)(t(6944))},8004(e,n,t){t(4642)(t(8197))},9118(e,n,t){t(4642)(t(1367))},550(e,n,t){t(4642)(t(7059))},3211(e,n,t){t(4642)(t(2700))},3286(e,n,t){t(4642)(t(3883))},4581(e,n,t){t(4642)(t(6338))},9899(e,n,t){t(4642)(t(8636))},2492(e,n,t){t(4642)(t(5827))}};const n={};function t(r){const i=n[r];if(void 0!==i)return i.exports;const a=n[r]={exports:{}};return e[r](a,a.exports,t),a.exports}(()=>{"use strict";class e{constructor(e,n){this.baseUrl=e,this.token=n}async request(e,n={}){const t={Authorization:`Bearer ${this.token}`,"Accept-Language":a.lang,...n.headers};let r=n.body;r instanceof FormData||void 0===r||(t["Content-Type"]="application/json",r=JSON.stringify(r));const i=await fetch(`${this.baseUrl}${e}`,{...n,headers:t,body:r});let o;i.headers.get("content-type");try{o=await i.json()}catch{throw{success:!1,status:i.status,response:"Errore nel parsing della risposta"}}if(!o.success)throw o;return o}get(e){return this.request(e,{method:"GET"})}post(e,n){return this.request(e,{method:"POST",body:n})}put(e,n){return this.request(e,{method:"PUT",body:n})}delete(e){return this.request(e,{method:"DELETE"})}}const n=new WeakMap,r=new WeakSet;class i{static init(e=document){const n=e.ownerDocument||e;if(!r.has(n)){r.add(n),n.addEventListener("click",e=>{const n=e.target.closest?.("[data-wi-deferred-trigger]");if(!n||0!==e.button||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey)return;const t=n.closest("[data-wi-deferred]");t&&"error"!==t.dataset.wiDeferredState&&(e.preventDefault(),this.load(t,{focus:!0}).catch(()=>{}))}),n.addEventListener("keydown",e=>{" "===e.key&&e.target.matches('a[data-wi-deferred-trigger][role="button"]')&&(e.preventDefault(),e.target.click())});new MutationObserver(e=>{for(const n of e)for(const e of n.addedNodes)1===e.nodeType&&this.init(e)}).observe(n.documentElement,{childList:!0,subtree:!0})}const t=[...e.querySelectorAll("[data-wi-deferred]")];e.matches?.("[data-wi-deferred]")&&t.unshift(e);for(const e of t){if(r.has(e))continue;if(r.add(e),e.querySelectorAll("a[data-wi-deferred-trigger]").forEach(e=>e.setAttribute("role","button")),"visible"!==e.dataset.wiDeferred||"undefined"==typeof IntersectionObserver)continue;const n=new IntersectionObserver(t=>{t.some(e=>e.isIntersecting)&&(n.disconnect(),this.load(e).catch(()=>{}))});n.observe(e)}}static load(e,{focus:t=!1}={}){const r="string"==typeof e?document.querySelector(e):e;if(!r)return Promise.reject(new Error("Deferred content not found."));if(n.has(r))return n.get(r);const i=this.activate(r,t);return n.set(r,i),i}static async activate(e,n){const t=e.querySelector(":scope > template[data-wi-deferred-template]");if(!t)throw new Error("Deferred template not found.");const r=e.ownerDocument,i=r.createElement("div");i.className="wi-deferred-content",i.append(t.content.cloneNode(!0));const a=[...i.querySelectorAll("script")];a.forEach(e=>e.remove()),e.dataset.wiDeferredState="loading",e.setAttribute("aria-busy","true"),e.append(i);try{for(const e of a)await new Promise((n,t)=>{const a=r.createElement("script");for(const n of e.attributes)a.setAttribute(n.name,n.value);const o=e.src||"module"===e.type;o&&(a.async=!1,a.onload=n,a.onerror=()=>t(new Error("Deferred script failed to load."))),a.textContent=e.textContent,i.append(a),o||n()});if(e.querySelector(":scope > [data-wi-deferred-placeholder]")?.remove(),t.remove(),e.dataset.wiDeferredState="ready",n){const e=i.querySelector("iframe, button, a[href], [tabindex]")||i;e.hasAttribute("tabindex")||e.setAttribute("tabindex","-1"),e.focus({preventScroll:!0})}return e.dispatchEvent(new CustomEvent("wi:deferred:ready",{bubbles:!0})),i}catch(n){throw i.remove(),e.dataset.wiDeferredState="error",e.querySelectorAll("[data-wi-deferred-trigger]").forEach(e=>{e.removeAttribute("role"),"BUTTON"===e.tagName&&(e.disabled=!0)}),e.dispatchEvent(new CustomEvent("wi:deferred:error",{bubbles:!0,detail:{error:n}})),n}finally{e.removeAttribute("aria-busy")}}}class a{static translations={};static defaultTranslations={};static get lang(){return document.documentElement.lang||"it"}static async init(e,n={}){this.translations=e,this.defaultTranslations=n}static get(e,n=[]){let t=this.getNestedValue(this.translations,e);return null==t&&(t=this.getNestedValue(this.defaultTranslations,e)),null==t?(console.error("Chiave di traduzione mancante: '"+e+"'"),e):(Array.isArray(n)&&n.length>0&&n.forEach((e,n)=>{t=t.replace(new RegExp("\\{"+n+"\\}","g"),e)}),t)}static getNestedValue(e,n){const t=n.split(".");let r=e;for(const e of t){if("object"!=typeof r||null===r||!(e in r))return null;r=r[e]}return r}}class o{constructor(e,n={}){const{infoElement:t=null,exportElement:r=null,mapId:i=null,travelMode:a="DRIVING",onError:o=e=>alert(e)}=n;this.mapElement=e,this.infoElement=t,this.exportElement=r,this.mapId=i,this.travelMode=a,this.onError=o,this.map=null,this.directionsService=null,this.directionsRenderer=null,this.autocomplete=null,this.mapClickListener=null,this.editingEnabled=!1,this.routeEnabled=!1,this.advancedMarkers=[],this.inputElement=null,this.waypoints=[],this.markers=[],this.mapType="hybrid",this.labelsVisible=!1}getTravelMode(){return google.maps.TravelMode[this.travelMode]??google.maps.TravelMode.DRIVING}initBaseMap(e={}){const n={center:{lat:20,lng:0},zoom:2,mapTypeId:this.mapType,mapTypeControl:!1,zoomControl:!0,streetViewControl:!1,fullscreenControl:!1,...e};return this.mapId&&(n.mapId=this.mapId),this.map=new google.maps.Map(this.mapElement,n),this.updateMapStyle(),this.map}initMap(){this.initBaseMap()}enableEditing(){this.map||this.initBaseMap(),this.editingEnabled=!0,this.mapClickListener&&this.mapClickListener.remove(),this.mapClickListener=this.map.addListener("click",e=>this.addChangeableMarker(e.latLng))}disableEditing(){this.mapClickListener&&(this.mapClickListener.remove(),this.mapClickListener=null),this.editingEnabled=!1}enableRoute(e={}){const{suppressMarkers:n=!0,draggable:t=!1,preserveViewport:r=!1,recalc:i=!0}=e;this.map||this.initBaseMap(),this.directionsService||(this.directionsService=new google.maps.DirectionsService),this.directionsRenderer?(this.directionsRenderer.setMap(this.map),this.directionsRenderer.setOptions({suppressMarkers:n,draggable:t,preserveViewport:r})):this.directionsRenderer=new google.maps.DirectionsRenderer({map:this.map,suppressMarkers:n,draggable:t,preserveViewport:r}),this.routeEnabled=!0,i&&this.waypoints.length>=2&&this.calcRoute()}disableRoute(){this.routeEnabled=!1,this.directionsRenderer&&(this.directionsRenderer.set("directions",null),this.directionsRenderer.setMap(null))}enableAutocomplete(e){this.inputElement=e,this.autocomplete=new google.maps.places.Autocomplete(this.inputElement),this.autocomplete.bindTo("bounds",this.map),this.autocomplete.addListener("place_changed",()=>{const e=this.autocomplete.getPlace();e.geometry&&e.geometry.location?(this.inputElement.value="",this.map.panTo(e.geometry.location),this.map.setZoom(15),this.addChangeableMarker(e.geometry.location)):this.onError("Luogo non trovato")})}initReadOnlyMap(e){if(!Array.isArray(e)||e.length<2)return void console.warn("Percorso non valido o troppo corto.");this.initBaseMap({center:e[0],zoom:14,disableDefaultUI:!0,mapTypeId:this.mapType}),this.disableEditing(),this.enableRoute({preserveViewport:!0,recalc:!1});const n=e[0],t=e[e.length-1],r=e.slice(1,-1).map(e=>({location:e,stopover:!0}));this.directionsService.route({origin:n,destination:t,waypoints:r,travelMode:this.getTravelMode()},(e,r)=>{if("OK"===r){this.directionsRenderer.setDirections(e);const r=new google.maps.LatLngBounds;if(e.routes[0].overview_path.forEach(e=>r.extend(e)),this.map.fitBounds(r),google.maps.marker&&google.maps.marker.AdvancedMarkerElement&&google.maps.marker.PinElement){const e=new google.maps.marker.PinElement({glyphText:"A"});new google.maps.marker.AdvancedMarkerElement({position:n,map:this.map,content:e.element,title:"A"});const r=new google.maps.marker.PinElement({glyphText:"B"});new google.maps.marker.AdvancedMarkerElement({position:t,map:this.map,content:r.element,title:"B"})}else new google.maps.Marker({position:n,map:this.map,label:"A"}),new google.maps.Marker({position:t,map:this.map,label:"B"})}else this.onError("Errore nel calcolo del percorso: "+r)})}setMapType(e){this.mapType=e,this.updateMapStyle()}toggleLabels(){this.labelsVisible=!this.labelsVisible,this.updateMapStyle()}updateMapStyle(){this.map.setMapTypeId(this.mapType),this.mapId||(this.labelsVisible?this.map.setOptions({styles:null}):this.map.setOptions({styles:[{featureType:"all",elementType:"labels",stylers:[{visibility:"off"}]}]}))}fitBounds(e={}){if(!this.map)return;const{includeRoute:n=!0,includeMarkers:t=!0,includeAdvancedMarkers:r=!0,extraPoints:i=[],padding:a=40,minZoom:o=null,maxZoom:s=null}=e,l=new google.maps.LatLngBounds;let c=!1;const u=e=>{if(!e)return null;if("function"==typeof e.lat&&"function"==typeof e.lng)return e;if("function"==typeof e.getPosition)return e.getPosition();if(e.position){const n=e.position;if("function"==typeof n.lat&&"function"==typeof n.lng)return n;if("number"==typeof n.lat&&"number"==typeof n.lng)return new google.maps.LatLng(n.lat,n.lng)}return e.location?u(e.location):"number"==typeof e.lat&&"number"==typeof e.lng?new google.maps.LatLng(e.lat,e.lng):null},d=e=>{const n=u(e);n&&(l.extend(n),c=!0)};if(n&&this.directionsRenderer&&this.directionsRenderer.getDirections){const e=this.directionsRenderer.getDirections(),n=e?.routes?.[0];n?.overview_path?.length?n.overview_path.forEach(e=>d(e)):this.waypoints.length&&this.waypoints.forEach(e=>d(e.location))}else n&&this.waypoints.length&&this.waypoints.forEach(e=>d(e.location));if(t&&this.markers.forEach(e=>d(e)),r&&this.advancedMarkers.forEach(e=>d(e)),Array.isArray(i)&&i.forEach(e=>d(e)),c&&(this.map.fitBounds(l,a),null!==o||null!==s)){const e=this.map.addListener("idle",()=>{const n=this.map.getZoom();null!==o&&n<o&&this.map.setZoom(o),null!==s&&n>s&&this.map.setZoom(s),e.remove()})}}addAdvancedMarker(e,n,t,r,i){const a="function"==typeof i?i(r):null;if(google.maps.marker&&google.maps.marker.AdvancedMarkerElement){const r=new google.maps.marker.AdvancedMarkerElement({map:this.map,content:a,position:new google.maps.LatLng(e,n),title:t});return this.advancedMarkers.push(r),r}console.warn("AdvancedMarkerElement non disponibile, uso Marker standard.");const o=new google.maps.Marker({position:new google.maps.LatLng(e,n),map:this.map,title:t});return this.advancedMarkers.push(o),o}addMarker(e,n){return new google.maps.Marker({position:e,map:this.map,label:n})}addChangeableMarker(e){const n=(this.markers.length+1).toString(),t=this.addMarker(e,n);t.setDraggable(!0),t.addListener("dragend",()=>{this.updateWaypoints(),this.routeEnabled&&this.calcRoute()}),t.addListener("dblclick",()=>{t.setMap(null),this.markers=this.markers.filter(e=>e!==t),this.updateWaypoints(),this.routeEnabled&&this.calcRoute()}),this.markers.push(t),this.updateWaypoints(),this.routeEnabled&&this.markers.length>=2&&this.calcRoute()}updateWaypoints(){this.waypoints=this.markers.map(e=>({location:e.getPosition(),stopover:!0})),this.markers.forEach((e,n)=>e.setLabel((n+1).toString())),this.saveRoute()}calcRoute(){if(!this.routeEnabled||!this.directionsService||!this.directionsRenderer)return;if(this.waypoints.length<2)return;const e=this.waypoints[0].location,n=this.waypoints[this.waypoints.length-1].location,t=this.waypoints.slice(1,-1);this.directionsService.route({origin:e,destination:n,waypoints:t,travelMode:this.getTravelMode()},(e,n)=>{if("OK"===n){this.directionsRenderer.setDirections(e),this.showRouteInfo(e.routes[0].legs);const n=new google.maps.LatLngBounds;e.routes[0].overview_path.forEach(e=>n.extend(e)),this.map.fitBounds(n)}else this.onError("Errore nel calcolo del percorso: "+n)})}showRouteInfo(e){let n=0,t=0;e.forEach(e=>{n+=e.distance.value,t+=e.duration.value}),this.infoElement&&(this.infoElement.innerHTML=`<strong>Distanza:</strong> ${(n/1e3).toFixed(2)} km<br><strong>Tempo stimato:</strong> ${this.formatTime(t)}`)}formatTime(e){const n=Math.floor(e/60),t=Math.floor(n/60),r=n%60;return t>0?`${t}h ${r}min`:`${r}min`}resetMap(){this.markers.forEach(e=>e.setMap(null)),this.markers=[],this.waypoints=[],this.directionsRenderer&&this.directionsRenderer.set("directions",null),this.infoElement&&(this.infoElement.innerHTML="")}saveRoute(){const e=this.markers.map(e=>({lat:e.getPosition().lat(),lng:e.getPosition().lng()}));this.exportElement&&(this.exportElement.value=JSON.stringify(e,null,2))}loadRouteFromJSON(e){this.resetMap();JSON.parse(e).forEach(e=>this.addChangeableMarker(new google.maps.LatLng(e.lat,e.lng)))}}window.DeferredContent=i,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>i.init(),{once:!0}):i.init(),window.ApiClient=e,window.TranslationProvider=a,window.MapManager=o,window.MapNavigator=class{constructor(e){if(!(e&&e instanceof o))throw new Error("Devi passare una istanza valida di MapManager");this.mapManager=e,this.map=e.map,this.percorso=[],this.userMarker=null,this.watchId=null,this.previousPosition=null}init(e){this.stop(),this.percorso=e,this.mapManager.initReadOnlyMap(e),this.map=this.mapManager.map}start(){navigator.geolocation?this.watchId=navigator.geolocation.watchPosition(e=>this.updatePosition(e),e=>this.mapManager.onError("Errore nella geolocalizzazione: "+e.message),{enableHighAccuracy:!0,maximumAge:0,timeout:1e4}):this.mapManager.onError("Geolocalizzazione non supportata dal tuo browser.")}updatePosition(e){const n={lat:e.coords.latitude,lng:e.coords.longitude};let t=0;if(this.previousPosition&&(t=this.computeHeading(this.previousPosition,n)),this.userMarker){this.userMarker.setPosition(n);const e=this.userMarker.getIcon();e.rotation=t,this.userMarker.setIcon(e)}else this.map.setZoom(16),this.map.setCenter(n),this.userMarker=new google.maps.Marker({position:n,map:this.map,icon:{path:google.maps.SymbolPath.FORWARD_CLOSED_ARROW,scale:4,fillColor:"#007BFF",fillOpacity:1,strokeColor:"#fff",strokeWeight:1,rotation:t,anchor:new google.maps.Point(0,2)},title:"La tua posizione"});this.previousPosition=n}computeHeading(e,n){const t=e=>e*Math.PI/180,r=t(e.lat),i=t(e.lng),a=t(n.lat),o=t(n.lng)-i,s=Math.sin(o)*Math.cos(a),l=Math.cos(r)*Math.sin(a)-Math.sin(r)*Math.cos(a)*Math.cos(o),c=Math.atan2(s,l);return(180*c/Math.PI+360)%360}stop(){null!==this.watchId&&(navigator.geolocation.clearWatch(this.watchId),this.watchId=null),this.userMarker&&(this.userMarker.setMap(null),this.userMarker=null)}openInGoogleMaps(){if(!this.percorso||this.percorso.length<2)return void this.mapManager.onError("Percorso insufficiente per l'apertura in Google Maps.");const e=`${this.percorso[0].lat},${this.percorso[0].lng}`,n=`${this.percorso[this.percorso.length-1].lat},${this.percorso[this.percorso.length-1].lng}`,t=this.percorso.slice(1,-1).map(e=>`${e.lat},${e.lng}`).join("|"),r=new URL("https://www.google.com/maps/dir/");r.searchParams.set("api","1"),r.searchParams.set("origin",e),r.searchParams.set("destination",n),t&&r.searchParams.set("waypoints",t),r.searchParams.set("travelmode",{DRIVING:"driving",BICYCLING:"bicycling",WALKING:"walking",TRANSIT:"transit"}[this.mapManager.travelMode]??"driving"),window.open(r.toString(),"_blank")}},window.API_CLIENT=new e(pathSite+"/api",API_TOKEN),window.API_CLIENT_APP=window.API_CLIENT,window.__t=function(e,n=[]){return a.get(e,n)};t(8004),t(3286),t(550),t(9118),t(3211),t(4581),t(2347),t(9899),t(9111),t(2492),t(3038),t(8393),t(673),t(9213),t(8124),t(7077)})()})();
|
|
1
|
+
(()=>{var e={1192(e){e.exports="function check() {\n \n document.querySelectorAll(\"form .wi-submit\").forEach(button => {\n \n button.removeAttribute(\"disabled\");\n \n var inputList = button.form.elements;\n\n for (let i = 0; i < inputList.length; i++) {\n\n var input = inputList[i];\n\n if (input.closest && input.closest('[data-wi-conditional-hidden=\"true\"]')) { continue; }\n\n if (input.required) {\n if (input.type == 'checkbox' || input.type == 'radio') {\n if (input.checked == false) { button.setAttribute(\"disabled\", null); }\n } else {\n if (input.value == \"\") { button.setAttribute(\"disabled\", null); }\n }\n }\n\n if (!input.validity.valid) {\n button.setAttribute(\"disabled\", null);\n }\n\n }\n\n })\n\n}\n\nfunction togglePassword(el, id) {\n\n var input = document.getElementById(id);\n\n if (input.type == 'password') {\n input.type = 'text'\n el.classList.remove('bi-eye');\n el.classList.add('bi-eye-slash');\n }else{\n input.type = 'password'\n el.classList.remove('bi-eye-slash');\n el.classList.add('bi-eye');\n }\n\n}\n\nfunction checkNumber(event) {\n\n event.target.value = event.target.value.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');\n \n}\n\nfunction labelPositionTop(event) {\n\n event.target.parentElement.classList.add('compiled');\n\n}\n\nfunction labelPosition(event) {\n\n var container = event.target.parentElement;\n\n if (event.target.value == '' && event.target !== document.activeElement) {\n container.classList.remove('compiled');\n } else {\n container.classList.add('compiled');\n }\n\n}\n\nfunction customDateRange(element) {\n\n var inputFrom = element.querySelector('input.wi-daterange-from');\n var inputTo = element.querySelector('input.wi-daterange-to');\n\n if (inputFrom.value != '') {\n $('#'+inputTo.id).datepicker('option', 'minDate', inputFrom.value);\n }\n\n}\n\nfunction customDateTimeRange(element) {\n\n var inputFrom = element.querySelector('input.wi-datetimerange-from');\n var inputTo = element.querySelector('input.wi-datetimerange-to');\n\n if (inputFrom.value != '') {\n $('#'+inputTo.id).datetimepicker('option', 'minDate', inputFrom.value);\n }\n\n}\n\nfunction datePickerOptions(element, toggle) {\n\n var options = {\n showAnim: 'slideDown',\n yearRange: '1900:3000',\n showOn: 'focus',\n dateFormat: 'dd/mm/yy',\n changeYear: true,\n changeMonth: true,\n showMonthAfterYear: true,\n hideIfNoPrevNext: true,\n firstDay: 1,\n dayNames: [ 'Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato' ],\n dayNamesShort: [ 'Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab' ],\n dayNamesMin: [ 'Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa' ],\n monthNames: [ 'Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre' ],\n monthNamesShort: [ 'Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic' ],\n beforeShow: function () { toggle(true); },\n onClose: function () { toggle(false); },\n };\n\n if (element.dataset.wiMinDate) { options.minDate = element.dataset.wiMinDate; }\n if (element.dataset.wiMaxDate) { options.maxDate = element.dataset.wiMaxDate; }\n\n return options;\n\n}\n\nfunction setDatePickerError(input, message) {\n\n var container = input.parentElement;\n var alert = container.querySelector('.alert-error');\n\n input.setCustomValidity(message);\n container.classList.add('input-error');\n\n if (!alert) { return; }\n\n alert.replaceChildren();\n var icon = document.createElement('i');\n icon.className = 'bi bi-exclamation-triangle';\n alert.append(icon, document.createTextNode(' '+message));\n\n}\n\nfunction validateSelectDate(event) {\n\n var input = event.currentTarget;\n var date = input.value;\n\n if (date === '' || typeof moment !== 'function') { return; }\n\n var label = input.dataset.wiDateLabel || 'data';\n var parsed = moment(date, 'DD/MM/YYYY', true);\n\n if (!parsed.isValid()) {\n setDatePickerError(input, 'La '+label+' deve essere formato gg/mm/aaaa');\n return;\n }\n\n removeInputError(input);\n\n if (input.dataset.wiMinDate && parsed.isBefore(moment(input.dataset.wiMinDate, 'DD/MM/YYYY'), 'day')) {\n setDatePickerError(input, 'La '+label+' deve essere maggiore del '+input.dataset.wiMinDate);\n }\n\n if (input.dataset.wiMaxDate && parsed.isAfter(moment(input.dataset.wiMaxDate, 'DD/MM/YYYY'), 'day')) {\n setDatePickerError(input, 'La '+label+' deve essere minore del '+input.dataset.wiMaxDate);\n }\n\n}\n\nfunction setDatePicker(input) {\n\n if (input.dataset.wiDatePickerReady === 'true') { return; }\n\n var container = input.parentElement;\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n };\n\n $(input).datepicker(datePickerOptions(input, toggle));\n\n if (input.value !== '') {\n $(input).datepicker('setDate', input.value);\n }\n\n if (input.dataset.wiSelectDate === 'true') {\n input.addEventListener('change', validateSelectDate);\n }\n\n input.dataset.wiDatePickerReady = 'true';\n\n}\n\nfunction setDateRangePicker(container) {\n\n if (container.dataset.wiDateRangeReady === 'true') { return; }\n\n var inputFrom = container.querySelector('input.wi-daterange-from');\n var inputTo = container.querySelector('input.wi-daterange-to');\n\n if (!inputFrom || !inputTo) { return; }\n\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n customDateRange(container);\n };\n var options = datePickerOptions(inputFrom, toggle);\n\n [inputFrom, inputTo].forEach(function (input) {\n $(input).datepicker(options);\n if (input.value !== '') { $(input).datepicker('setDate', input.value); }\n });\n\n container.dataset.wiDateRangeReady = 'true';\n\n}\n\nfunction setDateTimeRangePicker(container) {\n\n if (container.dataset.wiDateTimeRangeReady === 'true') { return; }\n\n var inputFrom = container.querySelector('input.wi-datetimerange-from');\n var inputTo = container.querySelector('input.wi-datetimerange-to');\n\n if (!inputFrom || !inputTo) { return; }\n\n var toggle = function (visible) {\n container.classList[visible ? 'add' : 'remove']('selector-show');\n customDateTimeRange(container);\n };\n var options = datePickerOptions(inputFrom, toggle);\n options.controlType = 'select';\n options.oneLine = true;\n options.timeFormat = 'HH:mm';\n options.stepMinute = 5;\n\n [inputFrom, inputTo].forEach(function (input) {\n $(input).datetimepicker(options);\n });\n\n container.dataset.wiDateTimeRangeReady = 'true';\n\n}\n\nfunction setDateInputs(container = document) {\n\n container.querySelectorAll(\"[data-wi-date-picker='true']\").forEach(setDatePicker);\n container.querySelectorAll(\"[data-wi-date-range='true']\").forEach(setDateRangePicker);\n container.querySelectorAll(\"[data-wi-date-time-range='true']\").forEach(setDateTimeRangePicker);\n\n}\n\nfunction checkLabel() {\n\n document.querySelectorAll(\"[data-wi-label='true']\").forEach(element => {\n \n var container = element.parentElement;\n\n if (element.value == '') {\n container.classList.remove('compiled');\n } else {\n container.classList.add('compiled');\n }\n \n });\n\n}\n\nfunction checkInputFile(event) {\n\n var input = event.target;\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n\n var maxFile = input.dataset.wiMaxFile;\n var maxSize = input.dataset.wiMaxSize;\n var prettyMaxSize = ((maxSize/1024)/1024).toFixed(2); // MB\n\n var prettyErrorFile = \"<i class='bi bi-exclamation-triangle'></i> Hai caricato troppi file! Puoi caricare massimo \"+maxFile+\" file\";\n var prettyErrorSize = \"<i class='bi bi-exclamation-triangle'></i> Hai caricato file troppo grandi! Le dimensioni massime sono di \"+prettyMaxSize+\"Mb\";\n\n var files = input.files;\n\n inputContainer.classList.remove('input-error');\n errorContainer.innerHTML = '';\n\n for (var x in files) {\n\n if(files[x].size > maxSize){\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = prettyErrorSize;\n input.value = \"\";\n break;\n\n }\n\n }\n\n if (files.length > maxFile) {\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = prettyErrorFile;\n input.value = \"\";\n\n }\n \n}\n\nfunction inputError(input, error, errorIcon = \"<i class='bi bi-exclamation-triangle'></i>\") {\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n\n inputContainer.classList.add('input-error');\n errorContainer.innerHTML = errorIcon+' '+error;\n input.setCustomValidity(error);\n\n}\n\nfunction removeInputError(input) {\n\n var inputContainer = input.parentElement;\n var errorContainer = inputContainer.querySelector('.alert-error');\n \n inputContainer.classList.remove('input-error');\n errorContainer.innerHTML = \"\";\n input.setCustomValidity(\"\");\n\n}\n\nfunction setInput() {\n\n setDateInputs();\n\n document.querySelectorAll(\"[data-wi-max-file]\").forEach(element => {\n element.addEventListener(\"change\", checkInputFile);\n });\n\n document.querySelectorAll(\"[data-wi-max-size]\").forEach(element => {\n element.addEventListener(\"change\", checkInputFile);\n });\n \n document.querySelectorAll(\"[data-wi-label='true']\").forEach(element => {\n element.addEventListener(\"input\", labelPosition);\n element.addEventListener(\"change\", labelPosition);\n element.addEventListener(\"focusin\", labelPositionTop);\n element.addEventListener(\"focusout\", labelPosition);\n });\n\n document.querySelectorAll(\"[data-wi-check='true']\").forEach(element => {\n element.addEventListener(\"keyup\", check);\n element.addEventListener(\"change\", check);\n element.addEventListener(\"focusin\", check);\n element.addEventListener(\"focusout\", check);\n });\n\n document.querySelectorAll(\"[data-wi-list-input='true']\").forEach(element => {\n element.addEventListener(\"keyup\", searchInput);\n element.addEventListener(\"focusin\", searchInput);\n element.addEventListener(\"focusin\", (event) => { delay(300).then(() => { showList(event) }) });\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"focusout\", hideList);\n element.addEventListener(\"change\", controlList);\n element.addEventListener(\"focusout\", controlList);\n });\n\n document.querySelectorAll(\"[data-wi-search-input='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchResults);\n element.addEventListener(\"change\", controlList);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-search-text='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchText);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-search-radio='true']\").forEach(element => {\n element.addEventListener(\"keyup\", showList);\n element.addEventListener(\"keyup\", searchRadio);\n element.addEventListener(\"focusout\", hideList);\n });\n\n document.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n document.querySelectorAll(\"[data-wi-phone='true']\").forEach(element => {\n checkPhone(element);\n });\n\n setConditional();\n check();\n setAutonumeric();\n setGoogleMapsApi();\n setInputCountry();\n setRecaptcha();\n\n}\n"},2578(e){e.exports="function searchInput(event) {\n \n var inputId = event.target.id;\n var inputValue = event.target.value.toLowerCase();\n \n document.querySelectorAll('#list_'+inputId+' input').forEach(x => {\n \n var keyword = x.dataset.wiKeyword.toLowerCase();\n\n if (keyword.includes(inputValue)) {\n x.parentElement.style.display = 'block';\n } else {\n x.parentElement.style.display = 'none';\n }\n \n });\n \n}\n\n// const event_CheckInput = new Event(\"wi-check-input\");\n\nfunction checkInput(event) {\n \n var container = event.target;\n\n if (container.localName == 'div') {\n var checkbox = container.querySelector('input');\n } else {\n var checkbox = container;\n }\n\n var inputId = checkbox.dataset.wiInput;\n\n checkbox.checked = true;\n\n var input = document.querySelector('#'+inputId);\n input.value = checkbox.dataset.wiName;\n // input.dispatchEvent(event_CheckInput);\n\n check();\n\n}\n\nfunction controlList(event) {\n\n var element = event.target;\n var container = event.target.parentElement;\n \n var l = element.dataset.wiListArray.split('|');\n var v = element.value.toLowerCase();\n\n if (v != '') {\n if (l.includes(v)) {\n\n removeInputError(element);\n\n container.querySelectorAll('input[type=radio]').forEach(e => {\n\n var name = e.dataset.wiName;\n\n if (name.toLowerCase() == v) {\n e.checked = true;\n } else {\n e.checked = false;\n }\n\n });\n \n } else {\n \n inputError(element, 'Campo non corretto')\n container.querySelectorAll('input[type=radio]:checked').forEach(e => { e.checked = false; });\n \n }\n }\n\n check();\n\n}\n\n\nfunction showList(event) { event.target.parentElement.classList.add('wi-list-active'); }\n\nfunction hideList(event) { event.target.parentElement.classList.remove('wi-list-active'); }\n\nfunction searchText(event) { searchResults(event, \"text\"); }\n\nfunction searchRadio(event) { searchResults(event, \"radio\"); }\n\nfunction searchResults(event, result) {\n\n var input = event.target;\n\n var container = input.parentElement;\n\n var list = container.querySelector('.wi-input-list');\n var listValue = list.querySelector('.wi-input-list-body');\n var listFooter = list.querySelector('.wi-input-list-footer');\n\n var inputId = input.id;\n var inputName = input.dataset.wiName;\n var inputValue = input.value.toLowerCase();\n\n var inputUrl = input.dataset.wiSearchUrl;\n\n if (result == 'radio') {\n var radioName = \"name='\"+inputName+\"'\";\n } else {\n var radioName = \"\";\n }\n\n $.ajax({\n type: \"POST\",\n url: inputUrl,\n data: { \n post: 'true',\n search: inputValue\n }, \n success: function (data) {\n\n const response = JSON.parse(data);\n const nResponse = response.length;\n \n var listHTML = \"\";\n\n for (let index = 0; index < nResponse; index++) {\n\n const value = response[index]['value'];\n const label = response[index]['label'];\n const inputValue = response[index]['input-value'];\n\n listHTML += \"<div class='wi-input-list-value' data-wi-list-value='true'><input data-wi-input='\"+inputId+\"' type='radio' \"+radioName+\" data-wi-name='\"+inputValue+\"' value='\"+value+\"'>\"+label+\"</div>\";\n\n }\n\n if (inputValue == '') {\n listFooter.innerHTML = \"Cosa stai cercando?\";\n } else if (nResponse == 1) {\n listFooter.innerHTML = nResponse+\" risultato\";\n } else if (nResponse != 1) {\n listFooter.innerHTML = nResponse+\" risultati\";\n }\n\n listValue.innerHTML = listHTML;\n\n document.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.querySelector('input').setAttribute('aria-label', element.textContent.trim());\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n },\n error: function (XMLHttpRequest) {\n ajaxRequestError(XMLHttpRequest);\n loadingSpinner();\n }\n });\n\n}\n\nfunction textListValue (input, value) {\n\n var form = input.form;\n var inputName = input.dataset.wiName.replace('-text', '');\n \n if (value == '') {\n\n input.value = '';\n\n if (inputChecked = form.querySelector('input[name=\"'+inputName+'\"]:checked')) {\n inputChecked.checked = false;\n }\n\n } else {\n\n if (form.querySelector('input[name=\"'+inputName+'\"][value=\"'+value+'\"]')) {\n form.querySelector('input[name=\"'+inputName+'\"][value=\"'+value+'\"]').click();\n checkLabel(); \n }\n\n }\n\n checkLabel();\n\n}\n\nfunction textListOptions(input, options) {\n \n var listHTML = \"\";\n var listArray = [];\n\n var form = input.form;\n var inputId = input.id;\n var inputAttribute = input.dataset.wiInputAttribute;\n var inputLabel = input.labels[0];\n var inputName = input.dataset.wiName.replace('-text', '');;\n\n var listContainer = form.querySelector('#list_'+inputId);\n\n input.dataset.wiListArray = \"\";\n listContainer.innerHTML = \"\";\n\n for (var optionValue in options) {\n\n var optionId = \"value_\"+code();\n var optionLabel = options[optionValue];\n\n listArray.push(optionLabel);\n \n listHTML += \"<div class='wi-input-list-value' data-wi-list-value='true'><input id='\"+optionId+\"' data-wi-keyword='\"+optionValue+\" \"+optionLabel+\"' data-wi-input='\"+inputId+\"' data-wi-name='\"+optionLabel+\"' type='radio' name='\"+inputName+\"' value='\"+optionValue+\"'>\"+optionLabel+\"</div>\";\n\n }\n\n if (listHTML == \"\") {\n\n input.required = false;\n input.disabled = true;\n inputLabel.innerHTML = inputLabel.innerHTML.replace('*', '');\n\n } else {\n\n if (inputAttribute.indexOf('required') != '-1') { \n\n input.required = true;\n\n if (inputLabel.innerHTML.indexOf('*') == '-1') { \n inputLabel.innerHTML = inputLabel.innerHTML+'*' \n }\n\n }\n\n input.dataset.wiListArray = listArray.join('|').toLowerCase();\n listContainer.innerHTML = listHTML;\n\n }\n\n listContainer.querySelectorAll(\"[data-wi-list-value='true']\").forEach(element => {\n element.querySelector('input').setAttribute('aria-label', element.textContent.trim());\n element.addEventListener(\"click\", checkInput);\n element.addEventListener(\"mousedown\", checkInput);\n });\n\n checkLabel();\n\n}\n"},5365(e){e.exports="var recaptchaPending = new Set();\nvar recaptchaWidgets = new WeakMap();\nvar recaptchaObserved = new WeakSet();\nvar recaptchaScript = null;\nvar recaptchaObserver = null;\n\nfunction setRecaptchaInput() {\n if (!window.grecaptcha || !grecaptcha.enterprise || !grecaptcha.enterprise.render) { return; }\n recaptchaPending.forEach(function (element) {\n if (!element.isConnected || recaptchaWidgets.has(element)) {\n recaptchaPending.delete(element);\n return;\n }\n var form = element.closest('form');\n if (!form) { return; }\n var action = element.dataset.wiAction || form.id || 'undefined';\n function updateToken(token) {\n form.querySelector('input[name=\"g-recaptcha-token\"]').value = token;\n form.querySelector('input[name=\"g-recaptcha-action\"]').value = token ? action : '';\n check();\n }\n var widget = grecaptcha.enterprise.render(element, {\n sitekey: element.dataset.wiSiteKey,\n action: action,\n theme: element.dataset.wiTheme,\n size: element.dataset.wiSize,\n callback: updateToken,\n 'expired-callback': function () { updateToken(''); },\n 'error-callback': function () { updateToken(''); }\n });\n recaptchaWidgets.set(element, widget);\n recaptchaPending.delete(element);\n });\n}\n\nfunction requestRecaptcha(element) {\n if (recaptchaWidgets.has(element)) { return; }\n recaptchaPending.add(element);\n if (window.grecaptcha && grecaptcha.enterprise && grecaptcha.enterprise.render) {\n setRecaptchaInput();\n return;\n }\n if (recaptchaScript) { return; }\n recaptchaScript = document.querySelector('script[src*=\"/recaptcha/enterprise.js\"]');\n if (recaptchaScript) {\n recaptchaScript.addEventListener('load', setRecaptchaInput, { once: true });\n return;\n }\n recaptchaScript = document.createElement('script');\n recaptchaScript.async = true;\n recaptchaScript.src = 'https://www.google.com/recaptcha/enterprise.js?onload=setRecaptchaInput&render=explicit';\n recaptchaScript.onerror = function () {\n recaptchaScript.remove();\n recaptchaScript = null;\n };\n document.head.appendChild(recaptchaScript);\n}\n\nfunction setRecaptcha() {\n if (!recaptchaObserver && 'IntersectionObserver' in window) {\n recaptchaObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) { requestRecaptcha(entry.target); }\n });\n }, { rootMargin: '300px' });\n }\n document.querySelectorAll('form .g-recaptcha').forEach(function (element) {\n if (recaptchaObserved.has(element)) { return; }\n recaptchaObserved.add(element);\n var form = element.closest('form');\n form.addEventListener('focusin', function () { requestRecaptcha(element); });\n form.addEventListener('pointerdown', function () { requestRecaptcha(element); }, { passive: true });\n if (recaptchaObserver) { recaptchaObserver.observe(element); }\n else { requestRecaptcha(element); }\n });\n}\n"},7060(e){e.exports="function scrolla(selector){\n \n if (document.querySelector(selector)) {\n\n var element = document.querySelector(selector);\n\n var headerHeight = '80';\n\n if (document.querySelector('header')) {\n headerHeight = document.querySelector('header').offsetHeight;\n }\n\n element.style.scrollMargin = headerHeight+'px';\n element.scrollIntoView({ behavior: 'smooth' });\n\n } else {\n\n console.error(\"Selettore ( \"+selector+\" ) non valido\");\n\n }\n\n}\n\nvar keys = {37: 1, 38: 1, 39: 1, 40: 1};\n\nfunction preventDefault(e) {\n e.preventDefault();\n}\n\nfunction preventDefaultForScrollKeys(e) {\n if (keys[e.keyCode]) {\n preventDefault(e);\n return false;\n }\n}\n\n// modern Chrome requires { passive: false } when adding event\nvar supportsPassive = false;\ntry {\n window.addEventListener(\"test\", null, Object.defineProperty({}, 'passive', {\n get: function () { supportsPassive = true; } \n}));\n} catch(e) {}\n\nvar wheelOpt = supportsPassive ? { passive: false } : false;\nvar wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';\n\n// call this to Disable\nfunction disableAllScroll() {\n window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF\n window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop\n window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile\n window.addEventListener('keydown', preventDefaultForScrollKeys, false);\n}\n\n// call this to Enable\nfunction enableAllScroll() {\n window.removeEventListener('DOMMouseScroll', preventDefault, false);\n window.removeEventListener(wheelEvent, preventDefault, wheelOpt); \n window.removeEventListener('touchmove', preventDefault, wheelOpt);\n window.removeEventListener('keydown', preventDefaultForScrollKeys, false);\n}\n\nfunction disableScroll() {\n document.querySelector('body').classList.add('block-scroll');\n}\n\nfunction enableScroll() {\n document.querySelector('body').classList.remove('block-scroll');\n}"},2758(e){e.exports="function configTooltip(triggerEL, tooltipEL, config) {\n\n var middleware = [\n FloatingUIDOM.offset(4),\n FloatingUIDOM.flip(), \n FloatingUIDOM.shift({ padding: 4 })\n ];\n\n if (config.arrow) { middleware.push( FloatingUIDOM.arrow({ element: tooltipEL.querySelector('.arrow') }) ); }\n\n FloatingUIDOM.computePosition(triggerEL, tooltipEL, {\n placement: config.placement,\n middleware: middleware\n }).then(({x, y, placement, middlewareData}) => {\n\n Object.assign(tooltipEL.style, { left: `${x}px`, top: `${y}px` });\n\n if (config.arrow) {\n\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[placement.split('-')[0]];\n \n Object.assign(tooltipEL.querySelector('.arrow').style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n });\n \n }\n\n });\n\n}\n\nfunction createTooltip(event) {\n\n var tooltipId = 'tooltip-'+code();\n var element = event.target;\n var elData = element.dataset;\n\n var options = [];\n options.title = elData.wiTitle ?? 'ND';\n options.placement = elData.wiPlacement ?? 'top';\n options.arrow = elData.wiArrow == 'true' ? true : false;\n options.class = elData.wiClass ?? '';\n\n element.setAttribute(\"aria-describedby\", tooltipId);\n\n var tooltipContent = options.title;\n\n if (options.arrow) { tooltipContent += '<div class=\"arrow\"></div>'; }\n\n var tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.innerHTML = tooltipContent;\n \n tooltip.setAttribute(\"role\", 'tooltip');\n tooltip.setAttribute(\"class\", 'tooltip '+options.class);\n\n tooltip.style.display = 'block';\n\n document.body.appendChild(tooltip);\n\n configTooltip(element, tooltip, options);\n\n}\n\nfunction removeTooltip() { document.querySelectorAll('.tooltip').forEach(tooltip => { tooltip.remove(); }); }\n\nfunction setTooltip() {\n\n document.querySelectorAll('[data-wi-toggle=\"tooltip\"]').forEach(el => {\n \n [\n ['mouseenter', createTooltip],\n ['mouseleave', removeTooltip],\n ['focus', createTooltip],\n ['blur', removeTooltip],\n ].forEach(([event, listener]) => { el.addEventListener(event, listener); });\n \n });\n\n}"},373(e){e.exports="function loadingSpinner(action = 'toggle') {\n\n const spinner = document.getElementById('loading-spinner');\n let shouldShow;\n\n if (action === 'toggle') {\n shouldShow = spinner.classList.contains('d-none');\n } else {\n shouldShow = action;\n }\n\n if (shouldShow) {\n if (spinner.classList.contains('d-none')) {\n spinner.classList.remove('d-none', 'no-interaction');\n disableScroll();\n }\n } else {\n if (!spinner.classList.contains('d-none')) {\n spinner.classList.add('d-none', 'no-interaction');\n enableScroll();\n }\n }\n\n}"},8882(e){e.exports='function canvasFullPage(elementId, draw = false) {\n\n var element = document.createElement("CANVAS");\n element.id = elementId;\n element.style.position = "fixed";\n element.style.top = 0;\n element.style.left = 0;\n element.style.zIndex = 999999;\n element.style.background = \'#ffffff\';\n element.style.touchAction = \'none\';\n element.style.msTouchAction = \'none\';\n\n fullPage(element);\n\n window.addEventListener(\'resize\', () => { fullPage(element) });\n\n if (draw) { canvasDraw(element); }\n\n}\n\nfunction canvasReset(element) {\n \n var ctx = element.getContext("2d");\n ctx.clearRect(0, 0, element.width, element.height);\n ctx.restore();\n\n}\n\nfunction canvasDraw(element) {\n\n var ctx = element.getContext("2d");\n \n let offset = position(element);\n let painting = false;\n\n function drawStart() {\n offset = position(element);\n painting = true;\n draw(e);\n }\n\n function drawEnd() {\n painting = false;\n ctx.beginPath();\n }\n\n function draw(e) {\n\n if (!painting) return;\n ctx.lineWidth = 1;\n ctx.lineCap = "round";\n ctx.strokeStyle = "black";\n\n if (e.type == \'touchmove\'){\n var x = e.touches[0].clientX;\n var y = e.touches[0].clientY;\n } else if (e.type == \'mousemove\'){\n var x = e.clientX;\n var y = e.clientY;\n }\n\n var offsetX = offset.left;\n var offsetY = offset.top;\n\n var x = x - offsetX;\n var y = y - offsetY;\n\n ctx.lineTo(x, y);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x, y);\n\n }\n\n element.addEventListener("mousedown", drawStart);\n element.addEventListener("touchstart", drawStart);\n element.addEventListener("mouseup", drawEnd);\n element.addEventListener("touchend", drawEnd);\n element.addEventListener("mousemove", draw);\n element.addEventListener("touchmove", draw);\n\n}'},3740(e){e.exports="// wi.confirm() and the delegated data-wi-confirm listener (a, button, form).\n// The theme's modal.js sets wi.confirm.adapter; without one, window.confirm is used.\n(function () {\n\n var wi = window.wi = window.wi || {};\n if (typeof wi.confirm === 'function' && typeof wi.confirm.setRenderer === 'function') return;\n\n var KEYS = {\n title: 'components.confirm.title',\n text: 'components.confirm.text',\n ok: 'components.buttons.confirm',\n cancel: 'components.buttons.cancel'\n };\n\n // Used only while the site's translations do not define KEYS.\n var FALLBACK = {\n it: { title: 'Conferma', text: 'Vuoi procedere?', ok: 'Conferma', cancel: 'Annulla' },\n en: { title: 'Confirm', text: 'Do you want to continue?', ok: 'Confirm', cancel: 'Cancel' },\n es: { title: 'Confirmar', text: '¿Quieres continuar?', ok: 'Confirmar', cancel: 'Cancelar' },\n fr: { title: 'Confirmer', text: 'Voulez-vous continuer ?', ok: 'Confirmer', cancel: 'Annuler' }\n };\n\n var renderer = null;\n var pending = new WeakSet();\n var passing = null;\n\n function translate(name) {\n var provider = window.TranslationProvider, value = null;\n if (provider && typeof provider.getNestedValue === 'function') {\n value = provider.getNestedValue(provider.translations || {}, KEYS[name]);\n if (value == null) value = provider.getNestedValue(provider.defaultTranslations || {}, KEYS[name]);\n }\n if (typeof value === 'string' && value !== '') return value;\n var lang = (document.documentElement.lang || 'it').slice(0, 2).toLowerCase();\n return (FALLBACK[lang] || FALLBACK.en)[name];\n }\n\n function text(value) {\n return value == null ? '' : String(value).trim();\n }\n\n function variant(value) {\n value = text(value);\n return /^[a-z][a-z0-9-]*$/i.test(value) ? value : '';\n }\n\n function normalize(options) {\n if (typeof options === 'string') options = { text: options };\n options = options || {};\n return {\n text: text(options.text) || translate('text'),\n title: text(options.title) || translate('title'),\n ok: text(options.ok) || translate('ok'),\n cancel: text(options.cancel) || translate('cancel'),\n variant: variant(options.variant) || 'primary',\n cancelVariant: variant(options.cancelVariant),\n className: text(options.className),\n trigger: options.trigger instanceof Element ? options.trigger : null\n };\n }\n\n function nativeConfirm(options) {\n return window.confirm(options.text);\n }\n\n /**\n * Asks the user to confirm an action.\n *\n * @param {string|{text?: string, title?: string, ok?: string, cancel?: string, variant?: string, cancelVariant?: string, className?: string, trigger?: Element}} options\n * @returns {Promise<boolean>} true only when the user confirms.\n */\n function confirmAction(options) {\n var data = normalize(options);\n var render = renderer || confirmAction.adapter || nativeConfirm;\n return new Promise(function (resolve) { resolve(render(data)); }).then(Boolean, function (error) {\n console.error(error);\n return false;\n });\n }\n\n /**\n * Replaces the dialog. fn(options) receives the normalized options and returns\n * a boolean or a Promise<boolean>; pass null to restore the theme's dialog.\n */\n confirmAction.setRenderer = function (fn) {\n renderer = typeof fn === 'function' ? fn : null;\n };\n\n confirmAction.adapter = null;\n\n wi.confirm = confirmAction;\n\n function attr(element, name) {\n var value = element.getAttribute(name ? 'data-wi-confirm-' + name : 'data-wi-confirm');\n return value == null ? undefined : value;\n }\n\n function optionsFrom(element, form, submitter) {\n var method = (submitter && submitter.getAttribute('formmethod')) || (form && form.getAttribute('method')) || '';\n method = method.toLowerCase();\n return {\n text: attr(element),\n title: attr(element, 'title'),\n ok: attr(element, 'ok'),\n cancel: attr(element, 'cancel'),\n variant: attr(element, 'variant') || (method === 'post' || method === 'delete' ? 'danger' : undefined),\n className: attr(element, 'class'),\n trigger: submitter || element\n };\n }\n\n function ask(element, options, proceed) {\n if (pending.has(element)) return;\n pending.add(element);\n confirmAction(options).then(function (confirmed) {\n pending.delete(element);\n if (!confirmed || !element.isConnected) return;\n passing = element;\n try { proceed(); } finally { passing = null; }\n });\n }\n\n // Capture phase: the confirmation precedes inline onclick/onsubmit handlers and navigation.\n document.addEventListener('click', function (event) {\n if (!(event.target instanceof Element)) return;\n var element = event.target.closest('a[data-wi-confirm], button[data-wi-confirm]');\n if (!element || element === passing) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n var form = element.tagName === 'BUTTON' && element.type === 'submit' ? element.form : null;\n ask(element, optionsFrom(element, form, form ? element : null), function () { element.click(); });\n }, true);\n\n document.addEventListener('submit', function (event) {\n var form = event.target;\n if (!(form instanceof HTMLFormElement) || !form.hasAttribute('data-wi-confirm')) return;\n var submitter = event.submitter || null;\n // Already confirmed by its own data-wi-confirm.\n if (form === passing || (submitter && submitter === passing)) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n ask(form, optionsFrom(form, form, submitter), function () {\n if (typeof form.requestSubmit !== 'function') form.submit();\n else if (submitter && submitter.isConnected && submitter.form === form) form.requestSubmit(submitter);\n else form.requestSubmit();\n });\n }, true);\n\n})();\n"},6944(e){e.exports='async function postData(url, data) {\n\n loadingSpinner();\n\n if (data === undefined) {\n\n console.error("Non è stato passato alcun dato alla funzione postData()");\n alertToast(800);\n\n } else {\n \n var form = (data instanceof FormData === false) ? createPostData(data) : data;\n\n return await fetch(url, {\n method: "POST",\n body: form\n })\n .then((response) => { \n\n if (response.ok) {\n\n return response.json().catch((error) => { \n\n console.error("Il file non risponde in JSON!");\n throw new Error(802);\n\n });\n\n } else {\n\n console.error("Impossibile connettersi o trovare il file!");\n throw new Error(802);\n\n }\n \n })\n .then((value) => { \n \n if (value.status == 200) {\n\n loadingSpinner(); \n return value;\n\n } else if (value.status == 401) {\n\n throw new Error(911);\n\n } else if (value.status) {\n\n throw new Error(value.status);\n \n } else {\n\n console.error("La risposta deve avere il seguente formato: ", {\n success: true,\n status:\t200,\n response: {}\n });\n\n throw new Error(803);\n\n }\n\n })\n .catch((error) => { \n \n loadingSpinner(); \n alertToast(error.message); \n\n })\n\n }\n\n}\n\nfunction createPostData(array = {}) {\n\n var data = new FormData();\n\n Object.keys(array).forEach(key => {\n data.append(key, array[key]);\n });\n\n return data;\n\n}\n\n// Vecchie funzioni\nfunction fetchResponse(response) {\n \n if (response.ok) {\n\n return response.json();\n\n } else {\n\n alertToast(802);\n console.error("Impossibile connettersi o trovare il file!");\n return false;\n\n }\n\n}\n\nfunction fetchValue(value) {\n \n if (value == false) {\n \n return false;\n \n } else {\n\n if (value.status == 200) {\n return value;\n } else if (value.status == 401) {\n alertToast(911);\n return false;\n } else if (value.status == undefined) {\n alertToast(803);\n return false;\n } else {\n alertToast(value.status);\n return false;\n }\n\n }\n\n}\n\nfunction fetchError(error) {\n \n alertToast(802);\n console.error("Il file non risponde in JSON!");\n\n}'},8197(e){e.exports="var AUTONUMERIC_NUMBER = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nvar AUTONUMERIC_PRICE = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbol: '€',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nvar AUTONUMERIC_PERCENTIGE = {\n caretPositionOnFocus: 'end',\n decimalPlacesShownOnFocus: 2,\n digitGroupSeparator: '',\n decimalCharacter: '.',\n onInvalidPaste: 'truncate',\n currencySymbol: '%',\n currencySymbolPlacement: 's',\n outputFormat: 'number',\n unformatOnSubmit: true,\n modifyValueOnWheel: false\n};\n\nfunction customAutonumeric(element, autonumeric) {\n\n var option = {};\n\n if (autonumeric.caretPositionOnFocus != undefined) { \n option.caretPositionOnFocus = autonumeric.caretPositionOnFocus; \n }\n\n if (element.dataset.wiNumberDecimal != undefined) { \n option.decimalPlacesShownOnFocus = element.dataset.wiNumberDecimal;\n option.decimalPlaces = element.dataset.wiNumberDecimal;\n } else {\n if (autonumeric.decimalPlacesShownOnFocus != undefined) {\n option.decimalPlacesShownOnFocus = autonumeric.decimalPlacesShownOnFocus;\n }\n }\n\n if (element.dataset.wiNumberDecimalSeparator != undefined) { \n option.decimalCharacter = element.dataset.wiNumberDecimalSeparator;\n } else {\n if (autonumeric.decimalCharacter != undefined) {\n option.decimalCharacter = autonumeric.decimalCharacter;\n }\n }\n\n if (element.dataset.wiNumberGroupSeparator != undefined) { \n option.digitGroupSeparator = element.dataset.wiNumberGroupSeparator;\n } else {\n if (autonumeric.digitGroupSeparator != undefined) {\n option.digitGroupSeparator = autonumeric.digitGroupSeparator;\n }\n }\n\n // AutoNumeric non parte se decimali e migliaia hanno lo stesso segno:\n // vince il decimale chiesto dal campo e le migliaia restano senza separatore.\n if (option.decimalCharacter != undefined && option.decimalCharacter === option.digitGroupSeparator) {\n option.digitGroupSeparator = '';\n }\n\n // Con la virgola decimale anche il punto (quello del tastierino) scrive i decimali.\n if (option.decimalCharacter != undefined && option.decimalCharacter !== '.') {\n option.decimalCharacterAlternative = '.';\n }\n\n if (autonumeric.onInvalidPaste != undefined) { \n option.onInvalidPaste = autonumeric.onInvalidPaste; \n }\n\n if (element.dataset.wiNumberSymbol != undefined) { \n option.currencySymbol = element.dataset.wiNumberSymbol;\n } else {\n if (autonumeric.currencySymbol != undefined) {\n option.currencySymbol = autonumeric.currencySymbol;\n }\n }\n\n if (element.dataset.wiNumberSymbolPlacement != undefined) { \n option.currencySymbolPlacement = element.dataset.wiNumberSymbolPlacement;\n } else {\n if (autonumeric.currencySymbolPlacement != undefined) {\n option.currencySymbolPlacement = autonumeric.currencySymbolPlacement;\n }\n }\n\n if (autonumeric.outputFormat != undefined) { \n option.outputFormat = autonumeric.outputFormat; \n }\n\n if (autonumeric.unformatOnSubmit != undefined) { \n option.unformatOnSubmit = autonumeric.unformatOnSubmit; \n }\n\n if (autonumeric.modifyValueOnWheel != undefined) { \n option.modifyValueOnWheel = autonumeric.modifyValueOnWheel; \n }\n\n return option;\n \n}\n\nfunction setAutonumeric(container = document) {\n \n container.querySelectorAll(\"[data-wi-number='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n \n if (el === null) {\n\n new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_NUMBER)); \n \n }\n\n });\n\n container.querySelectorAll(\"[data-wi-price='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n if (el === null) { new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_PRICE)); }\n\n });\n \n container.querySelectorAll(\"[data-wi-percentige='true']\").forEach(element => {\n \n var el = AutoNumeric.getAutoNumericElement(element);\n if (el === null) { new AutoNumeric(element, customAutonumeric(element, AUTONUMERIC_PERCENTIGE)); }\n\n });\n\n}"},1367(e){e.exports='function wiConditionalControls(field, name) {\n\n var scope = field.form || document;\n var controls = [];\n var normalizedName = String(name || "").replace(/\\[\\]$/, "");\n\n scope.querySelectorAll("[name]").forEach(function(control) {\n var controlName = String(control.name || "").replace(/\\[\\]$/, "");\n\n if (controlName === normalizedName) { controls.push(control); }\n });\n\n return controls;\n\n}\n\nfunction wiConditionalDriverValues(field, name) {\n\n var values = [];\n var controls = wiConditionalControls(field, name);\n var hasValueControl = controls.some(function(control) {\n return (control.type || "").toLowerCase() !== "hidden";\n });\n\n controls.forEach(function(control) {\n\n var type = (control.type || "").toLowerCase();\n\n if (type === "hidden" && hasValueControl) { return; }\n\n if (type === "radio" || type === "checkbox") {\n if (control.checked) { values.push(String(control.value)); }\n return;\n }\n\n if (control.multiple && control.options) {\n Array.from(control.options).forEach(function(option) {\n if (option.selected) { values.push(String(option.value)); }\n });\n return;\n }\n\n if (control.value !== undefined && control.value !== "") {\n values.push(String(control.value));\n }\n\n });\n\n return values;\n\n}\n\nfunction wiConditionalDriverValue(field, name) {\n\n var values = wiConditionalDriverValues(field, name);\n\n return values.length ? values[values.length - 1] : "";\n\n}\n\nfunction wiConditionalWrapper(field) {\n\n var explicit = field.closest("[data-wi-conditional-container]");\n if (explicit) { return explicit; }\n\n var row = field.closest("[data-wi-input-row]");\n if (row) { return row; }\n\n var wonder = field.closest(".wi-input-container");\n if (wonder) {\n var wonderParent = wonder.parentElement;\n\n if (field.form && wonderParent && wonderParent.parentElement === field.form && wonderParent.children.length === 1) {\n return wonderParent;\n }\n\n return wonder;\n }\n\n var floating = field.closest(".form-floating");\n if (floating) { return floating.parentElement || floating; }\n\n var bootstrap = field.closest(\'[id^="container-"]\');\n if (bootstrap) { return bootstrap.parentElement || bootstrap; }\n\n var group = field.closest("[data-wi-date-range], [data-wi-date-time-range], .input-group");\n if (group) { return group.parentElement || group; }\n\n return field.parentElement;\n\n}\n\nfunction wiSetConditionalVisibility(field, show) {\n\n var wrapper = wiConditionalWrapper(field);\n\n if (!field.dataset.wiConditionalRequired) {\n field.dataset.wiConditionalRequired = field.required ? "required" : "optional";\n }\n\n field.required = show && field.dataset.wiConditionalRequired === "required";\n\n if (!wrapper) { return; }\n\n if (!wrapper.dataset.wiConditionalDisplayCaptured) {\n wrapper.dataset.wiConditionalDisplayCaptured = "1";\n wrapper.dataset.wiConditionalDisplay = wrapper.style.display || "";\n wrapper.dataset.wiConditionalAriaHidden = wrapper.getAttribute("aria-hidden") || "";\n wrapper.dataset.wiConditionalAriaHiddenPresent = wrapper.hasAttribute("aria-hidden") ? "1" : "0";\n }\n\n if (show) {\n wrapper.style.display = wrapper.dataset.wiConditionalDisplay || "";\n\n if (wrapper.dataset.wiConditionalAriaHiddenPresent === "1") {\n wrapper.setAttribute("aria-hidden", wrapper.dataset.wiConditionalAriaHidden);\n } else {\n wrapper.removeAttribute("aria-hidden");\n }\n\n wrapper.removeAttribute("data-wi-conditional-hidden");\n return;\n }\n\n wrapper.style.display = "none";\n wrapper.setAttribute("aria-hidden", "true");\n wrapper.setAttribute("data-wi-conditional-hidden", "true");\n\n}\n\nfunction wiEvaluateConditional() {\n\n document.querySelectorAll("[data-visible-when], [data-hidden-when]").forEach(function(field) {\n\n var isVisibleRule = field.hasAttribute("data-visible-when");\n var name = isVisibleRule ? field.dataset.visibleWhen : field.dataset.hiddenWhen;\n var list = (isVisibleRule ? field.dataset.visibleWhenValues : field.dataset.hiddenWhenValues) || "";\n var expected = list.split(",").map(function(item) { return item.trim(); });\n var current = wiConditionalDriverValues(field, name);\n\n if (!current.length) { current = [""]; }\n\n var matches = current.some(function(value) { return expected.indexOf(value) !== -1; });\n var show = isVisibleRule ? matches : !matches;\n\n wiSetConditionalVisibility(field, show);\n\n });\n\n if (typeof check === "function") { check(); }\n\n}\n\nfunction setConditional(container = document) {\n\n var selector = "[data-visible-when], [data-hidden-when]";\n var fields = Array.from(container.querySelectorAll(selector));\n\n if (container.matches && container.matches(selector)) {\n fields.unshift(container);\n }\n\n if (!fields.length) { return; }\n\n fields.forEach(function(field) {\n\n var name = field.dataset.visibleWhen || field.dataset.hiddenWhen;\n if (!name) { return; }\n\n wiConditionalControls(field, name).forEach(function(control) {\n if (control.wiConditionalBound === true) { return; }\n\n control.wiConditionalBound = true;\n control.dataset.wiConditionalBound = "1";\n control.addEventListener("change", wiEvaluateConditional);\n control.addEventListener("input", wiEvaluateConditional);\n });\n\n });\n\n wiEvaluateConditional();\n\n}\n'},7059(e){e.exports="function setRequired(element, required = true) {\n \n labelAsterisk(element, required);\n\n element.required = required;\n\n}\n\nfunction setDisabled(element, disabled = true) {\n \n labelAsterisk(element, disabled ? false : true);\n\n if (disabled) {\n if (element.type === 'checkbox' || element.type === 'radio') { element.checked = false; }\n }\n\n element.disabled = disabled;\n\n}\n\nfunction labelAsterisk(input, asterisk = true)\n{\n\n if (input.labels) {\n \n var label = input.labels[0];\n var labelValue = label.innerHTML;\n var hasAsterisk = (labelValue.substring(labelValue.length - 1) == '*') ? true : false;\n \n if (asterisk) {\n if (!hasAsterisk) { label.innerHTML = labelValue+'*'; }\n } else {\n if (hasAsterisk) { label.innerHTML = labelValue.replace('*', ''); }\n }\n\n }\n\n}\n\nfunction changeInputId(el) \n{\n\n const idEl = 'field_' + code(10).toLowerCase();\n const labelEl = el.parentElement.querySelector('.wi-label, .wi-checkbox-label');\n\n if (labelEl !== null) {\n el.id = idEl;\n labelEl.htmlFor = idEl;\n }\n\n}"},2700(e){e.exports="function setGoogleMapsApi() {\n\n if (document.querySelector(\"[data-wi-search-place]\")) {\n\n /**\n * \n * Se ci sono degli input Place chiama le API di Google Place\n * Documentazione: https://developers.google.com/maps/documentation/javascript/place-autocomplete?hl=it\n * \n */\n\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.src = 'https://maps.googleapis.com/maps/api/js?key='+GOOGLE_API_KEY+'&loading=async&libraries=places&callback=initGoogleMapsPlace'; \n\n document.head.appendChild(script);\n \n }\n\n}\n\nfunction initGoogleMapsPlace() {\n\n document.querySelectorAll(\"[data-wi-search-place='true']\").forEach(input => {\n\n var callback = input.dataset.wiCallback ?? checkInputPlace;\n\n input.disabled = false;\n // Il campo abilitato da Places non e' una modifica dell'utente\n window.wiSaveBar?.absorb(input);\n \n var options = {};\n\n if (input.dataset.wiRestriction && input.dataset.wiRestriction != '[]') { \n\n var restrictions = JSON.parse(input.dataset.wiRestriction);\n options.componentRestrictions = restrictions; \n \n }\n\n options.fields = [ \"address_components\", \"geometry\" ];\n options.types = [ \"address\" ];\n \n var googlePlace = new google.maps.places.Autocomplete(input, options);\n\n input.addEventListener(\"change\", () => { placeNeedCheck(input); });\n googlePlace.addListener(\"place_changed\", () => { window[callback](input, googlePlace); });\n\n });\n\n}\n\nfunction placeNeedCheck(input) {\n\n inputError(input, 'Indirizzo non valido, è necessario selezionare un indirizzo dall\\'elenco!');\n\n}\n"},3883(e){e.exports="function isInternationalPhone(value) {\n\n return /^\\s*(\\+|00)/.test(String(value || ''));\n\n}\n\nfunction formatPhone(value, trimEnd) {\n\n value = String(value || '');\n\n // Numero nazionale: solo cifre, al massimo 10, a gruppi 3-3-4.\n if (!isInternationalPhone(value)) {\n var digits = value.replace(/\\D/g, '').slice(0, 10);\n return [digits.slice(0, 3), digits.slice(3, 6), digits.slice(6, 10)]\n .filter(Boolean)\n .join(' ');\n }\n\n // Numero internazionale (+ o 00): prefisso e gruppi come digitati, al massimo 15 cifre.\n var result = /^\\s*\\+/.test(value) ? '+' : '';\n var count = 0;\n var separator = false;\n\n value.replace(/^\\s*\\+/, '').split('').forEach(function (character) {\n if (!/\\d/.test(character)) {\n separator = count > 0;\n return;\n }\n\n if (count >= 15) { return; }\n\n if (separator) { result += ' '; }\n result += character;\n separator = false;\n count++;\n });\n\n if (separator && !trimEnd && count < 15) { result += ' '; }\n\n return result;\n\n}\n\nfunction checkPhone(element) {\n\n if (!element || element.dataset.wiPhoneInitialized === 'true') { return; }\n element.dataset.wiPhoneInitialized = 'true';\n\n var format = function (event) {\n var cursor = typeof element.selectionStart === 'number' ? element.selectionStart : null;\n var atEnd = cursor !== null && cursor >= element.value.length;\n var digitsBeforeCursor = cursor === null\n ? null\n : element.value.slice(0, cursor).replace(/[^\\d+]/g, '').length;\n var value = formatPhone(element.value, !event || event.type === 'change');\n\n if (element.value !== value) { element.value = value; }\n\n if (digitsBeforeCursor !== null && typeof element.setSelectionRange === 'function') {\n var position = atEnd ? value.length : 0;\n var digitsSeen = 0;\n while (!atEnd && position < value.length && digitsSeen < digitsBeforeCursor) {\n if (/[\\d+]/.test(value[position])) { digitsSeen++; }\n position++;\n }\n element.setSelectionRange(position, position);\n }\n };\n\n element.addEventListener('input', format);\n element.addEventListener('change', format);\n format();\n\n}\n"},6338(e){e.exports='// Loader dell\'API Google Maps JS (Dynamic Library Import) + marker builder di default.\n// Uso: await requireGoogleMaps([\'maps\', \'places\', \'marker\']); poi inizializzare la mappa.\nasync function requireGoogleMaps(libs = [ \'maps\', \'places\', \'marker\' ], options = {}) {\n\n const {\n key = (typeof GOOGLE_API_KEY !== \'undefined\' ? GOOGLE_API_KEY : \'\'),\n v = \'weekly\',\n language = null\n } = options;\n\n const params = { key, v };\n if (language) { params.language = language; }\n\n (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})(params);\n\n for (const lib of libs) {\n await google.maps.importLibrary(lib);\n }\n\n}\n\n// Builder di default per il contenuto di un AdvancedMarkerElement.\n// properties: { id, type, icon, image, name, address, url, badgeText }\n// Per un markup diverso passare la propria funzione a MapManager.addAdvancedMarker().\nfunction gmapMarkerConstructor(properties) {\n\n const content = document.createElement("div");\n\n if (properties.id) { content.id = `marker-${properties.id}`; }\n content.classList.add("wi-marker");\n if (properties.type) { content.classList.add(`wi-marker-${properties.type}`); }\n\n const image = properties.image ? `\n <div class="w-30 b-r-10 o-hidden">\n <div class="f-3-2">\n ${properties.image}\n </div>\n </div>` : \'\';\n\n const address = properties.address ? `<div class="text-small mt-1">${properties.address}</div>` : \'\';\n\n const badge = properties.url ? `\n <div class="features mt-2">\n <a href="${properties.url}" class="badge badge-primary">\n ${properties.badgeText ?? \'\'}\n </a>\n </div>` : \'\';\n\n content.innerHTML = `\n <div class="icon">\n <div class="f-1-1">\n ${properties.icon ?? \'\'}\n </div>\n </div>\n <div class="details">\n ${image}\n <div class="${properties.image ? \'w-70 pl-2\' : \'w-100\'} box-border">\n <div class="text fw-400">${properties.name ?? \'\'}</div>\n ${address}\n ${badge}\n </div>\n </div>\n `;\n\n return content;\n\n}\n\n// Espande/comprime un marker (classe .highlight su .wi-marker)\nfunction toggleHighlight(markerView) {\n\n if (!markerView || !markerView.content || !markerView.content.classList) { return; }\n\n if (markerView.content.classList.contains("highlight")) {\n markerView.content.classList.remove("highlight");\n markerView.zIndex = null;\n } else {\n markerView.content.classList.add("highlight");\n markerView.zIndex = 1;\n }\n\n}\n'},8636(e){e.exports="function position(element, showItem = false) {\n\n var rect = element.getBoundingClientRect();\n\n if (showItem) {\n\n var width = rect.right - rect.left;\n var height = rect.bottom - rect.top;\n\n var element = document.createElement(\"DIV\");\n element.style.position = \"fixed\";\n element.style.top = rect.top+'px';\n element.style.left = rect.left+'px';\n element.style.width = width+'px';\n element.style.height = height+'px';\n element.style.zIndex = 999999;\n element.style.background = 'rgba(255, 0, 0, .2)';\n document.body.appendChild(element);\n\n }\n\n return rect;\n\n}\n\nfunction fullPage(element) {\n element.width = window.innerWidth;\n element.height = window.innerHeight;\n}\n\nfunction copyText(text, icon = null) {\n\n if (icon != null) {\n document.querySelectorAll('.bi-clipboard-check').forEach(element => {\n element.classList.remove('bi-clipboard-check')\n element.classList.add('bi-clipboard');\n });\n }\n\n navigator.clipboard.writeText(text).then(() => {\n if (icon != null) {\n icon.classList.remove('bi-clipboard');\n icon.classList.add('bi-clipboard-check');\n }\n },() => {\n if (icon != null) {\n icon.classList.remove('bi-clipboard');\n icon.classList.add('bi-clipboard-x');\n }\n });\n\n}\n\n// Messaggio testuale di una risposta 4xx in JSON ({ response: '...' }); null altrimenti.\n// Gli errori 5xx restano generici per non mostrare dettagli interni.\nfunction ajaxResponseMessage(request) {\n\n if (!request || request.readyState != 4 || request.status < 400 || request.status > 499) {\n return null;\n }\n\n try {\n var message = JSON.parse(request.responseText).response;\n } catch {\n return null;\n }\n\n return typeof message === 'string' && message.trim() !== '' ? message.trim() : null;\n\n}\n\nfunction ajaxRequestError(request) {\n \n if (request.readyState == 4) {\n alertToast(802);\n } else if (request.readyState == 0) {\n alertToast(801);\n } else {\n alertToast(800);\n }\n\n}\n\nfunction code(codeLength = 10) {\n\n var result = '';\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n var charactersLength = characters.length;\n\n for ( var i = 0; i < codeLength; i++ ) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n\n return result;\n\n}\n\nfunction isMobile() {\n\n if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {\n return true;\n } else {\n return false;\n }\n \n}\n\nfunction delay(time) {\n\n return new Promise(resolve => setTimeout(resolve, time));\n\n}\n\n// Previene l'uscita dalla pagina\nfunction preventPageExit(event) {\n \n event.preventDefault();\n event.returnValue = true;\n\n}"},5827(e){e.exports='function setVideoJS() {\n\n document.querySelectorAll(".video-js").forEach(element => {\n videojs(element);\n });\n\n}'},4642(e){e.exports=function(e){function n(e){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",e)}try{"undefined"!=typeof execScript&&"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener?execScript(e):"undefined"!=typeof eval?eval.call(null,e):n("EvalError: No eval function available")}catch(e){n(e)}}},7077(e,n,t){t(4642)(t(1192))},9213(e,n,t){t(4642)(t(2578))},8124(e,n,t){t(4642)(t(5365))},8393(e,n,t){t(4642)(t(7060))},673(e,n,t){t(4642)(t(2758))},3038(e,n,t){t(4642)(t(373))},9111(e,n,t){t(4642)(t(8882))},7187(e,n,t){t(4642)(t(3740))},2347(e,n,t){t(4642)(t(6944))},8004(e,n,t){t(4642)(t(8197))},9118(e,n,t){t(4642)(t(1367))},550(e,n,t){t(4642)(t(7059))},3211(e,n,t){t(4642)(t(2700))},3286(e,n,t){t(4642)(t(3883))},4581(e,n,t){t(4642)(t(6338))},9899(e,n,t){t(4642)(t(8636))},2492(e,n,t){t(4642)(t(5827))},6235(){window.wi=window.wi||{}}};const n={};function t(r){const i=n[r];if(void 0!==i)return i.exports;const a=n[r]={exports:{}};return e[r](a,a.exports,t),a.exports}(()=>{"use strict";class e{constructor(e,n){this.baseUrl=e,this.token=n}async request(e,n={}){const t={Authorization:`Bearer ${this.token}`,"Accept-Language":a.lang,...n.headers};let r=n.body;r instanceof FormData||void 0===r||(t["Content-Type"]="application/json",r=JSON.stringify(r));const i=await fetch(`${this.baseUrl}${e}`,{...n,headers:t,body:r});let o;i.headers.get("content-type");try{o=await i.json()}catch{throw{success:!1,status:i.status,response:"Errore nel parsing della risposta"}}if(!o.success)throw o;return o}get(e){return this.request(e,{method:"GET"})}post(e,n){return this.request(e,{method:"POST",body:n})}put(e,n){return this.request(e,{method:"PUT",body:n})}delete(e){return this.request(e,{method:"DELETE"})}}const n=new WeakMap,r=new WeakSet;class i{static init(e=document){const n=e.ownerDocument||e;if(!r.has(n)){r.add(n),n.addEventListener("click",e=>{const n=e.target.closest?.("[data-wi-deferred-trigger]");if(!n||0!==e.button||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey)return;const t=n.closest("[data-wi-deferred]");t&&"error"!==t.dataset.wiDeferredState&&(e.preventDefault(),this.load(t,{focus:!0}).catch(()=>{}))}),n.addEventListener("keydown",e=>{" "===e.key&&e.target.matches('a[data-wi-deferred-trigger][role="button"]')&&(e.preventDefault(),e.target.click())});new MutationObserver(e=>{for(const n of e)for(const e of n.addedNodes)1===e.nodeType&&this.init(e)}).observe(n.documentElement,{childList:!0,subtree:!0})}const t=[...e.querySelectorAll("[data-wi-deferred]")];e.matches?.("[data-wi-deferred]")&&t.unshift(e);for(const e of t){if(r.has(e))continue;if(r.add(e),e.querySelectorAll("a[data-wi-deferred-trigger]").forEach(e=>e.setAttribute("role","button")),"visible"!==e.dataset.wiDeferred||"undefined"==typeof IntersectionObserver)continue;const n=new IntersectionObserver(t=>{t.some(e=>e.isIntersecting)&&(n.disconnect(),this.load(e).catch(()=>{}))});n.observe(e)}}static load(e,{focus:t=!1}={}){const r="string"==typeof e?document.querySelector(e):e;if(!r)return Promise.reject(new Error("Deferred content not found."));if(n.has(r))return n.get(r);const i=this.activate(r,t);return n.set(r,i),i}static async activate(e,n){const t=e.querySelector(":scope > template[data-wi-deferred-template]");if(!t)throw new Error("Deferred template not found.");const r=e.ownerDocument,i=r.createElement("div");i.className="wi-deferred-content",i.append(t.content.cloneNode(!0));const a=[...i.querySelectorAll("script")];a.forEach(e=>e.remove()),e.dataset.wiDeferredState="loading",e.setAttribute("aria-busy","true"),e.append(i);try{for(const e of a)await new Promise((n,t)=>{const a=r.createElement("script");for(const n of e.attributes)a.setAttribute(n.name,n.value);const o=e.src||"module"===e.type;o&&(a.async=!1,a.onload=n,a.onerror=()=>t(new Error("Deferred script failed to load."))),a.textContent=e.textContent,i.append(a),o||n()});if(e.querySelector(":scope > [data-wi-deferred-placeholder]")?.remove(),t.remove(),e.dataset.wiDeferredState="ready",n){const e=i.querySelector("iframe, button, a[href], [tabindex]")||i;e.hasAttribute("tabindex")||e.setAttribute("tabindex","-1"),e.focus({preventScroll:!0})}return e.dispatchEvent(new CustomEvent("wi:deferred:ready",{bubbles:!0})),i}catch(n){throw i.remove(),e.dataset.wiDeferredState="error",e.querySelectorAll("[data-wi-deferred-trigger]").forEach(e=>{e.removeAttribute("role"),"BUTTON"===e.tagName&&(e.disabled=!0)}),e.dispatchEvent(new CustomEvent("wi:deferred:error",{bubbles:!0,detail:{error:n}})),n}finally{e.removeAttribute("aria-busy")}}}class a{static translations={};static defaultTranslations={};static get lang(){return document.documentElement.lang||"it"}static async init(e,n={}){this.translations=e,this.defaultTranslations=n}static get(e,n=[]){let t=this.getNestedValue(this.translations,e);return null==t&&(t=this.getNestedValue(this.defaultTranslations,e)),null==t?(console.error("Chiave di traduzione mancante: '"+e+"'"),e):(Array.isArray(n)&&n.length>0&&n.forEach((e,n)=>{t=t.replace(new RegExp("\\{"+n+"\\}","g"),e)}),t)}static getNestedValue(e,n){const t=n.split(".");let r=e;for(const e of t){if("object"!=typeof r||null===r||!(e in r))return null;r=r[e]}return r}}class o{constructor(e,n={}){const{infoElement:t=null,exportElement:r=null,mapId:i=null,travelMode:a="DRIVING",onError:o=e=>alert(e)}=n;this.mapElement=e,this.infoElement=t,this.exportElement=r,this.mapId=i,this.travelMode=a,this.onError=o,this.map=null,this.directionsService=null,this.directionsRenderer=null,this.autocomplete=null,this.mapClickListener=null,this.editingEnabled=!1,this.routeEnabled=!1,this.advancedMarkers=[],this.inputElement=null,this.waypoints=[],this.markers=[],this.mapType="hybrid",this.labelsVisible=!1}getTravelMode(){return google.maps.TravelMode[this.travelMode]??google.maps.TravelMode.DRIVING}initBaseMap(e={}){const n={center:{lat:20,lng:0},zoom:2,mapTypeId:this.mapType,mapTypeControl:!1,zoomControl:!0,streetViewControl:!1,fullscreenControl:!1,...e};return this.mapId&&(n.mapId=this.mapId),this.map=new google.maps.Map(this.mapElement,n),this.updateMapStyle(),this.map}initMap(){this.initBaseMap()}enableEditing(){this.map||this.initBaseMap(),this.editingEnabled=!0,this.mapClickListener&&this.mapClickListener.remove(),this.mapClickListener=this.map.addListener("click",e=>this.addChangeableMarker(e.latLng))}disableEditing(){this.mapClickListener&&(this.mapClickListener.remove(),this.mapClickListener=null),this.editingEnabled=!1}enableRoute(e={}){const{suppressMarkers:n=!0,draggable:t=!1,preserveViewport:r=!1,recalc:i=!0}=e;this.map||this.initBaseMap(),this.directionsService||(this.directionsService=new google.maps.DirectionsService),this.directionsRenderer?(this.directionsRenderer.setMap(this.map),this.directionsRenderer.setOptions({suppressMarkers:n,draggable:t,preserveViewport:r})):this.directionsRenderer=new google.maps.DirectionsRenderer({map:this.map,suppressMarkers:n,draggable:t,preserveViewport:r}),this.routeEnabled=!0,i&&this.waypoints.length>=2&&this.calcRoute()}disableRoute(){this.routeEnabled=!1,this.directionsRenderer&&(this.directionsRenderer.set("directions",null),this.directionsRenderer.setMap(null))}enableAutocomplete(e){this.inputElement=e,this.autocomplete=new google.maps.places.Autocomplete(this.inputElement),this.autocomplete.bindTo("bounds",this.map),this.autocomplete.addListener("place_changed",()=>{const e=this.autocomplete.getPlace();e.geometry&&e.geometry.location?(this.inputElement.value="",this.map.panTo(e.geometry.location),this.map.setZoom(15),this.addChangeableMarker(e.geometry.location)):this.onError("Luogo non trovato")})}initReadOnlyMap(e){if(!Array.isArray(e)||e.length<2)return void console.warn("Percorso non valido o troppo corto.");this.initBaseMap({center:e[0],zoom:14,disableDefaultUI:!0,mapTypeId:this.mapType}),this.disableEditing(),this.enableRoute({preserveViewport:!0,recalc:!1});const n=e[0],t=e[e.length-1],r=e.slice(1,-1).map(e=>({location:e,stopover:!0}));this.directionsService.route({origin:n,destination:t,waypoints:r,travelMode:this.getTravelMode()},(e,r)=>{if("OK"===r){this.directionsRenderer.setDirections(e);const r=new google.maps.LatLngBounds;if(e.routes[0].overview_path.forEach(e=>r.extend(e)),this.map.fitBounds(r),google.maps.marker&&google.maps.marker.AdvancedMarkerElement&&google.maps.marker.PinElement){const e=new google.maps.marker.PinElement({glyphText:"A"});new google.maps.marker.AdvancedMarkerElement({position:n,map:this.map,content:e.element,title:"A"});const r=new google.maps.marker.PinElement({glyphText:"B"});new google.maps.marker.AdvancedMarkerElement({position:t,map:this.map,content:r.element,title:"B"})}else new google.maps.Marker({position:n,map:this.map,label:"A"}),new google.maps.Marker({position:t,map:this.map,label:"B"})}else this.onError("Errore nel calcolo del percorso: "+r)})}setMapType(e){this.mapType=e,this.updateMapStyle()}toggleLabels(){this.labelsVisible=!this.labelsVisible,this.updateMapStyle()}updateMapStyle(){this.map.setMapTypeId(this.mapType),this.mapId||(this.labelsVisible?this.map.setOptions({styles:null}):this.map.setOptions({styles:[{featureType:"all",elementType:"labels",stylers:[{visibility:"off"}]}]}))}fitBounds(e={}){if(!this.map)return;const{includeRoute:n=!0,includeMarkers:t=!0,includeAdvancedMarkers:r=!0,extraPoints:i=[],padding:a=40,minZoom:o=null,maxZoom:s=null}=e,l=new google.maps.LatLngBounds;let c=!1;const u=e=>{if(!e)return null;if("function"==typeof e.lat&&"function"==typeof e.lng)return e;if("function"==typeof e.getPosition)return e.getPosition();if(e.position){const n=e.position;if("function"==typeof n.lat&&"function"==typeof n.lng)return n;if("number"==typeof n.lat&&"number"==typeof n.lng)return new google.maps.LatLng(n.lat,n.lng)}return e.location?u(e.location):"number"==typeof e.lat&&"number"==typeof e.lng?new google.maps.LatLng(e.lat,e.lng):null},d=e=>{const n=u(e);n&&(l.extend(n),c=!0)};if(n&&this.directionsRenderer&&this.directionsRenderer.getDirections){const e=this.directionsRenderer.getDirections(),n=e?.routes?.[0];n?.overview_path?.length?n.overview_path.forEach(e=>d(e)):this.waypoints.length&&this.waypoints.forEach(e=>d(e.location))}else n&&this.waypoints.length&&this.waypoints.forEach(e=>d(e.location));if(t&&this.markers.forEach(e=>d(e)),r&&this.advancedMarkers.forEach(e=>d(e)),Array.isArray(i)&&i.forEach(e=>d(e)),c&&(this.map.fitBounds(l,a),null!==o||null!==s)){const e=this.map.addListener("idle",()=>{const n=this.map.getZoom();null!==o&&n<o&&this.map.setZoom(o),null!==s&&n>s&&this.map.setZoom(s),e.remove()})}}addAdvancedMarker(e,n,t,r,i){const a="function"==typeof i?i(r):null;if(google.maps.marker&&google.maps.marker.AdvancedMarkerElement){const r=new google.maps.marker.AdvancedMarkerElement({map:this.map,content:a,position:new google.maps.LatLng(e,n),title:t});return this.advancedMarkers.push(r),r}console.warn("AdvancedMarkerElement non disponibile, uso Marker standard.");const o=new google.maps.Marker({position:new google.maps.LatLng(e,n),map:this.map,title:t});return this.advancedMarkers.push(o),o}addMarker(e,n){return new google.maps.Marker({position:e,map:this.map,label:n})}addChangeableMarker(e){const n=(this.markers.length+1).toString(),t=this.addMarker(e,n);t.setDraggable(!0),t.addListener("dragend",()=>{this.updateWaypoints(),this.routeEnabled&&this.calcRoute()}),t.addListener("dblclick",()=>{t.setMap(null),this.markers=this.markers.filter(e=>e!==t),this.updateWaypoints(),this.routeEnabled&&this.calcRoute()}),this.markers.push(t),this.updateWaypoints(),this.routeEnabled&&this.markers.length>=2&&this.calcRoute()}updateWaypoints(){this.waypoints=this.markers.map(e=>({location:e.getPosition(),stopover:!0})),this.markers.forEach((e,n)=>e.setLabel((n+1).toString())),this.saveRoute()}calcRoute(){if(!this.routeEnabled||!this.directionsService||!this.directionsRenderer)return;if(this.waypoints.length<2)return;const e=this.waypoints[0].location,n=this.waypoints[this.waypoints.length-1].location,t=this.waypoints.slice(1,-1);this.directionsService.route({origin:e,destination:n,waypoints:t,travelMode:this.getTravelMode()},(e,n)=>{if("OK"===n){this.directionsRenderer.setDirections(e),this.showRouteInfo(e.routes[0].legs);const n=new google.maps.LatLngBounds;e.routes[0].overview_path.forEach(e=>n.extend(e)),this.map.fitBounds(n)}else this.onError("Errore nel calcolo del percorso: "+n)})}showRouteInfo(e){let n=0,t=0;e.forEach(e=>{n+=e.distance.value,t+=e.duration.value}),this.infoElement&&(this.infoElement.innerHTML=`<strong>Distanza:</strong> ${(n/1e3).toFixed(2)} km<br><strong>Tempo stimato:</strong> ${this.formatTime(t)}`)}formatTime(e){const n=Math.floor(e/60),t=Math.floor(n/60),r=n%60;return t>0?`${t}h ${r}min`:`${r}min`}resetMap(){this.markers.forEach(e=>e.setMap(null)),this.markers=[],this.waypoints=[],this.directionsRenderer&&this.directionsRenderer.set("directions",null),this.infoElement&&(this.infoElement.innerHTML="")}saveRoute(){const e=this.markers.map(e=>({lat:e.getPosition().lat(),lng:e.getPosition().lng()}));this.exportElement&&(this.exportElement.value=JSON.stringify(e,null,2))}loadRouteFromJSON(e){this.resetMap();JSON.parse(e).forEach(e=>this.addChangeableMarker(new google.maps.LatLng(e.lat,e.lng)))}}t(6235);window.DeferredContent=i,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>i.init(),{once:!0}):i.init(),window.ApiClient=e,window.TranslationProvider=a,window.MapManager=o,window.MapNavigator=class{constructor(e){if(!(e&&e instanceof o))throw new Error("Devi passare una istanza valida di MapManager");this.mapManager=e,this.map=e.map,this.percorso=[],this.userMarker=null,this.watchId=null,this.previousPosition=null}init(e){this.stop(),this.percorso=e,this.mapManager.initReadOnlyMap(e),this.map=this.mapManager.map}start(){navigator.geolocation?this.watchId=navigator.geolocation.watchPosition(e=>this.updatePosition(e),e=>this.mapManager.onError("Errore nella geolocalizzazione: "+e.message),{enableHighAccuracy:!0,maximumAge:0,timeout:1e4}):this.mapManager.onError("Geolocalizzazione non supportata dal tuo browser.")}updatePosition(e){const n={lat:e.coords.latitude,lng:e.coords.longitude};let t=0;if(this.previousPosition&&(t=this.computeHeading(this.previousPosition,n)),this.userMarker){this.userMarker.setPosition(n);const e=this.userMarker.getIcon();e.rotation=t,this.userMarker.setIcon(e)}else this.map.setZoom(16),this.map.setCenter(n),this.userMarker=new google.maps.Marker({position:n,map:this.map,icon:{path:google.maps.SymbolPath.FORWARD_CLOSED_ARROW,scale:4,fillColor:"#007BFF",fillOpacity:1,strokeColor:"#fff",strokeWeight:1,rotation:t,anchor:new google.maps.Point(0,2)},title:"La tua posizione"});this.previousPosition=n}computeHeading(e,n){const t=e=>e*Math.PI/180,r=t(e.lat),i=t(e.lng),a=t(n.lat),o=t(n.lng)-i,s=Math.sin(o)*Math.cos(a),l=Math.cos(r)*Math.sin(a)-Math.sin(r)*Math.cos(a)*Math.cos(o),c=Math.atan2(s,l);return(180*c/Math.PI+360)%360}stop(){null!==this.watchId&&(navigator.geolocation.clearWatch(this.watchId),this.watchId=null),this.userMarker&&(this.userMarker.setMap(null),this.userMarker=null)}openInGoogleMaps(){if(!this.percorso||this.percorso.length<2)return void this.mapManager.onError("Percorso insufficiente per l'apertura in Google Maps.");const e=`${this.percorso[0].lat},${this.percorso[0].lng}`,n=`${this.percorso[this.percorso.length-1].lat},${this.percorso[this.percorso.length-1].lng}`,t=this.percorso.slice(1,-1).map(e=>`${e.lat},${e.lng}`).join("|"),r=new URL("https://www.google.com/maps/dir/");r.searchParams.set("api","1"),r.searchParams.set("origin",e),r.searchParams.set("destination",n),t&&r.searchParams.set("waypoints",t),r.searchParams.set("travelmode",{DRIVING:"driving",BICYCLING:"bicycling",WALKING:"walking",TRANSIT:"transit"}[this.mapManager.travelMode]??"driving"),window.open(r.toString(),"_blank")}},window.API_CLIENT=new e(pathSite+"/api",API_TOKEN),window.API_CLIENT_APP=window.API_CLIENT,window.__t=function(e,n=[]){return a.get(e,n)};t(8004),t(3286),t(550),t(9118),t(3211),t(4581),t(2347),t(9899),t(9111),t(7187),t(2492),t(3038),t(8393),t(673),t(9213),t(8124),t(7077)})()})();
|
|
2
2
|
//# sourceMappingURL=head.js.map
|