/* * Copyright (c) 2024 Flerosoft (https://flerosoft.com) * Software Name: Cookie Notice Pro - jQuery Plugin * Product Page : https://cookienoticepro.flerosoft.com * Documentation: https://cookienoticepro.flerosoft.com/docs * Description: Cookie Notice Pro, a lightweight jQuery plugin, helps you to comply with GDPR. Make your own cookie information popup in minutes. * Changelog: https://cookienoticepro.flerosoft.com/docs/getting-started#item-1-4 */ (function ($) { 'use strict' const settingsIcon = ''; const cookieIcon = ' '; const closeIcon = ''; /* *-------------------------------------------------------------------------- * CONFIG OR SETTINGS - Customize the popup banner START *-------------------------------------------------------------------------- */ const config = { themeSettings: { primaryColor: "#000", // Primary Color of Popup Banner darkColor: "#3b3e4a", // Dark Theme Color lightColor: "#ffffff", // Light Theme Color themeMode: "light", // Theme Mode (light|dark) }, enableGoogleConsentMode: true, // Add support for Google consent mode v2 (https://cookiebannergenerator.com/implementing-google-consent-mode-v2-with-cookie-notice-pro-a-step-by-step-guide/) enableMinimize: true, // Enable minimized floating cookie icon to adjust preferences showCookieIcon: true, // Hide or show the cookie icon showSettingsBtn: true, // Hide or show the preference settings(true|false) showCloseIcon: false, // Hide or show the popup close icon(true|false) showDeclineBtn: true, // Hide or show the cookie decline button(true|false) fullWidth: false, // Full width popup works only when "displayPosition" is set to top/bottom allCheckboxesChecked: true, // The setting checkboxes should be checked by default initially or not(true|false) displayPosition: "bottom", // Where popup should appear(top|right|bottom|left) settingsBtnLabel: "Adatta", // Text of settings button delay: 1, // After how much time should popup appear(2000 is equal to 2 seconds) expires: 365, // Expiry date of cookie(365 is equal to 365 days) title: "Apprezziamo la privacy degli utenti", // Title of popup bannner description: "Utilizziamo i cookie per migliorare la qualità della navigazione, mostrare pubblicità o contenuti personalizzati alle esigenze individuali degli utenti e analizzare il traffico sul sito. Cliccare sul pulsante 'Accetta tutto' implica il consenso all'utilizzo dei cookie da parte nostra.", // Message acceptBtnLabel: "Accetta", // Accept cookie button text declineInfoBtnLabel: "Rifiuta", // Decline cookie button text moreInfoBtnLink: "/informativa-sulla-privacy", // Learn more link(default: privacy policy page) moreInfoBtnLabel: "Informativa sulla privacy", // More info link text cookieTypesTitle: "Scegli i file cookie da accettare", // Title of cookie preference options necessaryCookieTypeLabel: "Necessario", // Label text of Necessary cookie item floatingIconTooltip: "Adatta", // Tooltip of floating cookie icon (Minimized) necessaryCookieTypeDesc: "Questi cookie sono essenziali per il funzionamento del sito web e non possono essere disattivati nei nostri sistemi.", // Hover text of necessary cookies onConsentAccept: ()=> { // It will inject scripts in head if cookie preferences menu(showSettingsBtn) is enabled console.log("Consent accepted!") }, onConsentReject: ()=> { // This code will run on cookie reject/decline console.log("Consent Rejected!"); }, cookieTypes: [ // Cookie types, value and description (Cookie Preferences Selection) { type: "Funzionali", value: "preferences", // WARNING: DO NOT EDIT THIS VALUE description: "I cookie essenziali sono fondamentali per le funzioni di base del sito web e il sito non funzionerà correttamente senza di essi. Questi cookie non memorizzano alcun dato che possa identificare una persona.", }, { type: "Pubblicità", value: "marketing", // WARNING: DO NOT EDIT THIS VALUE description: "I cookie pubblicitari sono utilizzati per fornire agli utenti annunci personalizzati basati sulle pagine che hanno visitato in precedenza e per analizzare l'efficacia delle campagne pubblicitarie.", }, { type: "Analitici", value: "analytics", // WARNING: DO NOT EDIT THIS VALUE description: "I cookie analitici servono a capire come gli utenti interagiscono con il sito web. Questi cookie aiutano a fornire informazioni sulle metriche di visitatori, il tasso di rimbalzo, la fonte del traffico, ecc.", }, ], }; /* *-------------------------------------------------------------------------- * CONFIG OR SETTINGS - Customize the popup banner END *-------------------------------------------------------------------------- */ const COOKIE_CONSENT = "cnp_consent"; // WARNING: DO NOT EDIT THIS VALUE const COOKIE_CONSENT_PREFS = "cnp_prefs"; // WARNING: DO NOT EDIT THIS VALUE const GOOGLE_CONSENT_MODE_AD_PREFS = "cnp_gconsent_ad_prefs" // WARNING: DO NOT EDIT THIS VALUE const GOOGLE_CONSENT_MODE_ANALYTICS_STORAGE = "cnp_gconsent_analytics_storage" // WARNING: DO NOT EDIT THIS VALUE $.fn.cookieNoticePro = (event) => { changeRootVariables(); let cookieConsentExists = cookieExists(COOKIE_CONSENT); let cookiePrefsValue = accessCookie(COOKIE_CONSENT_PREFS); if ( !cookieConsentExists) { // add layer to the body below cookies to prevent click $('body').append(''); } // If consent is not accepted if (!cookieConsentExists || event == "open") { $("#cookieNoticePro").remove(); $("#cookieMinimizeIcon").remove(); let cookieTypes='
  • "; const preferences = JSON.parse(cookiePrefsValue); $.each(config.cookieTypes, (index, field) => { if (field.type !== "" && field.value !== "") { let cookieTypeDescription = ""; if (field.description !== false) { cookieTypeDescription = ' title="' + field.description + '"'; } cookieTypes+='
  • "; } }); let cookieNotice='
    '+ closeIcon +'
    '+cookieIcon+"

    "+config.title+'

    '+config.description+' '+config.moreInfoBtnLabel+'

    '+settingsIcon+config.settingsBtnLabel+'
    "; setTimeout(() => { $("body").append(cookieNotice); $("#cookieNoticePro").hide().fadeIn("slow", () => { if(event == "open") { $("#cookieSettings").trigger("click"); $.each(preferences, (index, field) => { $("input#gdprPrefItem" + field).prop("checked", true); }); } }); if(!config.showSettingsBtn) { $("#cookieNoticePro #cookieSettings").hide(); } if(!config.showDeclineBtn) { $("#cookieNoticePro #cookieReject").hide(); } if(!config.showCookieIcon) { $("#cookieNoticePro #cookieIcon").hide(); } if(!config.showCloseIcon) { $("#cookieNoticePro #closeIcon").hide(); } }, event === "open" ? 0 : config.delay); $("body").on("click", "#cookieAccept", () => { hideCookieBanner(true, config.expires); $('input[name="gdprPrefItem"][data-compulsory="on"]').prop("checked", true); let prefs = []; $.each($('input[name="gdprPrefItem"]').serializeArray(), (i, field) => { prefs.push(field.value); }); createCookie(COOKIE_CONSENT_PREFS, encodeURIComponent(JSON.stringify(prefs)), { expires: daysToUTC(365), path: "/" }); config.onConsentAccept.call(this); config.showSettingsBtn? injectScripts() : null; if(config.enableGoogleConsentMode) { googleConsentModeHandler(); } }); $("body").on("click", "#cookieSettings", () => { if(event === "open"){ $('input[name="gdprPrefItem"]:not(:disabled)').attr("data-compulsory", "off").prop("checked", false); $("#cookieTypes").slideDown("fast", function () { $("#cookieSettings").prop("disabled", true); }); } else { $('input[name="gdprPrefItem"]:not(:disabled)').attr("data-compulsory", "off").prop("checked", config.allCheckboxesChecked); $("#cookieTypes").toggle("fast", function () { $("#cookieSettings").prop("disabled", false); }); } }); $("body").on("click", "#closeIcon", () => { $("#cookieNoticePro").remove(); }); $("body").on("click", "#cookieReject", () => { hideCookieBanner(false, config.expires); config.onConsentReject.call(this); // Delete prefs cookie from brower on reject createCookie(COOKIE_CONSENT_PREFS, "", { expires: daysToUTC(-365), path: "/" }); }); } // If already consent is accepted, inject preferences else { if(config.showSettingsBtn) { injectScripts(); } if(config.enableMinimize){ minimizeCookieBanner(); } if(config.enableGoogleConsentMode) { googleConsentModeHandler(); } } }; /** * Check if cookie exists * @param {string} cookieName */ const cookieExists = (cookieName) => { if(document.cookie.indexOf(cookieName) > -1){ return true; } return false; }; /** * Create the cookie and hide the banner * @param {string} value * @param {string} expiryDays */ const hideCookieBanner = (value, expiryDays) => { createCookie(COOKIE_CONSENT, value, { expires: daysToUTC(expiryDays), path: "/", }); $("#cookieNoticePro").fadeOut("fast", () => { $('body').off('click', "#cookieSettings"); $('body').off('click', "#cookieReject"); $('body').off('click', "#closeIcon"); $('body').off('click', "#cookieAccept"); $(this).remove(); }); if(config.enableMinimize) { minimizeCookieBanner(); } }; /** * Minimize the cookie banner and show a minimized icon. */ const minimizeCookieBanner = () => { $( '#cookie-layer' ).remove(); // Remove any existing minimize icon before appending a new one. $('#cookieMinimizeIcon').remove(); // Minimize the banner and show an icon instead. let minimizeIcon = $('
    ' + cookieIcon + '
    '+ config.floatingIconTooltip +'
    '); $('body').append(minimizeIcon); // Define the click behavior for the minimize icon. $('#cookieMinimizeIcon').on('click', function() { if ($(this).hasClass('zoomIn')) { $(this).removeClass('zoomIn').addClass('zoomOut'); setTimeout(() => { $.fn.cookieNoticePro("open"); // Reopen the cookie notice }, 200); // Match the timeout to the animation duration } else { $(this).removeClass('zoomOut').addClass('zoomIn'); } }); }; /** * Set Cookie * @param {string} name - Cookie Name * @param {string} value - Cookie Value * @param {string} expiryDays - Expiry Date of cookie */ const createCookie = (name, value, options={})=> { document.cookie = `${name}=${value}${ Object.keys(options) .reduce((acc, key) => { return acc + `;${key.replace(/([A-Z])/g, $1 => '-' + $1.toLowerCase())}=${ options[key]}`; }, '') }`; }; /** * Converts Days Into UTC String * @param {number} days - Name of the cookie * @return {string} UTC date string */ const daysToUTC = (days) => { const newDate = new Date(); newDate.setTime(newDate.getTime() + days * 24 * 60 * 60 * 1000); return newDate.toUTCString(); }; /** * Get Cookie By Name * @param {string} name - Name of the cookie * @return {string(number|Array)} Value of the cookie */ const accessCookie = (name) => { const cookies = document.cookie.split(";").reduce((acc, cookieString) => { const [key, value] = cookieString.split("=").map((s) => s.trim()); if (key && value) { acc[key] = decodeURIComponent(value); } return acc; }, {}); return name ? cookies[name] || false : cookies; }; /** * Updates Google Consent Mode based on user consent and preferences. */ const googleConsentModeHandler = () => { if(!config.enableGoogleConsentMode) return; const consent = JSON.parse(accessCookie(COOKIE_CONSENT)); const preferences = JSON.parse(accessCookie(COOKIE_CONSENT_PREFS)); const googleConsentAnalyticsStorage = JSON.parse(accessCookie(GOOGLE_CONSENT_MODE_ANALYTICS_STORAGE)); const googleConsentAdPrefs = JSON.parse(accessCookie(GOOGLE_CONSENT_MODE_AD_PREFS)); try { if(consent === true) { // if analytics is accepted if(preferences.indexOf("analytics") > -1) { if(!googleConsentAnalyticsStorage) { createCookie(GOOGLE_CONSENT_MODE_ANALYTICS_STORAGE, encodeURIComponent(true), { expires: daysToUTC(365), path: "/" }); gtag('consent', 'update', { 'analytics_storage': 'granted' }); } } else { if(googleConsentAnalyticsStorage === true) { gtag('consent', 'update', { 'analytics_storage': 'denied' }); createCookie(GOOGLE_CONSENT_MODE_ANALYTICS_STORAGE, "", { expires: daysToUTC(-365), path: "/" }); } } // if marketing or advertising is accepted if( preferences.indexOf("marketing") > -1) { if(!googleConsentAdPrefs) { createCookie(GOOGLE_CONSENT_MODE_AD_PREFS, encodeURIComponent(true), { expires: daysToUTC(365), path: "/" }); gtag('consent', 'update', { 'ad_storage': 'granted', 'ad_user_data': 'granted', 'ad_personalization': 'granted' }); } } else { if(googleConsentAdPrefs === true) { gtag('consent', 'update', { 'ad_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied' }); createCookie(GOOGLE_CONSENT_MODE_AD_PREFS, "", { expires: daysToUTC(-365), path: "/" }); } } } } catch (error) { console.warn("CookieNoticePro: Error initializing Google Consent Mode. Ensure gtag.js is correctly installed:", error); } } const changeRootVariables = () =>{ $(':root').css('--cookieNoticeProLight', config.themeSettings.lightColor); $(':root').css('--cookieNoticeProDark', config.themeSettings.darkColor); } return window.cookieNoticePro = { init:()=>{ $.fn.cookieNoticePro(); }, /** * Reopens the cookie notice banner */ reinit:()=>{ $.fn.cookieNoticePro("open"); }, /** * Returns true if consent is given else false */ isAccepted: ()=>{ let consent = accessCookie(COOKIE_CONSENT); return JSON.parse(consent); }, /** * Returns the value of the cookieConsentPrefs cookie */ getPreferences: ()=>{ let preferences = accessCookie(COOKIE_CONSENT_PREFS); return JSON.parse(preferences); }, /** * Check if a particular preference is accepted * @param {string} cookieName */ isPreferenceAccepted: (cookieTypeValue)=>{ let consent = JSON.parse(accessCookie(COOKIE_CONSENT)); let preferences = accessCookie(COOKIE_CONSENT_PREFS); preferences = JSON.parse(preferences); if (consent === false) { return false; } if (preferences === false || preferences.indexOf(cookieTypeValue) === -1) { return false; } return true; }, }; })(jQuery);