<html lang="it"><head>

<link rel="stylesheet" type="text/css" href="https://ariston.kleecks-cdn.com/static/css/vendors.css">

<link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/main.css?v=1771322105653">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.4.2/css/all.css" integrity="sha384-blOohCVdhjmtROpu8+CfTnUWham9nkX7P7OZQMst+RUnhtoY/9qemFAkIKOYxDI3" crossorigin="anonymous">

<script type="text/javascript" async="" src="https://matomo-italia1.kleecks-stats.com/matomo.js"></script>

<link rel="preload" href="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/default.js" as="script">

<link rel="preload" href="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/_app.js" as="script">

<link rel="preload" href="https://www.ariston.com/_next/static/runtime/webpack-4ea8b5295b6d613200bb.js" as="script">

<link rel="preload" href="https://www.ariston.com/_next/static/chunks/commons.12566168a0b389f7d59c.js" as="script">

<link rel="preload" href="https://www.ariston.com/_next/static/runtime/main-2f6b578326f8b87de07d.js" as="script">

<style type="text/css">/*!

* fullPage 3.0.8

* https://github.com/alvarotrigo/fullPage.js

*

* @license GPLv3 for open source use only

* or Fullpage Commercial License for commercial use

* http://alvarotrigo.com/fullPage/pricing/

*

* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo

*/.fp-enabled body,html.fp-enabled{margin:0;padding:0;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.fp-section{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fp-slide{float:left}.fp-slide,.fp-slidesContainer{height:100%;display:block}.fp-slides{z-index:1;height:100%;overflow:hidden;position:relative;-webkit-transition:all .3s ease-out;transition:all .3s ease-out}.fp-section.fp-table,.fp-slide.fp-table{display:table;table-layout:fixed;width:100%}.fp-tableCell{display:table-cell;vertical-align:middle;width:100%;height:100%}.fp-slidesContainer{float:left;position:relative}.fp-controlArrow{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;position:absolute;z-index:4;top:50%;cursor:pointer;width:0;height:0;border-style:solid;margin-top:-38px;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.fp-controlArrow.fp-prev{left:15px;width:0;border-width:38.5px 34px 38.5px 0;border-color:transparent #fff transparent transparent}.fp-controlArrow.fp-next{right:15px;border-width:38.5px 0 38.5px 34px;border-color:transparent transparent transparent #fff}.fp-scrollable{position:relative}.fp-scrollable,.fp-scroller{overflow:hidden}.iScrollIndicator{border:0!important}.fp-notransition{-webkit-transition:none!important;transition:none!important}#fp-nav{position:fixed;z-index:100;margin-top:-32px;top:50%;opacity:1;-webkit-transform:translateZ(0)}#fp-nav.fp-right{right:17px}#fp-nav.fp-left{left:17px}.fp-slidesNav{position:absolute;z-index:4;opacity:1;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);left:0!important;right:0;margin:0 auto!important}.fp-slidesNav.fp-bottom{bottom:17px}.fp-slidesNav.fp-top{top:17px}#fp-nav ul,.fp-slidesNav ul{margin:0;padding:0}#fp-nav ul li,.fp-slidesNav ul li{display:block;width:14px;height:13px;margin:7px;position:relative}.fp-slidesNav ul li{display:inline-block}#fp-nav ul li a,.fp-slidesNav ul li a{display:block;position:relative;z-index:1;width:100%;height:100%;cursor:pointer;text-decoration:none}#fp-nav ul li:hover a.active span,#fp-nav ul li a.active span,.fp-slidesNav ul li:hover a.active span,.fp-slidesNav ul li a.active span{height:12px;width:12px;margin:-6px 0 0 -6px;border-radius:100%}#fp-nav ul li a span,.fp-slidesNav ul li a span{border-radius:50%;position:absolute;z-index:1;height:4px;width:4px;border:0;background:#333;left:50%;top:50%;margin:-2px 0 0 -2px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out}#fp-nav ul li:hover a span,.fp-slidesNav ul li:hover a span{width:10px;height:10px;margin:-5px 0 0 -5px}#fp-nav ul li .fp-tooltip{position:absolute;top:-2px;color:#fff;font-size:14px;font-family:arial,helvetica,sans-serif;white-space:nowrap;max-width:220px;overflow:hidden;display:block;opacity:0;width:0;cursor:pointer}#fp-nav.fp-show-active a.active+.fp-tooltip,#fp-nav ul li:hover .fp-tooltip{-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:auto;opacity:1}#fp-nav ul li .fp-tooltip.fp-right{right:20px}#fp-nav ul li .fp-tooltip.fp-left{left:20px}.fp-auto-height.fp-section,.fp-auto-height .fp-slide,.fp-auto-height .fp-tableCell,.fp-responsive .fp-auto-height-responsive.fp-section,.fp-responsive .fp-auto-height-responsive .fp-slide,.fp-responsive .fp-auto-height-responsive .fp-tableCell{height:auto!important}.fp-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}</style><link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/vendors.css" class="next-head"><link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/main.css?v=1771327133328" class="next-head"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.4.2/css/all.css" integrity="sha384-blOohCVdhjmtROpu8+CfTnUWham9nkX7P7OZQMst+RUnhtoY/9qemFAkIKOYxDI3" crossorigin="anonymous" class="next-head"><script charset="utf-8" src="https://www.ariston.com/_next/static/chunks/02ed.9ad588e651db1a7105b4.js"></script><link href="https://www.ariston.com/landing/sconto-termico/css/style42.css" media="screen" rel="stylesheet" data-react-helmet="true"><script src="https://www.ariston.com/landing/sconto-termico/js/sconto-termico9.js" data-react-helmet="true"></script></head>

<body class="locale-it-it KL-D-2 KL-LANG-it KL-P_URL_1-it-it KL-URL-sconto-termico KL-URL-LEVEL-2 KL-CMS_URL-LEVEL-2 KL-UA-DESKTOP sp-CONTENT">

<div id="__next"><div class="boxedContainer"><div><div id="contotermico">

<section class="fm-Sei-Un-Professionista has-text-centered">Sei un professionista? <a href="https://www.ariston.com/it-it/formula-plus-professionisti">Scopri i vantaggi dedicati a te</a></section>

<section class="fm hero is-halfheight is-fluid mainContent">

<div class="hero-body">

<div class="hero-content">

<p class="title"><strong>(S)CONTO TERMICO</strong> CON ARISTON RINNOVAREIL COMFORT DI CASA CONVIENE.</p>

</div>

<div class="hero-image"><img src="https://www.ariston.com/landing/sconto-termico/images/chiamaci.png" class="loaded" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--1"></div>

</div>

</section>

<section class="fm-Content">

<section class="fm-Cose mainContent">

<h1>Sostituisci il tuo vecchio impianto con uno Ariston per ottenere massimo comfort e massima convenienza grazie al servizio (S)Conto Termico.</h1>

<p class="has-text-centered">Grazie all'innovativo servizio (S)Conto Termico, affidandoti ad un installatore Ariston, potrai usufruire di una consulenza su misura per rinnovare il comfort di casa beneficiando dell'Incentivo Conto Termico.</p>

<p>Il Conto Termico è un contributo economico, erogato dal Gestore dei Servizi Energetici (GSE), <strong>per incentivare interventi di riqualificazione energetica</strong>.</p>

<p><strong>L'installatore Ariston gestirà per te la pratica<sup>1</sup></strong> per l'ottenimento dell’incentivo in totale sicurezza e semplicità. E con il <strong>mandato irrevocabile all'incasso</strong>, potrai ottenere uno <strong>sconto immediato</strong>.</p>

</section>

<section class="fm-Come-Funziona box mainContent hidden">

<div class="has-text-centered">

<h2>COME FUNZIONA</h2>

<div class="container section">

<div class="content-tab">

<p>Esempio: valore fattura 1.600€ IVA inclusa per uno scaldacqua a pompa di calore Ariston</p>

<img class="is-hidden-mobile loaded" src="https://www.ariston.com/landing/sconto-termico/images/come-funziona-conto-termico.png" alt="=COME FUNZIONA" data-was-processed="true"> <img class="is-hidden-desktop is-hidden-tablet" src="https://www.ariston.com/landing/sconto-termico/images/come-funziona-conto-termico-mobile.png" alt="=COME FUNZIONA"></div>

</div>

</div>

</section>

<section class="fm-Come-Accedere has-text-centered">

<h2>CON ARISTON ACCEDERE A (S)CONTO TERMICO È PIÙ SEMPLICE!</h2>

<div class="box">

<div class="box-content">

<p class="titolo">1</p>

<p class="titolo">Consulta un professionista Ariston per individuare la soluzione giusta per te</p>

</div>

</div>

<div class="box">

<div class="box-content">

<p class="titolo">2</p>

<p class="titolo">Seleziona e acquista il prodotto Ariston adatto alle tue esigenze tra quelli incentivati:</p>

</div>

<div class="columns is-full is-mobile">

<div class="column has-text-centered">

<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-pompe-di-calore.png" alt="=POMPE DI CALORE" class="loading" data-was-processed="true"></div>

<p class="has-text-centered">POMPE DI CALORE</p>

</div>

<div class="column has-text-centered">

<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-sistemi-ibridi.png" alt="=SISTEMI IBRIDI" class="loading" data-was-processed="true"></div>

<p class="has-text-centered">SISTEMI IBRIDI</p>

</div>

<div class="column has-text-centered">

<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-scaldacqua.png" alt="=SCALDACQUA A POMPA DI CALORE" class="loading" data-was-processed="true"></div>

<p class="has-text-centered">SCALDACQUA A POMPA DI CALORE</p>

</div>

<div class="column has-text-centered">

<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-climatizzatori.png" alt="=CLIMATIZZATORI" class="loading" data-was-processed="true"></div>

<p class="has-text-centered">CLIMATIZZATORI</p>

</div>

<div class="column has-text-centered">

<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-pannelli-solari.png" alt="=PANNELLI SOLARI" class="loading" data-was-processed="true"></div>

<p class="has-text-centered">PANNELLI SOLARI</p>

</div>

</div>

</div>

<div class="box">

<div class="box-content">

<p class="titolo">3</p>

<p class="titolo">Grazie a (S)Conto Termico ottieni uno sconto immediato<sup>3</sup> fino al 65%</p>

</div>

</div>

<div class="box box-inverted">

<div class="box-content">

<p class="titolo"><img src="https://www.ariston.com/landing/sconto-termico/images/icon-plus.png" width="24" height="24" class="loading" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--2"></p>

<p class="titolo">In aggiunta per te la possibilità di accedere ad un finanziamento su misura con Fiditalia per l’acquisto di un prodotto Ariston.</p>

</div>

</div>

</section>

</section>

<section class="talkwithariston ">

<h3 class="is-darkGrey">CONTATTA ARISTON</h3>

<div class="talkwithariston-container">

<div class="talkwithariston-column"><span class="is-not-uppercase title-xl aristonRed">Chiama i nostri operatori</span>

<p>Dal Lunedì alla Domenica dalle 08.00 alle 20.00 (esclusi i giorni di festività) al seguente numero di telefono verde:</p>

<a class="gtm-callcenter-cta link-button numero-verde" title="800 220 055" href="tel:800 220 055" target="" rel="noopener" type="button"><img src="https://www.ariston.com/landing/sconto-termico/images/icon-telefono.png" class="loaded" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--3"> 800 220 055</a></div>

</div>

</section>

<section class="fm-Cose appendice">

<p class="smaller">1 - Il servizio è a pagamento e varia in base al prodotto installato. Per maggiori informazioni consulta l'installatore Ariston.</p>

<p class="smaller">2 - Messaggio pubblicitario con finalità promozionale. Per le condizioni contrattuali si veda il documento “IEBCC” presso i Punti vendita aderenti all'iniziativa. Ariston SpA opera quale intermediario del credito in regime di non esclusiva con Fiditalia. La valutazione del merito creditizio è soggetta all'approvazione di Fiditalia SpA.</p>

<p class="smaller">3 - In caso di mandato irrevocabile all’incasso. Senza mandato irrevocabile all’incasso, paghi immediatamente l’intero importo e ricevi un rimborso dal GSE in 90 giorni.</p>

</section>

</div></div></div></div>

<script async="" id="__NEXT_PAGE__/default" src="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/default.js"></script>

<script async="" id="__NEXT_PAGE__/_app" src="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/_app.js"></script>

<script src="https://www.ariston.com/_next/static/runtime/webpack-4ea8b5295b6d613200bb.js" async=""></script>

<script src="https://www.ariston.com/_next/static/chunks/commons.12566168a0b389f7d59c.js" async=""></script>

<script src="https://www.ariston.com/_next/static/runtime/main-2f6b578326f8b87de07d.js" async=""></script>

<script>// Generic Alt Text Setter Script

// Sets alt text for any remaining images/SVGs without alt text using ariston-*h1*-*number* pattern

(function() {

'use strict';

let consecutiveResults = [];

let intervalId;

let observerActive = false;

let imageCounter = 1;

// Configuration

const CONFIG = {

checkInterval: 1000, // Check every second

requiredConsecutiveResults: 5, // Stop after 5 consecutive same results

debug: false // Set to false to disable console logging

};

// Logging function

function log(message, type = 'info') {

if (!CONFIG.debug) return;

const timestamp = new Date().toLocaleTimeString();

const prefix = `[${timestamp}] Generic Alt Setter:`;

switch(type) {

case 'error':

console.error(prefix, message);

break;

case 'warn':

console.warn(prefix, message);

break;

case 'success':

console.log(`%c${prefix} ${message}`, 'color: blue; font-weight: bold;');

break;

default:

console.log(prefix, message);

}

}

// Get the main heading text from the page

function getMainHeading() {

// Try to find h1 first, then h2, then h3

const h1 = document.querySelector('h1');

if (h1 && h1.textContent.trim()) {

return h1.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');

}

const h2 = document.querySelector('h2');

if (h2 && h2.textContent.trim()) {

return h2.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');

}

const h3 = document.querySelector('h3');

if (h3 && h3.textContent.trim()) {

return h3.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');

}

// Fallback to page title or generic

const title = document.title;

if (title && title.trim()) {

return title.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');

}

return 'page';

}

// Generate alt text using the ariston-*h1*-*number* pattern

function generateAltText(element, index) {

const heading = getMainHeading();

const elementType = element.tagName.toLowerCase();

// Create the pattern: ariston-[heading]-[number]

return `ariston-${heading}-${imageCounter++}`;

}

// Check if element already has alt text or aria-label

function hasAltText(element) {

const alt = element.getAttribute('alt');

const ariaLabel = element.getAttribute('aria-label');

return (alt && alt.trim() !== '') || (ariaLabel && ariaLabel.trim() !== '');

}

// Check if element should be excluded (decorative, hidden, etc.)

function shouldExclude(element) {

// Skip hidden elements

const style = window.getComputedStyle(element);

if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {

return true;

}

// Skip elements with aria-hidden="true"

if (element.getAttribute('aria-hidden') === 'true') {

return true;

}

// Skip elements with role="presentation" or role="none"

const role = element.getAttribute('role');

if (role === 'presentation' || role === 'none') {

return true;

}

// Skip very small images (likely decorative)

if (element.tagName.toLowerCase() === 'img') {

const width = element.naturalWidth || element.width || 0;

const height = element.naturalHeight || element.height || 0;

if (width <= 1 || height <= 1) {

return true;

}

}

return false;

}

// Process individual image or SVG

function processElement(element, index) {

let altTextSet = false;

let reason = '';

try {

// Skip if element already has alt text

if (hasAltText(element)) {

return { processed: false, reason: 'Already has alt text or aria-label', altText: element.getAttribute('alt') || element.getAttribute('aria-label') };

}

// Skip if element should be excluded

if (shouldExclude(element)) {

return { processed: false, reason: 'Excluded (decorative, hidden, or too small)' };

}

// Generate and set alt text

const altText = generateAltText(element, index);

if (element.tagName.toLowerCase() === 'svg') {

// For SVG, prefer aria-label over alt

element.setAttribute('aria-label', altText);

} else {

// For IMG, use alt attribute

element.setAttribute('alt', altText);

}

altTextSet = true;

reason = `Generated alt text using ariston pattern`;

log(`${element.tagName} ${index + 1}: Set ${element.tagName.toLowerCase() === 'svg' ? 'aria-label' : 'alt'}="${altText}" - ${reason}`, 'success');

} catch (error) {

log(`Error processing ${element.tagName.toLowerCase()} ${index + 1}: ${error.message}`, 'error');

reason = `error: ${error.message}`;

}

return {

processed: altTextSet,

reason: reason,

altText: altTextSet ? (element.getAttribute('alt') || element.getAttribute('aria-label')) : null

};

}

// Main function to process all images and SVGs

function processAllElements() {

const elements = document.querySelectorAll('img, svg');

let processedCount = 0;

let candidateElements = 0; // Elements that need alt text

let totalElements = elements.length;

log(`Found ${totalElements} images and SVGs on page`);

if (totalElements === 0) {

return { processed: 0, candidates: 0 };

}

elements.forEach((element, index) => {

// Check if element needs alt text

const needsAltText = !hasAltText(element) && !shouldExclude(element);

if (needsAltText) {

candidateElements++;

const result = processElement(element, index);

if (result.processed) {

processedCount++;

}

if (CONFIG.debug && !result.processed) {

log(`${element.tagName} ${index + 1}: Not processed - ${result.reason}`);

}

}

});

log(`Processed ${processedCount} out of ${candidateElements} candidate elements (${totalElements} total elements)`);

return { processed: processedCount, candidates: candidateElements };

}

// Check if we should stop based on consecutive results

function shouldStop(result) {

const currentCandidates = result.candidates;

const currentProcessed = result.processed;

consecutiveResults.push(currentCandidates);

// Keep only the last 'requiredConsecutiveResults' results

if (consecutiveResults.length > CONFIG.requiredConsecutiveResults) {

consecutiveResults.shift();

}

// Check if we have enough consecutive results

if (consecutiveResults.length === CONFIG.requiredConsecutiveResults) {

const firstResult = consecutiveResults[0];

const allSame = consecutiveResults.every(result => result === firstResult);

// Stop if we have consistent results and no new processing

if (allSame && currentProcessed === 0) {

if (firstResult === 0) {

log(`Stopping: No candidate elements found for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');

} else {

log(`Stopping: Found ${firstResult} candidate elements with 0 new processed for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');

}

return true;

}

}

return false;

}

// Main checking function

function runCheck() {

log('Running generic alt text check...');

const result = processAllElements();

log(`Check result: ${result.processed} elements processed, ${result.candidates} candidates found`);

if (shouldStop(result)) {

stopMonitoring();

log('Generic monitoring stopped - consistent results achieved', 'success');

}

}

// Start monitoring function

function startMonitoring() {

if (intervalId) {

log('Generic monitoring already active');

return;

}

log('Starting generic alt text monitoring...', 'success');

log(`Configuration: Check every ${CONFIG.checkInterval}ms, stop after ${CONFIG.requiredConsecutiveResults} consecutive same results`);

// Reset state

consecutiveResults = [];

imageCounter = 1; // Reset counter

// Run initial check

runCheck();

// Set up interval for continuous checking

intervalId = setInterval(runCheck, CONFIG.checkInterval);

// Set up MutationObserver to detect DOM changes

if (!observerActive && window.MutationObserver) {

const observer = new MutationObserver((mutations) => {

let hasElementChanges = false;

mutations.forEach((mutation) => {

if (mutation.type === 'childList') {

mutation.addedNodes.forEach((node) => {

if (node.nodeType === Node.ELEMENT_NODE) {

if (node.tagName === 'IMG' || node.tagName === 'SVG' || node.querySelector('img, svg')) {

hasElementChanges = true;

}

}

});

}

});

if (hasElementChanges) {

log('DOM changes detected with new images/SVGs');

// Reset consecutive results when DOM changes

consecutiveResults = [];

}

});

observer.observe(document.body, {

childList: true,

subtree: true

});

observerActive = true;

log('MutationObserver activated for generic alt text');

}

}

// Stop monitoring function

function stopMonitoring() {

if (intervalId) {

clearInterval(intervalId);

intervalId = null;

log('Generic monitoring stopped', 'success');

}

}

// Expose control functions to global scope for manual control

window.genericAltTextSetter = {

start: startMonitoring,

stop: stopMonitoring,

runOnce: () => processAllElements(),

getStatus: () => ({

active: !!intervalId,

consecutiveResults: [...consecutiveResults],

currentCounter: imageCounter,

config: { ...CONFIG }

}),

setCounter: (newCounter) => {

imageCounter = newCounter;

log(`Counter reset to ${newCounter}`);

}

};

// Auto-start when DOM is ready (with a slight delay to let specific script run first)

if (document.readyState === 'loading') {

document.addEventListener('DOMContentLoaded', () => {

setTimeout(startMonitoring, 2000); // Wait 2 seconds after DOM ready

});

} else {

// DOM is already ready

setTimeout(startMonitoring, 2000); // Wait 2 seconds

}

log('Generic Alt Text Setter script loaded successfully', 'success');

log('Use window.genericAltTextSetter.start(), .stop(), .runOnce(), .setCounter(n), or .getStatus() for manual control');

})();</script>

<script>// Image Alt Text Auto-Setter Script

// Continuously monitors and sets alt text for images based on specific parent conditions

(function() {

'use strict';

let consecutiveResults = [];

let intervalId;

let observerActive = false;

// Configuration

const CONFIG = {

checkInterval: 1000, // Check every second

requiredConsecutiveResults: 5, // Stop after 5 consecutive same results

debug: false // Set to false to disable console logging

};

// Logging function

function log(message, type = 'info') {

if (!CONFIG.debug) return;

const timestamp = new Date().toLocaleTimeString();

const prefix = `[${timestamp}] Alt Text Setter:`;

switch(type) {

case 'error':

console.error(prefix, message);

break;

case 'warn':

console.warn(prefix, message);

break;

case 'success':

console.log(`%c${prefix} ${message}`, 'color: green; font-weight: bold;');

break;

default:

console.log(prefix, message);

}

}

// Check if element has specific class

function hasClass(element, className) {

return element && element.classList && element.classList.contains(className);

}

// Get ancestor element by tag name

function getAncestorByTag(element, tagName, maxLevels = 10) {

let current = element.parentElement;

let level = 0;

while (current && level < maxLevels) {

if (current.tagName && current.tagName.toLowerCase() === tagName.toLowerCase()) {

return current;

}

current = current.parentElement;

level++;

}

return null;

}

// Get parent with specific class

function getParentWithClass(element, className, maxLevels = 10) {

let current = element.parentElement;

let level = 0;

while (current && level < maxLevels) {

if (hasClass(current, className)) {

return current;

}

current = current.parentElement;

level++;

}

return null;

}

// Get second parent (grandparent)

function getSecondParent(element) {

return element.parentElement && element.parentElement.parentElement;

}

// Process individual image

function processImage(img, index) {

let altTextSet = false;

let reason = '';

// Skip if image already has alt text

if (img.getAttribute('alt') && img.getAttribute('alt').trim() !== '') {

return { processed: false, reason: 'Already has alt text', altText: img.getAttribute('alt') };

}

try {

// Case 1: Image has class "trigger-banner-image"

if (hasClass(img, 'trigger-banner-image')) {

img.setAttribute('alt', 'background-banner-image');

altTextSet = true;

reason = 'trigger-banner-image class detected';

log(`Image ${index + 1}: Set alt="background-banner-image" - ${reason}`, 'success');

}

// Case 2: Image has parent with class "mega-menu__col"

else if (getParentWithClass(img, 'mega-menu__col')) {

img.setAttribute('alt', 'menu-background-image');

altTextSet = true;

reason = 'parent with mega-menu__col class detected';

log(`Image ${index + 1}: Set alt="menu-background-image" - ${reason}`, 'success');

}

// Case 3: Image has anchor as second parent

else {

const secondParent = getSecondParent(img);

if (secondParent && secondParent.tagName && secondParent.tagName.toLowerCase() === 'a') {

const titleAttr = secondParent.getAttribute('title');

if (titleAttr && titleAttr.trim() !== '') {

img.setAttribute('alt', titleAttr.trim());

altTextSet = true;

reason = `anchor second parent with title="${titleAttr}"`;

log(`Image ${index + 1}: Set alt="${titleAttr}" - ${reason}`, 'success');

} else {

reason = 'anchor second parent found but no title attribute';

log(`Image ${index + 1}: ${reason}`, 'warn');

}

} else {

reason = 'no matching conditions found';

}

}

} catch (error) {

log(`Error processing image ${index + 1}: ${error.message}`, 'error');

reason = `error: ${error.message}`;

}

return {

processed: altTextSet,

reason: reason,

altText: altTextSet ? img.getAttribute('alt') : null

};

}

// Main function to process all images

function processAllImages() {

const images = document.querySelectorAll('img');

let processedCount = 0;

let candidateImages = 0; // Images that match our criteria

let totalImages = images.length;

log(`Found ${totalImages} images on page`);

if (totalImages === 0) {

return { processed: 0, candidates: 0 };

}

images.forEach((img, index) => {

// Check if image matches any of our criteria first

const matchesCriteria = hasClass(img, 'trigger-banner-image') ||

getParentWithClass(img, 'mega-menu__col') ||

(getSecondParent(img) && getSecondParent(img).tagName && getSecondParent(img).tagName.toLowerCase() === 'a');

if (matchesCriteria) {

candidateImages++;

const result = processImage(img, index);

if (result.processed) {

processedCount++;

}

if (CONFIG.debug && !result.processed && result.reason !== 'Already has alt text') {

log(`Image ${index + 1}: Not processed - ${result.reason}`);

}

}

});

log(`Processed ${processedCount} out of ${candidateImages} candidate images (${totalImages} total images)`);

return { processed: processedCount, candidates: candidateImages };

}

// Check if we should stop based on consecutive results

function shouldStop(result) {

const currentCandidates = result.candidates;

const currentProcessed = result.processed;

consecutiveResults.push(currentCandidates);

// Keep only the last 'requiredConsecutiveResults' results

if (consecutiveResults.length > CONFIG.requiredConsecutiveResults) {

consecutiveResults.shift();

}

// Check if we have enough consecutive results and they're all the same non-zero value

if (consecutiveResults.length === CONFIG.requiredConsecutiveResults) {

const firstResult = consecutiveResults[0];

const allSame = consecutiveResults.every(result => result === firstResult);

const isNonZero = firstResult > 0;

if (allSame && isNonZero && currentProcessed === 0) {

log(`Stopping: Found ${firstResult} candidate images with 0 new processed for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');

return true;

}

}

return false;

}

// Main checking function

function runCheck() {

log('Running image alt text check...');

const result = processAllImages();

log(`Check result: ${result.processed} images processed, ${result.candidates} candidates found`);

if (shouldStop(result)) {

stopMonitoring();

log('Monitoring stopped - consistent results achieved', 'success');

}

}

// Start monitoring function

function startMonitoring() {

if (intervalId) {

log('Monitoring already active');

return;

}

log('Starting image alt text monitoring...', 'success');

log(`Configuration: Check every ${CONFIG.checkInterval}ms, stop after ${CONFIG.requiredConsecutiveResults} consecutive same results`);

// Reset state

consecutiveResults = [];

// Run initial check

runCheck();

// Set up interval for continuous checking

intervalId = setInterval(runCheck, CONFIG.checkInterval);

// Set up MutationObserver to detect DOM changes

if (!observerActive && window.MutationObserver) {

const observer = new MutationObserver((mutations) => {

let hasImageChanges = false;

mutations.forEach((mutation) => {

if (mutation.type === 'childList') {

mutation.addedNodes.forEach((node) => {

if (node.nodeType === Node.ELEMENT_NODE) {

if (node.tagName === 'IMG' || node.querySelector('img')) {

hasImageChanges = true;

}

}

});

}

});

if (hasImageChanges) {

log('DOM changes detected with new images');

// Reset consecutive results when DOM changes

consecutiveResults = [];

}

});

observer.observe(document.body, {

childList: true,

subtree: true

});

observerActive = true;

log('MutationObserver activated');

}

}

// Stop monitoring function

function stopMonitoring() {

if (intervalId) {

clearInterval(intervalId);

intervalId = null;

log('Monitoring stopped', 'success');

}

}

// Expose control functions to global scope for manual control

window.imageAltTextSetter = {

start: startMonitoring,

stop: stopMonitoring,

runOnce: () => processAllImages(),

getStatus: () => ({

active: !!intervalId,

consecutiveResults: [...consecutiveResults],

config: { ...CONFIG }

})

};

// Auto-start when DOM is ready

if (document.readyState === 'loading') {

document.addEventListener('DOMContentLoaded', startMonitoring);

} else {

// DOM is already ready

startMonitoring();

}

log('Image Alt Text Setter script loaded successfully', 'success');

log('Use window.imageAltTextSetter.start(), .stop(), .runOnce(), or .getStatus() for manual control');

})();</script>

<script type="text/javascript">

var _paq = window._paq = window._paq || [];

// tracker methods like "setCustomDimension" should be called before "trackPageView"

_paq.push(["trackPageView"]);

_paq.push(["enableLinkTracking"]);

(function () {

var u = "https://matomo-italia1.kleecks-stats.com/";

_paq.push(["setTrackerUrl", u + "matomo.php"]);

_paq.push(["setSiteId", "www-ariston-com"]);

var d = document, g = d.createElement("script"), s = d.getElementsByTagName("script")[0];

g.type = "text/javascript"; g.async = true; g.src = u + "matomo.js"; s.parentNode.insertBefore(g, s);

})();

</script>

<noscript>

<p><img src="https://matomo-italia1.kleecks-stats.com/matomo.php?idsite=www-ariston-com&amp;rec=1" style="border:0;" alt=""></p>

</noscript>

<div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><style>.hero-body, .section {padding: 0;}.footer{padding:0;}#contotermico{top:0;}.pre-footer-overlay span{font-size:16px;}a.announcement-banner-link:hover{color: inherit;font-weight: 600;}</style></body></html>