LavoBCN
📍 Barcelona · Sant Martí
LavoBCN · Barcelona 2025
🛵
Bienvenido a
LavoBCN
Tu ciudad, a tu puerta · Barcelona
Tu nombre
Tu teléfono
Solo pedimos lo esencial · RGPD cumplido
🧺 Lavandería
🏠
Detectando ubicación...
Perfect Clean
Tintorería Prim
Lavandería
🧺
Perfect Clean
Pg. del Taulat, 279A · 08019
🧺
Tintorería Prim
C/ del Maresme, 60 · 08019
Tipo de servicio
Estándar
72h · Precio normal
Express
24h · +50% precio
👔 Ropa · Lavar y planchar
👔 Camisa
Lavado + planchado
4.80€0
👖 Pantalón
Lavado + planchado
7.90€0
👚 Blusa
Lavado + planchado
6.40€0
👗 Falda
Lavado + planchado
7.90€0
👕 Polo M/C
Lavado + planchado
5.50€0
🧶 Jersey fino
Lavado delicado
7.00€0
🧶 Jersey grueso
Lavado delicado
8.90€0
🧥 Americana
Lavado en seco
9.40€0
🧥 Abrigo
Lavado en seco
14.70€0
🧥 Abrigo corto
Lavado en seco
11.80€0
🧥 Abrigo de plumas
Lavado especial
17.20€0
🧥 Anorak
Lavado en seco
13.60€0
🧥 Anorak de plumas
Lavado especial
15.10€0
🧥 Gabardina
Lavado en seco
14.30€0
👗 Vestido
Lavado + planchado
11.70€0
💍 Vestido de novia
Limpieza especial
89.50€0
👔 Traje
Chaqueta + pantalón
15.10€0
👔 Traje de lino
Lavado especial
16.20€0
🏠 Hogar · Alfombras y ropa de cama
🛋 Funda sofá 1 plaza
Lavado en seco
20.60€0
🛋 Funda sofá 2 plazas
Lavado en seco
32.70€0
🛏 Funda nórdica pequeña
Lavado
11.30€0
🛏 Funda nórdica grande
Lavado
12.70€0
🛌 Edredón sintético
Matrimonio
24.40€0
🛌 Edredón de plumas
Matrimonio
28.60€0
🏠 Colcha pequeña
Lavado
18.90€0
🏠 Colcha grande
Lavado
21.50€0
🪟 Cortinas
Por m²
4.10€0
🪞 Alfombra
Por m²
14.00€0
🐾 Pieles
Limpieza especial
48.40€0
Total estimado
0.00€
📍 Otras lavanderías · Solo cómo llegar
No están en LavoBCN · Te ayudamos a llegar
🧺
Tintorería SafabugadesNO AFILIADA
C/ Provença, 469 · Sagrada Família
Lun-Vie 08:30-20:00 · Tel: 93 829 25 63
🧺
Wash & Fold BCNNO AFILIADA
C/ Viladomat, 58 · Eixample
Lun-Sáb 09:00-21:00 · Autoservicio 24h
🧺
Lavomatik SantsNO AFILIADA
C/ Galileu, 186 · Sants
Abierto 24h · Autoservicio
🧺
Clean Point PoblenouNO AFILIADA
C/ Roc Boronat, 45 · Poblenou
Lun-Sáb 08:00-21:00
🧺
Tintorería BarcelonetaNO AFILIADA
C/ de la Maquinista, 3 · Barceloneta
Lun-Vie 09:00-19:00
¿Eres propietario? Únete a LavoBCN →
🛵 Moto Taxi BCN
🏠
🛵
⚡ MÁS RÁPIDO QUE UN TAXI
Moto Taxi Barcelona
5min
ESPERA
Desde 5€
PRECIO
⛑ Inc
CASCO
📍 Solicitar moto ahora
🟢
🔴
Tipo de servicio
🛵
Estándar
Desde 5€
Express
Desde 8€
🏍️
Moto XL
Desde 12€
👩
Solo mujer
Desde 6€
Precio estimado
5€
Rider llega en
~8 min
💰 Tarifas Barcelona
Hasta 2 km5€
2 - 5 km8€
5 - 10 km12€
+10 km1.5€/km
✅ Incluye
⛑️Casco homologado incluido
🛡️Seguro de pasajero
Riders verificados · Rating 4.8+
👩Opción solo mujeres disponible
🌍 Expansión LavoBCN Moto
🇪🇸
Barcelona
LIVE
🇫🇷
París
Q4 2025
🇮🇹
Roma
Q1 2026
🇵🇹
Lisboa
Q1 2026
🇨🇴
Bogotá
Q2 2026
🇲🇽
CDMX
Q2 2026
📦 Mensajería
🏠
⚡ ENTREGA 20-45 MIN
LavoBCN Mensajería
Sant Martí · Poblenou · Eixample · Barcelona
¿Qué envías?
✉️
Sobre
Docs · Contratos
4€
📦
Paquete
Max 5kg
6€
🔑
Llaves
Duplicados
4€
💊
Medicamento
Farmacia
5€
🍱
Comida
Tupper · Bolsa
5€
📫
Otro
Cuéntanos
4€
📍 Recogida y entrega
🟢
🔴
👤 Destinatario
👤
📞
Precio
4€
Tiempo
20-45 min
🍔 Comida
🏠
Detectando...
🔜 Próximamente
🍔
McDonald'sPRÓXIMO
Gran de Gràcia, 113 · 08012
08:00-01:00 · SAP
🍔
Burger KingPRÓXIMO
Av. Meridiana, 350 · 08030
24h · SAP
🍗
KFCPRÓXIMO
C/ Pelai, 16 · 08001
🍕
TelepizzaPRÓXIMO
C/ Pallars, 108 · 08018
💊 Farmacia
🏠
Detectando...
🔜 Próximamente
Farmacia del TaulatPRÓXIMO
Pg. del Taulat, 250 · 08019
Farmacia MaresmePRÓXIMO
C/ del Maresme, 102 · 08019
24h · Urgencias
🛒 Supermercados
🏠
Detectando...
🔜 Próximamente
M
MercadonaPRÓXIMO
C/ Pallars, 277 · 08005
Lun-Sáb 09:00-21:30
lidl
LidlPRÓXIMO
C/ Almogàvers, 58 · 08018
dia
DíaPRÓXIMO
C/ Llacuna, 78 · 08005
🏨 Hoteles B2B
🏠
🔜 Próximamente
NH
NH HotelsPRÓXIMO
NH Collection · C/ Bailèn, 76
8 hoteles BCN · SAP
MELIÁ
Meliá HotelsPRÓXIMO
Meliá Sky · C/ Pere IV, 272
5 hoteles BCN · SAP
HILTON
Hilton BarcelonaPRÓXIMO
Av. Diagonal, 589 · 08014
MARRIOTT
Marriott AC HotelsPRÓXIMO
AC Forum · Pg. del Taulat, 278
💐 Flores
🏠
🔜 Próximamente
💐
Flores PoblenouPRÓXIMO
Rambla del Poblenou · Barcelona
Ramos · Plantas · Entrega 1h
🌸 Perfumes
🏠
🔜 Próximamente
🌸
Perfumes PremiumPRÓXIMO
Barcelona · Lujo · Niche
🍷 Licores
🏠
🔜 Próximamente
🍷
Vinos & Cavas BCNPRÓXIMO
Barcelona · Entrega rápida
🚗 Movilidad BCN
🏠
Te conectamos con el mejor transporte de Barcelona.
🚗
UberABRIR →
Taxi · VTC · Rápido
BoltABRIR →
Taxi económico
🚗
CabifyABRIR →
VTC premium
🚲
BicingABRIR →
Bicicletas públicas
🛵
YEGOABRIR →
Motos eléctricas
🚆
RenfeABRIR →
Tren · Rodalies BCN
🚇
TMBABRIR →
Metro · Bus · Barcelona
📦 Mis pedidos
🏠
📦
Sin pedidos aún
Tus pedidos aparecerán aquí
Cómo llegar
Pedir recogida
📍 Recogida en
Tu dirección de entrega
Tu teléfono
Nota (opcional)
¡Pedido confirmado!
Un rider irá a recoger.
Te avisamos cuando esté en camino.
Referencia
🔐 Código de entrega · Díselo al rider
Tu dirección
💬 Enviar pedido por WhatsApp
🛵
¡Moto en camino!
Tu rider llega en 5-10 min.
Referencia
🔐 Código de verificación
Ruta
💬 Confirmar viaje por WhatsApp
📞
RIDER EN CAMINO
Contactar con el rider
📞 Llamar ahora 💬 WhatsApp
' + '
💳 Pagar con tarjeta
' + '
Pago seguro con Stripe · Visa · Mastercard · Apple Pay
' + '
Total a pagar
' + '
' + (pedido.total||'0€') + '
' + '
' + '' + '' + '' + ''; document.body.appendChild(m); // Montar elemento de tarjeta if(_stripe){ _stripeElements = _stripe.elements(); _cardElement = _stripeElements.create('card', { style: { base: { fontSize: '16px', color: '#0d1117', fontFamily: '-apple-system, sans-serif', } }, hidePostalCode: true }); _cardElement.mount('#stripe-card-element'); document.getElementById('stripe-pay-btn').addEventListener('click', procesarPago); } else { // Stripe no disponible — mostrar alternativa WhatsApp document.getElementById('stripe-card-element').innerHTML = '
' + '
💬
' + '
Pago por WhatsApp disponible
' + '
'; document.getElementById('stripe-pay-btn').textContent = 'Confirmar y pagar al rider'; document.getElementById('stripe-pay-btn').addEventListener('click', function(){ cerrarStripe(); toast('✅ Pedido confirmado. Paga al rider en efectivo.'); }); } } async function procesarPago(){ if(!_stripe || !_cardElement) return; var btn = document.getElementById('stripe-pay-btn'); var err = document.getElementById('stripe-error'); btn.textContent = 'Procesando...'; btn.disabled = true; // Crear PaymentMethod var result = await _stripe.createPaymentMethod({ type: 'card', card: _cardElement, }); if(result.error){ err.textContent = result.error.message; err.style.display = 'block'; btn.textContent = 'Pagar ahora →'; btn.disabled = false; } else { // Pago exitoso — confirmar pedido cerrarStripe(); toast('✅ Pago procesado correctamente'); // Mostrar confirmación if(_pendingPedido && _pendingPedido.tipo === 'lavanderia'){ document.getElementById('cov').classList.add('on'); } } } function cerrarStripe(){ var m = document.getElementById('stripe-modal'); if(m) m.remove(); } // Inicializar al cargar setTimeout(initStripe, 1000); // ═══════════════════════════════ // FIREBASE REAL — LAVOBCN // ═══════════════════════════════ var firebaseConfig = { apiKey: "AIzaSyDaopojkUpu7kQ2-H8yEaG", authDomain: "lavobcn.firebaseapp.com", databaseURL: "https://lavobcn-default-rtdb.europe-west1.firebasedatabase.app", projectId: "lavobcn", storageBucket: "lavobcn.firebasestorage.app", messagingSenderId: "749157836989", appId: "1:749157836989:web:c1052afdf", measurementId: "G-CFHXSKG3VL" }; var fbApp = null, fbDB = null; function initFirebase(){ try { if(typeof firebase === 'undefined') return false; fbApp = firebase.initializeApp(firebaseConfig); fbDB = firebase.database(); console.log('✅ Firebase conectado'); escucharPedidosNuevos(); return true; } catch(e){ console.log('Firebase no disponible:', e); return false; } } function guardarPedido(pedido){ if(!fbDB) return; try { fbDB.ref('pedidos/' + pedido.ref).set(pedido); console.log('✅ Pedido guardado en Firebase:', pedido.ref); } catch(e){ console.log('Error guardando pedido:', e); } } function escucharPedidosNuevos(){ // Solo para el rider — el cliente no necesita escuchar } // ═══════════════════════ // LAVOBCN · JS v5.0 CLEAN // Sin dependencias externas // ═══════════════════════ var U={nombre:'',tel:''}; var lavSel='pc', srvSel='std', motoTipo='estandar', motoPrecio=5, msgTipo='sobre', msgPrecio=4; var _local='', _adr='', _lat=41.3851, _lng=2.1734; var uLat=null, uLng=null; var AFIL=['Perfect Clean','Tintorería Prim','LavoBCN Mensajería']; var PRECIOS={camisa:4.80,pantalon:7.90,blusa:6.40,falda:7.90,polo:5.50,jersey_fino:7.00,jersey_grueso:8.90,americana:9.40,abrigo:14.70,abrigo_corto:11.80,abrigo_plumas:17.20,anorak:13.60,anorak_plumas:15.10,gabardina:14.30,vestido:11.70,vestido_novia:89.50,traje:15.10,traje_lino:16.20,funda_sofa1:20.60,funda_sofa2:32.70,nordica_p:11.30,nordica_g:12.70,edredon_sint:24.40,edredon_plumas:28.60,colcha_p:18.90,colcha_g:21.50,cortinas:4.10,alfombra:14.00,pieles:48.40}; var QTY={camisa:0,pantalon:0,blusa:0,falda:0,polo:0,jersey_fino:0,jersey_grueso:0,americana:0,abrigo:0,abrigo_corto:0,abrigo_plumas:0,anorak:0,anorak_plumas:0,gabardina:0,vestido:0,vestido_novia:0,traje:0,traje_lino:0,funda_sofa1:0,funda_sofa2:0,nordica_p:0,nordica_g:0,edredon_sint:0,edredon_plumas:0,colcha_p:0,colcha_g:0,cortinas:0,alfombra:0,pieles:0}; var SCREENS=['lav','moto','msg','com','far','sup','hot','flo','per','lic','mov','ped']; function $(i){return document.getElementById(i);} function toast(m){ var t=$('toast'); t.textContent=m;t.style.opacity='1'; clearTimeout(t._t);t._t=setTimeout(function(){t.style.opacity='0';},2500); } function ref(p){ var d=new Date(); return p+'-'+String(d.getFullYear()).slice(2)+('0'+(d.getMonth()+1)).slice(-2)+('0'+d.getDate()).slice(-2)+'-'+Math.floor(1000+Math.random()*9000); } function cod(){return String(Math.floor(10+Math.random()*90));} // ── NAVEGACIÓN ── function SS(id){ $('home').style.display='none'; SCREENS.forEach(function(k){var s=$('scr-'+k);if(s)s.classList.remove('on');}); var scr=$(id); if(scr){scr.classList.add('on');scr.scrollTop=0;} var geo={ 'scr-lav':['lav-dot','lav-txt','lav-near','lav-nsec'], 'scr-com':['com-dot','com-txt','com-near','com-nsec'], 'scr-far':['far-dot','far-txt','far-near','far-nsec'], 'scr-sup':['sup-dot','sup-txt','sup-near','sup-nsec'] }; if(geo[id])setTimeout(function(){geoRun(id,geo[id][0],geo[id][1],geo[id][2],geo[id][3]);},300); if(id==='scr-lav')setTimeout(initLav,200); if(id==='scr-moto')setTimeout(function(){if(navigator.geolocation)navigator.geolocation.getCurrentPosition(function(p){var o=$('moto-ori');if(o&&!o.value)o.value='Mi ubicación · Barcelona';uLat=p.coords.latitude;uLng=p.coords.longitude;},{},{ timeout:5000,maximumAge:60000});},300); } function goHome(){ ['mov2','cov','cov-moto','call-ov'].forEach(function(i){var e=$(i);if(e){e.classList.remove('on');e.style.display='';}}); $('sov').classList.remove('on'); SCREENS.forEach(function(k){var s=$('scr-'+k);if(s)s.classList.remove('on');}); var h=$('home');if(h)h.style.display='block'; window.scrollTo(0,0); } // ── GEOLOCALIZACIÓN ── function dist(a,b,x,y){var R=6371,dL=(x-a)*Math.PI/180,dG=(y-b)*Math.PI/180,s=Math.sin(dL/2)*Math.sin(dL/2)+Math.cos(a*Math.PI/180)*Math.cos(x*Math.PI/180)*Math.sin(dG/2)*Math.sin(dG/2);return R*2*Math.atan2(Math.sqrt(s),Math.sqrt(1-s));} function geoRun(scrId,dotId,txtId,nearId,secId){ function run(lat,lng){ uLat=lat;uLng=lng; var scr=$(scrId);if(!scr)return; var cards=scr.querySelectorAll('.lc[data-lat]'); var best=null,bestD=999,bestCard=null; cards.forEach(function(c){ var d=dist(lat,lng,parseFloat(c.getAttribute('data-lat')),parseFloat(c.getAttribute('data-lng'))); if(d · '+bestD.toFixed(1)+'km · ~'+mins+' min'; var ne=$(nearId),se=$(secId); if(ne&&se&&bestCard){ se.style.display='block'; var cl=bestCard.cloneNode(true); cl.classList.add('near');cl.classList.remove('dim'); var bd=cl.querySelector('.lbdg');if(bd){bd.className='lbdg ln';bd.textContent='MÁS CERCA';} var inf=cl.querySelector('.linf');if(inf)inf.innerHTML='📍 '+bestD.toFixed(1)+' km · ~'+mins+' min'; ne.innerHTML='';ne.appendChild(cl); cl.addEventListener('click',function(){abrirSheet(best,cl.getAttribute('data-n'),cl.getAttribute('data-lat'),cl.getAttribute('data-lng'),true);}); } } if(uLat){run(uLat,uLng);return;} if(!navigator.geolocation){var t=$(txtId);if(t)t.textContent='Barcelona · Establecimientos disponibles';return;} navigator.geolocation.getCurrentPosition(function(p){run(p.coords.latitude,p.coords.longitude);},function(){var d=$(dotId),t=$(txtId);if(d)d.style.background='#64748b';if(t)t.textContent='Establecimientos en Barcelona';},{timeout:8000,maximumAge:60000}); } // ── LAVANDERÍA ── function isOpen(){var h=new Date().getHours(),d=new Date().getDay();return d===0?(h>=9&&h<18):(h>=10&&h<19);} function initLav(){ var o=isOpen(); var html=o?'🟢 Abierta ahora':'🔴 Cerrada · Abre '+(new Date().getDay()===0?'9:00':'10:00')+'h'; var ep=$('estado-pc'),epr=$('estado-prim'),av=$('aviso-cerrada'); if(ep)ep.innerHTML=html;if(epr)epr.innerHTML=html; if(av)av.style.display=o?'none':'block'; selLav('pc'); } function selLav(id){ lavSel=id; ['pc','prim'].forEach(function(k){ var o=$('opt-'+k),c=$('chk-'+k); if(o){o.style.borderColor=k===id?'#10b981':'#e2e8f0';o.style.background=k===id?'#f0fdf4':'#fff';} if(c)c.style.display=k===id?'block':'none'; }); } function selSrv(id){ srvSel=id; ['std','exp'].forEach(function(k){var b=$('srv-'+k);if(b)b.style.borderColor=k===id?'#2563eb':'#e2e8f0';}); } function chgQ(p,d){ QTY[p]=Math.max(0,(QTY[p]||0)+d); var e=$('q-'+p);if(e)e.textContent=QTY[p]; var tot=0,mult=srvSel==='exp'?1.5:1; Object.keys(QTY).forEach(function(k){tot+=QTY[k]*(PRECIOS[k]||0)*mult;}); var te=$('lav-total');if(te)te.textContent=tot.toFixed(2)+'€'; } // ── MOTO ── function geoMoto(){if(navigator.geolocation)navigator.geolocation.getCurrentPosition(function(p){var o=$('moto-ori');if(o)o.value='Mi ubicación · Barcelona';uLat=p.coords.latitude;uLng=p.coords.longitude;toast('📍 Ubicación detectada');},{},{ timeout:8000});} function geoMsg(){if(navigator.geolocation)navigator.geolocation.getCurrentPosition(function(p){var o=$('msg-ori');if(o)o.value='Mi ubicación · Barcelona';uLat=p.coords.latitude;uLng=p.coords.longitude;toast('📍 Ubicación detectada');},{},{ timeout:8000});} // ── MENSAJERÍA ── function selMsg(el){ document.querySelectorAll('.msg-tipo').forEach(function(b){b.classList.remove('sel');}); el.classList.add('sel'); msgTipo=el.getAttribute('data-tipo'); msgPrecio=parseInt(el.getAttribute('data-precio')); var p=$('msg-precio');if(p)p.textContent=msgPrecio+'€'; } // ── SHEET ── function abrirSheet(nombre,adr,lat,lng,afil){ _local=nombre||'';_adr=adr||'Barcelona'; _lat=parseFloat(lat)||41.3851;_lng=parseFloat(lng)||2.1734; var esA=afil||(AFIL.indexOf(nombre)!==-1); $('s-nm').textContent=nombre; $('s-adr').textContent='📍 '+_adr; $('s-on').style.display=esA?'block':'none'; $('s-off').style.display=esA?'none':'block'; $('s-goo').href='https://www.google.com/maps/dir/?api=1&destination='+_lat+','+_lng; $('s-waz').href='https://waze.com/ul?ll='+_lat+','+_lng+'&navigate=yes'; $('s-apl').href='https://maps.apple.com/?daddr='+_lat+','+_lng; $('sov').classList.add('on'); } function abrirModal(){ $('m-tit').textContent=_local;$('m-adr').textContent=_adr; $('f-dir').value='';$('f-tel').value='';$('f-nota').value=''; $('sov').classList.remove('on'); $('mov2').classList.add('on'); } // ── LLAMADA ── function llamarRider(){$('call-ov').classList.add('on');} // ── CONFIRMAR RECOGIDA ── function confirmar(){ var dir=$('f-dir').value.trim(),tel=$('f-tel').value.trim(); if(!dir){toast('⚠ Introduce tu dirección');return;} if(!tel){toast('⚠ Introduce tu teléfono');return;} $('mov2').classList.remove('on'); goHome(); var rr=ref('LV'), cc=cod(); $('c-ref').textContent=rr; $('c-cod').textContent=cc; $('c-dir').textContent=dir; // Generar link WhatsApp automático var tot=$('lav-total')?$('lav-total').textContent:'—'; var prendas=[]; var noms={camisa:'Camisas',pantalon:'Pantalones',chaqueta:'Chaquetas',vestido:'Vestidos',abrigo:'Abrigos',traje:'Trajes',sabanas:'Sabanas',edredon:'Edredones'}; Object.keys(QTY).forEach(function(k){if(QTY[k]>0)prendas.push(QTY[k]+'x '+noms[k]);}); var msg='🧺 *NUEVO PEDIDO LAVANDERÍA*\n' +'📋 Ref: '+rr+'\n' +'🏪 Local: '+_local+'\n' +'📍 Dirección: '+dir+'\n' +'📞 Tel cliente: '+tel+'\n' +(prendas.length?'👔 Prendas: '+prendas.join(', ')+'\n':'') +'💰 Total: '+tot+'\n' +'🔐 Código entrega: *'+cc+'*\n' +'⏱ Servicio: '+(srvSel==='exp'?'Express 24h':'Estándar 72h'); var waLink=$('wa-pedido'); if(waLink)waLink.href='https://wa.me/34661041439?text='+encodeURIComponent(msg); $('cov').classList.add('on'); // Guardar en Firebase — rider lo recibe en tiempo real guardarPedido({ ref: rr, tipo: 'lavanderia', cliente: U.nombre || 'Cliente', tel: tel, dir: dir, local: _local, total: tot, prendas: prendas.join(', '), servicio: srvSel, estado: 'pendiente', ts: Date.now() }); try{var n=parseInt(localStorage.getItem('lavo_pedidos')||'0')+1;localStorage.setItem('lavo_pedidos',n);var b=$('banner-promo');if(b&&n>1)b.style.display='none';}catch(e){} } // ── EVENTOS ── window.addEventListener('load',function(){ // Iniciar Firebase setTimeout(initFirebase, 500); // Onboarding var mostrar=true; try{var s=localStorage.getItem('lavo_user');if(s){U=JSON.parse(s);mostrar=false;}}catch(e){} if(mostrar){$('ob-ov').classList.add('on');} else{ var h=$('hloc');if(h&&U.nombre)h.textContent='👋 Hola, '+U.nombre+' · Barcelona'; $('home').style.display='block'; try{var n=parseInt(localStorage.getItem('lavo_pedidos')||'0');var b=$('banner-promo');if(b&&n>0)b.style.display='none';}catch(e){} } }); // Onboarding submit $('ob-ok').addEventListener('click',function(){ var n=$('ob-nombre').value.trim(),t=$('ob-tel').value.trim(); if(!n){toast('⚠ Escribe tu nombre');return;} if(!t){toast('⚠ Escribe tu teléfono');return;} U={nombre:n,tel:t}; try{localStorage.setItem('lavo_user',JSON.stringify(U));}catch(e){} $('ob-ov').classList.remove('on'); var h=$('hloc');if(h)h.textContent='👋 Hola, '+n+' · Barcelona'; $('home').style.display='block'; toast('¡Bienvenido '+n+'! 🎉'); }); // Grid var GM={lav:'scr-lav',moto:'scr-moto',msg:'scr-msg',com:'scr-com',far:'scr-far',sup:'scr-sup',hot:'scr-hot',flo:'scr-flo',per:'scr-per',lic:'scr-lic'}; Object.keys(GM).forEach(function(k){var e=$(('g-'+k));if(e)e.addEventListener('click',function(){SS(GM[k]);});}); // Backs SCREENS.forEach(function(k){var e=$('bk-'+k);if(e)e.addEventListener('click',function(ev){ev.stopPropagation();goHome();});}); // Cards click document.addEventListener('click',function(e){ var c=e.target.closest('.lc[data-n]'); if(!c||c.closest('a')||c.closest('#sov')||c.closest('#mov2'))return; var n=c.getAttribute('data-n'),la=c.getAttribute('data-lat'),ln=c.getAttribute('data-lng'); var afil=AFIL.indexOf(n)!==-1; if(afil){ _local=n;_adr=c.querySelector('.ladr')?c.querySelector('.ladr').textContent:'Barcelona'; $('m-tit').textContent=n;$('m-adr').textContent=_adr; $('f-dir').value='';$('f-tel').value='';$('f-nota').value=''; $('mov2').classList.add('on'); } else { window.open('https://www.google.com/maps/dir/?api=1&destination='+la+','+ln,'_blank'); } }); // Lavandería pedir $('lav-pedir').addEventListener('click',function(){ var adr=lavSel==='pc'?'Pg. del Taulat, 279A · 08019':'C/ del Maresme, 60 · 08019'; _local=lavSel==='pc'?'Perfect Clean':'Tintorería Prim';_adr=adr; $('m-tit').textContent=_local;$('m-adr').textContent=adr; $('f-dir').value='';$('f-tel').value='';$('f-nota').value=''; $('mov2').classList.add('on'); }); // Sheet $('s-can').addEventListener('click',function(){$('sov').classList.remove('on');}); $('sov').addEventListener('click',function(e){if(e.target===this)$('sov').classList.remove('on');}); $('s-pedir').addEventListener('click',abrirModal); // Modal $('f-can').addEventListener('click',function(){$('mov2').classList.remove('on');}); $('mov2').addEventListener('click',function(e){if(e.target===this)$('mov2').classList.remove('on');}); $('f-ok').addEventListener('click',confirmar); $('c-home').addEventListener('click',goHome); // Moto tipos document.querySelectorAll('.moto-tipo').forEach(function(b){ b.addEventListener('click',function(){ document.querySelectorAll('.moto-tipo').forEach(function(x){x.classList.remove('sel');}); b.classList.add('sel'); motoTipo=b.getAttribute('data-tipo');motoPrecio=parseInt(b.getAttribute('data-precio')); var p=$('moto-precio'),et=$('moto-eta'); if(p)p.textContent=motoPrecio+'€'; var ets={estandar:'~8 min',express:'~5 min',xl:'~10 min',mujer:'~12 min'}; if(et)et.textContent=ets[motoTipo]||'~8 min'; }); }); // Moto solicitar $('moto-ok').addEventListener('click',function(){ var ori=$('moto-ori').value.trim(),dst=$('moto-dst').value.trim(),tel=$('moto-tel').value.trim(); if(!ori){toast('⚠ Indica tu punto de recogida');return;} if(!dst){toast('⚠ Indica tu destino');return;} if(!tel){toast('⚠ Introduce tu teléfono');return;} goHome(); var rr=ref('MT'), cc=cod(); $('cm-ref').textContent=rr; $('cm-cod').textContent=cc; $('cm-ruta').textContent='🟢 '+ori+' → 🔴 '+dst; var etas={estandar:'5-8 min',express:'3-5 min',xl:'8-12 min',mujer:'8-15 min'}; $('cm-eta2').textContent=etas[motoTipo]||'5-10 min'; // WhatsApp moto var msgM='🛵 *NUEVO VIAJE MOTO TAXI*\n' +'📋 Ref: '+rr+'\n' +'🟢 Origen: '+ori+'\n' +'🔴 Destino: '+dst+'\n' +'📞 Tel pasajero: '+tel+'\n' +'🛵 Tipo: '+motoTipo+'\n' +'💰 Precio: '+motoPrecio+'€\n' +'⏱ ETA: '+(etas[motoTipo]||'5-10 min')+'\n' +'🔐 Código: *'+cc+'*'; var waM=$('wa-moto'); if(waM)waM.href='https://wa.me/34661041439?text='+encodeURIComponent(msgM); $('cov-moto').classList.add('on'); $('moto-ori').value='';$('moto-dst').value='';$('moto-tel').value=''; }); $('cm-home').addEventListener('click',goHome); // Mensajería $('msg-ok').addEventListener('click',function(){ var ori=$('msg-ori').value.trim(),dst=$('msg-dst').value.trim(),tel=$('msg-tel').value.trim(); if(!ori){toast('⚠ Indica dónde recogemos');return;} if(!dst){toast('⚠ Indica dónde entregamos');return;} if(!tel){toast('⚠ Teléfono del destinatario');return;} goHome(); $('c-ref').textContent=ref('MS');$('c-cod').textContent=cod();$('c-dir').textContent=ori+' → '+dst; var ico=document.querySelector('#cov .cico'),tit=document.querySelector('#cov .ctit'),sub=document.querySelector('#cov .csub'); if(ico)ico.textContent='📦';if(tit)tit.textContent='¡Envío confirmado!';if(sub)sub.textContent='Un rider recoge en 20-45 min.'; $('cov').classList.add('on'); $('msg-ori').value='';$('msg-dst').value='';$('msg-nombre').value='';$('msg-tel').value=''; }); // Menú $('mbtn').addEventListener('click',function(){$('mov-ov').style.display='block';$('mpanel').style.display='block';}); $('mov-ov').addEventListener('click',function(){$('mov-ov').style.display='none';$('mpanel').style.display='none';}); function menuIr(s){$('mov-ov').style.display='none';$('mpanel').style.display='none';SS(s);} $('mi-moto').addEventListener('click',function(){menuIr('scr-moto');}); $('mi-mov').addEventListener('click',function(){menuIr('scr-mov');}); $('mi-ped').addEventListener('click',function(){menuIr('scr-ped');}); Listener('click',function(){menuIr('scr-ped');});