{"ScriptPreparationCode":"/*your preparation JavaScript code goes here\r\nTo execute async code during the script preparation, wrap it as function globalMeasureThatScriptPrepareFunction, example:*/\r\nasync function globalMeasureThatScriptPrepareFunction() {\r\n // This function is optional, feel free to remove it.\r\n // await someThing();\r\n}","TestCases":[{"Name":"test1","Code":"\u003Cscript\u003E\r\n(function () {\r\n \r\n // --- L\u00D3GICA 1: Checkboxes en la p\u00E1gina de newsletters ---\r\n // Comprobamos si el path contiene \u0027/newsletters/\u0027 dentro del script\r\n if (window.location.pathname.indexOf(\u0027/newsletters/\u0027) \u003E -1) {\r\n \r\n var newsletterTitle = /nlSigupHandler\\(\\s*[\u0027\u0022][^\u0027\u0022]\u002B[\u0027\u0022]\\s*,\\s*[\u0027\u0022]([^\u0027\u0022]\u002B)[\u0027\u0022]\\s*,/;\r\n\r\n document.addEventListener(\u0027change\u0027, function (e) {\r\n var el = e.target;\r\n if (!el || el.type !== \u0027checkbox\u0027) return;\r\n\r\n var onchangeAttr = el.getAttribute(\u0027onchange\u0027);\r\n if (!onchangeAttr) return;\r\n\r\n var match = onchangeAttr.match(newsletterTitle);\r\n if (!match) return;\r\n\r\n var text = match[1];\r\n var item = el.checked ? \u0022recibir newsletter\u0022 : \u0022abandonar newsletter\u0022;\r\n\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({\r\n event: \u0027newsletter_signup\u0027,\r\n link: { \r\n text: text,\r\n item: item\r\n }\r\n });\r\n }, true);\r\n }\r\n\r\n // --- L\u00D3GICA 2: Alta por par\u00E1metro URL (pimec-mlname) ---\r\n \r\n // Funci\u00F3n auxiliar para decodificar Base64 URL Safe\r\n function decodeBase64Url(str) {\r\n try {\r\n // 1. Reemplazar caracteres URL safe (- por \u002B, _ por /)\r\n str = str.replace(/-/g, \u0027\u002B\u0027).replace(/_/g, \u0027/\u0027);\r\n // 2. Rellenar padding si es necesario\r\n while (str.length % 4) { str \u002B= \u0027=\u0027; }\r\n // 3. Decodificar (usamos decodeURIComponent(escape(...)) para soportar UTF-8 correctamente)\r\n return decodeURIComponent(escape(window.atob(str)));\r\n } catch (e) {\r\n console.error(\u0022GTM: Error decodificando base64 param\u0022, e);\r\n return str; // Fallback: devolvemos el valor original si falla\r\n }\r\n }\r\n\r\n // Obtenemos los par\u00E1metros de la URL\r\n var urlParams = new URLSearchParams(window.location.search);\r\n var paramName = \u0027pimec-mlname\u0027;\r\n \r\n // Obtenemos el valor de la variable GTM\r\n // Nota: Al ser una inyecci\u00F3n directa, si la variable no est\u00E1 definida podr\u00EDa dar error de sintaxis JS.\r\n // Asumimos que la variable devuelve un n\u00FAmero o undefined.\r\n var isUserLoggedIn = 1;\r\n\r\n // Comprobamos si existe el par\u00E1metro Y el usuario est\u00E1 logueado (valor 1)\r\n if (urlParams.has(paramName) \u0026\u0026 isUserLoggedIn === 1) {\r\n \r\n var rawValue = urlParams.get(paramName);\r\n var decodedText = decodeBase64Url(rawValue);\r\n\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({\r\n event: \u0027newsletter_signup\u0027,\r\n link: { \r\n text: decodedText,\r\n // Asumimos que si viene por par\u00E1metro es una confirmaci\u00F3n de alta (\u0022recibir\u0022)\r\n item: \u0022recibir newsletter\u0022 \r\n }\r\n });\r\n }\r\n\r\n})();\r\n\u003C/script\u003E","IsDeferred":false},{"Name":"test2","Code":"\u003Cscript\u003E\r\n(function () {\r\n \u0027use strict\u0027;\r\n\r\n // -------------------------------------------------------\r\n // 1. FUNCI\u00D3N UNIFICADA DE ENV\u00CDO (Helper)\r\n // -------------------------------------------------------\r\n function sendNewsletterEvent(text, actionType) {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push({\r\n event: \u0027newsletter_signup\u0027,\r\n link: { \r\n text: text,\r\n item: actionType // \u0022recibir newsletter\u0022 o \u0022abandonar newsletter\u0022\r\n }\r\n });\r\n }\r\n\r\n // -------------------------------------------------------\r\n // 2. FUNCI\u00D3N DE DECODIFICACI\u00D3N (Helper)\r\n // -------------------------------------------------------\r\n function decodeB64(str) {\r\n try {\r\n // Reemplazo para Base64 URL Safe y decodificaci\u00F3n UTF-8\r\n return decodeURIComponent(escape(window.atob(str.replace(/-/g, \u0027\u002B\u0027).replace(/_/g, \u0027/\u0027))));\r\n } catch (e) {\r\n console.warn(\u0022GTM: Error decodificando par\u00E1metro\u0022, e);\r\n return null;\r\n }\r\n }\r\n\r\n // -------------------------------------------------------\r\n // 3. L\u00D3GICA A: COMPROBACI\u00D3N DE PAR\u00C1METRO URL (Carga de p\u00E1gina)\r\n // -------------------------------------------------------\r\n // Optimizacion: Solo leemos variables y procesamos si el parametro existe\r\n var paramName = \u0027pimec-mlname\u0027;\r\n var urlParams = new URLSearchParams(window.location.search);\r\n\r\n if (urlParams.has(paramName)) {\r\n // Inyecci\u00F3n de variable GTM. \r\n // Al ser un tag HTML, GTM resuelve esto antes de inyectar el script.\r\n var isLoggedIn = 1; \r\n \r\n // Convertimos a int por seguridad y comprobamos\r\n if (Number(isLoggedIn) === 1) {\r\n var rawValue = urlParams.get(paramName);\r\n var decodedText = decodeB64(rawValue);\r\n \r\n if (decodedText) {\r\n sendNewsletterEvent(decodedText, \u0022recibir newsletter\u0022);\r\n }\r\n }\r\n }\r\n\r\n // -------------------------------------------------------\r\n // 4. L\u00D3GICA B: EVENT LISTENER (Interacci\u00F3n de usuario)\r\n // -------------------------------------------------------\r\n // Optimizaci\u00F3n: Solo a\u00F1adimos el listener si estamos en la ruta correcta\r\n if (window.location.pathname.indexOf(\u0027/newsletters/\u0027) \u003E -1) {\r\n \r\n // Cacheamos la Regex fuera del listener para no recompilarla en cada clic\r\n var regexTitle = /nlSigupHandler\\(\\s*[\u0027\u0022][^\u0027\u0022]\u002B[\u0027\u0022]\\s*,\\s*[\u0027\u0022]([^\u0027\u0022]\u002B)[\u0027\u0022]\\s*,/;\r\n\r\n document.addEventListener(\u0027change\u0027, function (e) {\r\n // Fail-fast: comprobaciones baratas primero\r\n var el = e.target;\r\n if (!el || el.type !== \u0027checkbox\u0027) return;\r\n\r\n var onchangeAttr = el.getAttribute(\u0027onchange\u0027);\r\n if (!onchangeAttr) return;\r\n\r\n var match = onchangeAttr.match(regexTitle);\r\n if (match) {\r\n // match[1] es el texto capturado\r\n var action = el.checked ? \u0022recibir newsletter\u0022 : \u0022abandonar newsletter\u0022;\r\n sendNewsletterEvent(match[1], action);\r\n }\r\n }, true); // UseCapture\r\n }\r\n\r\n})();\r\n\u003C/script\u003E","IsDeferred":false}]}