1/* Happiness Play: hechos del recorrido, nunca el contenido personal de la rueda. */ 2(function (w, d) { 3 'use strict'; 4 if (w.HPAnalytics) return; 5 var ID = 'G-6Z83LNJY0D'; 6 var host = (w.location.hostname || '').toLowerCase(); 7 var production = /^(www\.)?happinessplay\.(es|com|fr)$/.test(host); 8 var lang = /\.fr$/.test(host) ? 'fr' : /\.com$/.test(host) ? 'en' : 'es'; 9 var path = w.location.pathname; 10 var stages = {'/registro-felicidad.html':'registration', '/acceso.html':'login', 11 '/rueda-de-la-vida.html':'wheel', '/que-quiero-en-mi-vida.html':'conditions', 12 '/que-quiero-cambiar.html':'changes', '/resumen.html':'summary', 13 '/informe-bienestar-personal.html':'report', '/mi-cuenta.html':'account', 14 '/evolucion.html':'evolution', '/mi-futuro.html':'future', '/embed/rueda.html':'embed', 15 '/tu-rueda-de-la-vida.html':'preview', '/your-wheel-of-life.html':'preview', '/votre-roue-de-la-vie.html':'preview'}; 16 var stage = stages[path] || 'public'; 17 var privatePage = ['wheel','conditions','changes','summary','report','account','evolution','future'].indexOf(stage) >= 0; 18 // De donde viene quien llega con `?desde=` (la rueda incrustada en un articulo o en otra web, y el 19 // alta o el acceso a los que manda): el nombre de la web o del articulo, nunca nada de la persona. 20 // Sin `desde` no se manda el parametro. En GA4 es la dimension de evento `hp_origen`. 21 var origin = ''; 22 try { var od = new URL(w.location.href).searchParams.get('desde') || ''; if (/^[a-z0-9_-]{1,40}$/.test(od)) origin = od; } catch (_) {} 23 function common() { 24 var c = {hp_idioma:lang, hp_seccion:privatePage ? 'portal' : 'web', hp_paso:stage}; 25 if (origin) c.hp_origen = origin; 26 return c; 27 } 28 var enabled = production && !/^(1|yes)$/i.test(String(w.navigator.doNotTrack || '')) && !w.navigator.globalPrivacyControl; 29 try { 30 if (new URL(w.location.href).searchParams.get('hp_qa') === '1') { 31 enabled = false; w.sessionStorage.setItem('hp_analytics_qa', '1'); 32 } 33 if (w.sessionStorage.getItem('hp_analytics_qa') === '1') enabled = false; 34 } catch (_) {} 35 var started = false, once = {}; 36 var events = ['sign_up','login','registration_start','registration_submit','registration_error', 37 'confirmation_resent','wheel_saved','condition_added','change_added','report_viewed', 38 'flow_error','cta_click','guide_completed','reseller_que_paga','se_da_de_alta_un_resellers','venta_realizada', 39 'wheel_drawn']; 40 var outcomes = ['ok','required_fields','terms_required','network','server','delivery_pending', 41 'already_registered','email_not_accepted','pending_confirmation','invalid_credentials']; 42 var targets = ['registration','login','wheel','conditions','changes','report','summary','home']; 43 w.dataLayer = w.dataLayer || []; 44 function gtag() { w.dataLayer.push(arguments); } 45 function cleanURL(value, campaigns) { 46 if (!value) return ''; 47 try { 48 var u = new URL(value, w.location.origin); 49 if (!/^https?:$/.test(u.protocol)) return ''; 50 var safePath = /[%@]/.test(u.pathname) ? '/' : u.pathname; 51 var safe = new URL(u.origin + safePath); 52 if (campaigns) ['utm_source','utm_medium','utm_campaign','utm_content'].forEach(function (key) { 53 var value = u.searchParams.get(key) || ''; 54 if (/^[a-z][a-z0-9_-]{0,63}$/i.test(value)) safe.searchParams.set(key, value); 55 }); 56 return safe.toString(); 57 } catch (_) { return ''; } 58 } 59 function emit(name, params) { 60 try { 61 if (!enabled || !started || events.indexOf(name) < 0) return; 62 params = params || {}; 63 var safe = common(); 64 if (outcomes.indexOf(params.hp_resultado) >= 0) safe.hp_resultado = params.hp_resultado; 65 if (targets.indexOf(params.hp_destino) >= 0) safe.hp_destino = params.hp_destino; 66 if (params.method === 'email') safe.method = 'email'; 67 gtag('event', name, safe); 68 } catch (_) { /* La analitica nunca impide usar el producto. */ } 69 } 70 function begin(user, resolvedLang) { 71 try { 72 if (user && user.is && Number(user.is.SUPERADMIN) === 1) enabled = false; 73 if (['es','en','fr'].indexOf(resolvedLang) >= 0) lang = resolvedLang; 74 if (!enabled || started) return; 75 started = true; 76 w.gtag = gtag; 77 gtag('js', new Date()); 78 gtag('set', 'linker', {domains:['happinessplay.es','happinessplay.com','happinessplay.fr']}); 79 var pagina = common(); 80 pagina.page_location = cleanURL(w.location.href, !privatePage); 81 pagina.page_referrer = cleanURL(d.referrer || '', false); 82 pagina.page_title = 'Happiness Play | ' + stage; 83 var config = common(); 84 config.send_page_view = false; config.allow_google_signals = false; config.allow_ad_personalization_signals = false;
85 config.page_location = pagina.page_location; config.page_referrer = pagina.page_referrer; config.page_title = pagina.page_title; 86 gtag('config', ID, config); 87 gtag('event', 'page_view', pagina); 88 var script = d.createElement('script'); 89 script.async = true; script.src = 'https://www.googletagmanager.com/gtag/js?id=' + ID; 90 d.head.appendChild(script); 91 // El acceso navega inmediatamente. Se entrega en el destino autenticado, 92 // no en el documento que desaparece antes de cargar gtag. Solo una fecha, 93 // nunca un identificador de usuario; caduca a los cinco minutos. 94 if (privatePage && user && Number(user.logged) === 1) { 95 var pendingLogin = Number(w.sessionStorage.getItem('hp_analytics_login')); 96 w.sessionStorage.removeItem('hp_analytics_login'); 97 if (pendingLogin > 0 && Date.now() - pendingLogin >= 0 && Date.now() - pendingLogin < 300000) { 98 emit('login', {method:'email',hp_resultado:'ok'}); 99 } 100 } 101 } catch (_) { enabled = false; } 102 } 103 function result(operation, data) { 104 try { 105 if (!data || typeof data !== 'object' || (typeof data.errno !== 'number' && typeof data.errno !== 'string')) return; 106 var tracked = ['createuserstep1','dologin','createuserwheel','adduserfactor','adduserchange','setonboarding']; 107 if (tracked.indexOf(operation) < 0) return; 108 if (data.errno !== 0 && data.errno !== '0') { 109 var codes = {CONFIRMATION_DELIVERY_PENDING:'delivery_pending', EMAIL_ALREADY_REGISTERED:'already_registered', 110 EMAIL_NOT_ACCEPTED:'email_not_accepted', EMAIL_DOMAIN_UNKNOWN:'email_not_accepted', SIGNUP_FAILED:'server'}; 111 emit(operation === 'createuserstep1' ? 'registration_error' : 'flow_error', 112 {hp_resultado:codes[data.code] || 'server'}); 113 return; 114 } 115 if (operation === 'createuserstep1') { 116 if (data.code === 'ACCOUNT_CREATED' && Number(data.data) > 0) emit('sign_up', {method:'email',hp_resultado:'ok'}); 117 else if (data.code === 'CONFIRMATION_RESENT') emit('confirmation_resent', {hp_resultado:'ok'}); 118 } else if (operation === 'dologin') { 119 if (data.data && Number(data.data.logged) === 1) { 120 if (enabled) { 121 try { w.sessionStorage.setItem('hp_analytics_login', String(Date.now())); } 122 catch (_) { emit('login', {method:'email',hp_resultado:'ok'}); } 123 } 124 } 125 else emit('flow_error', {hp_resultado:data.data && Number(data.data.pendiente_confirmacion) === 1 ? 'pending_confirmation' : 'invalid_credentials'}); 126 } else if (operation === 'createuserwheel') emit('wheel_saved', {hp_resultado:'ok'}); 127 else if (operation === 'adduserfactor') emit('condition_added', {hp_resultado:'ok'}); 128 else if (operation === 'adduserchange' && data.data && Number(data.data.id_usuario_cambio) > 0) emit('change_added', {hp_resultado:'ok'}); 129 } catch (_) {} 130 } 131 w.HPAnalytics = {event:emit, result:result, ready:begin}; 132 w.hpEvento = emit; 133 if (!privatePage) begin(); 134 d.addEventListener('click', function (event) { 135 var link = event.target && event.target.closest && event.target.closest('a[href]'); 136 if (!link) return; 137 try { 138 var u = new URL(link.href, w.location.origin); 139 if (!/^(www\.)?happinessplay\.(es|com|fr)$/.test(u.hostname)) return; 140 var target = stages[u.pathname] || (u.pathname === '/' ? 'home' : ''); 141 if (targets.indexOf(target) >= 0) emit('cta_click', {hp_destino:target}); 142 } catch (_) {} 143 }, true); 144 if (stage === 'registration') { 145 d.addEventListener('focusin', function (event) { 146 if (!once.registration && event.target && event.target.closest && event.target.closest('form')) { 147 once.registration = true; emit('registration_start'); 148 } 149 }, true); 150 d.addEventListener('invalid', function () { 151 if (!once.invalid) { once.invalid = true; emit('registration_error', {hp_resultado:'required_fields'}); } 152 }, true); 153 d.addEventListener('submit', function () { once.invalid = false; emit('registration_submit'); }, true); 154 } 155})(window, document);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.