ÿØÿà JFIF    ÿÛ „  ( %!1!%*+...983,7(-.- ÿØÿà JFIF    ÿÛ „  ( %!1!%*+...983,7(-.- /* MyPetPro7 — Main App JS v1.0 */ (function(){ 'use strict'; var lang = (typeof MPP7!=='undefined'&&MPP7.lang)?MPP7.lang:'es'; var selSvcTab= 0; var calYear = new Date().getFullYear(); var calMonth = new Date().getMonth(); var selDay = null; var selSlot = null; var selProv = null; var chatIdx = 0; var bookedAppts = []; var T = (typeof MPP7_T!=='undefined')?MPP7_T:{}; var tt = function(k){return(T[lang]&&T[lang][k])?T[lang][k]:(T.es&&T.es[k]?T.es[k]:k);}; var d = function(){return T[lang]||T.es||{};}; var ajaxUrl = function(){return(typeof MPP7!=='undefined')?MPP7.ajax:'/wp-admin/admin-ajax.php';}; var nonce = function(){return(typeof MPP7!=='undefined')?MPP7.nonce:'';}; var stars = function(n){return'★'.repeat(Math.min(5,Math.round(n)))+'☆'.repeat(Math.max(0,5-Math.round(n)));}; function ajax(action,data,cb,ecb){ var fd=new FormData(); fd.append('action',action);fd.append('nonce',nonce()); Object.entries(data||{}).forEach(function(kv){fd.append(kv[0],kv[1]);}); fetch(ajaxUrl(),{method:'POST',body:fd}) .then(function(r){return r.json();}) .then(function(r){if(r.success)cb(r.data);else(ecb||showToast)(r.data||tt('error-generic'),'error');}) .catch(function(){(ecb||showToast)(tt('error-generic'),'error');}); } function showToast(msg,type){ var t=document.createElement('div'); t.style.cssText='position:fixed;bottom:24px;right:24px;z-index:9999;background:'+(type==='error'?'#ef4444':'#1db87e')+';color:#fff;padding:12px 20px;border-radius:10px;font-size:13.5px;font-family:Inter,sans-serif;box-shadow:0 4px 20px rgba(0,0,0,.18);max-width:340px;'; t.textContent=msg; document.body.appendChild(t); setTimeout(function(){t.remove();},4000); } /* ── LANG ── */ function setLang(l,btn){ lang=l; document.querySelectorAll('.mpp7-lang-btn').forEach(function(b){b.classList.remove('act');}); if(btn)btn.classList.add('act'); applyT(); } function applyT(){ var t=d(); Object.keys(t).forEach(function(k){ if(typeof t[k]!=='string')return; var el=document.getElementById('mpp7t-'+k); if(!el)return; if(el.tagName==='INPUT'||el.tagName==='TEXTAREA')el.placeholder=t[k]; else el.textContent=t[k]; }); renderHomeSvcTabs();renderSvcs();renderProviders();renderHow();renderWhy();renderBecome();renderFooter(); renderCalendar(); if(document.getElementById('mpp7-pro-content'))proTab('overview',null); if(document.getElementById('mpp7-user-content'))userTab('appointments',null); if(document.getElementById('mpp7-admin-content'))adminTab('overview',null); } /* ── PAGES ── */ function goPage(p){ document.querySelectorAll('.mpp7-page').forEach(function(pg){pg.classList.remove('on');}); var el=document.getElementById('mpp7pg-'+p); if(el){el.classList.add('on');window.scrollTo(0,0);} if(p==='provider')proTab('overview',null); if(p==='user')userTab('appointments',null); if(p==='admin')adminTab('overview',null); if(p==='calendar'){selDay=null;selSlot=null;renderCalendar();} } /* ── HOME SECTIONS ── */ function renderHomeSvcTabs(){ var wrap=document.getElementById('mpp7-svc-tabs'); if(!wrap)return; var icons=['ti-home-2','ti-home','ti-door-enter','ti-sun','ti-walk']; var tabs=d().svcTabs||[]; wrap.innerHTML=tabs.map(function(t,i){ return ''; }).join(''); } function selTab(i){selSvcTab=i;renderHomeSvcTabs();} function renderSvcs(){ var g=document.getElementById('mpp7-svc-grid'); if(!g)return; var svcs=d().svcs||[]; g.innerHTML=svcs.map(function(s){ return '
' +'
' +'

'+s.name+'

'+s.desc+'

' +'
'+s.price+'
' +'
'; }).join(''); } function renderProviders(){ var g=document.getElementById('mpp7-prov-grid'); if(!g)return; var provs=d().providers||[]; var emojis=['🐾','🐕','🐱','🦮']; g.innerHTML=provs.map(function(p,i){ return '
' +'
' +emojis[i%4] +''+p.badge+'' +'
' +'
' +'
' +'
'+p.ini+'
' +'
'+p.name+'
'+p.spec+'
' +'
' +'
'+stars(p.rating)+'' +''+p.rating+'' +'('+p.reviews+')
' +'
'+p.price+'
' +'' +'
'; }).join(''); } function renderHow(){ var g=document.getElementById('mpp7-how-grid'); if(!g)return; var steps=d().howSteps||[]; g.innerHTML=steps.map(function(s){ return '
'+s.n+'

'+s.title+'

'+s.desc+'

'; }).join(''); } function renderWhy(){ var g=document.getElementById('mpp7-why-grid'); if(!g)return; var whys=d().whys||[]; g.innerHTML=whys.map(function(w){ return '
' +'

'+w.title+'

'+w.desc+'

'; }).join(''); } function renderBecome(){ var steps=document.getElementById('mpp7-become-steps'); var stats=document.getElementById('mpp7-become-stats'); if(steps){ steps.innerHTML=(d().becomeSteps||[]).map(function(s,i){ return '
'+(i+1)+'
'+s+'
'; }).join(''); } if(stats){ stats.innerHTML=(d().becomeStats||[]).map(function(s){ return '
'+s.num+'
'+s.lbl+'
'; }).join(''); } } function renderFooter(){ var t=d(); [['mpp7-footer-svc',t.footerSvc],['mpp7-footer-pro',t.footerPro],['mpp7-footer-help',t.footerHelp]].forEach(function(pair){ var el=document.getElementById(pair[0]); if(el&&pair[1])el.innerHTML=pair[1].map(function(l){return''+l+'';}).join(''); }); } /* ── CALENDAR ── */ function renderCalendar(){ var dowWrap=document.getElementById('mpp7-cal-dow'); var daysWrap=document.getElementById('mpp7-cal-days'); if(!dowWrap||!daysWrap)return; var days=tt('days');var months=d().months||[]; var lbl=document.getElementById('mpp7-cal-month-lbl'); if(lbl&&Array.isArray(months))lbl.textContent=(months[calMonth]||'')+' '+calYear; if(Array.isArray(days))dowWrap.innerHTML=days.map(function(dd){return'
'+dd+'
';}).join(''); var first=new Date(calYear,calMonth,1); var totalDays=new Date(calYear,calMonth+1,0).getDate(); var startDow=first.getDay(); var today=new Date();today.setHours(0,0,0,0); var html=Array(startDow).fill('
').join(''); for(var i=1;i<=totalDays;i++){ var dt=new Date(calYear,calMonth,i); var past=dt-1; html+='
'+i +(hasAppt?'':'')+'
'; } daysWrap.innerHTML=html; } function calNav(dir){ calMonth+=dir; if(calMonth<0){calMonth=11;calYear--;} if(calMonth>11){calMonth=0;calYear++;} renderCalendar(); } function calPickDay(ds){ selDay=ds;selSlot=null; renderCalendar(); var sw=document.getElementById('mpp7-slots-wrap'); if(sw){sw.style.display='block';sw.innerHTML='

'+tt('loading')+'

';} var pid=document.getElementById('mpp7-cal-prov-sel')?document.getElementById('mpp7-cal-prov-sel').value:0; if(!pid){if(sw)sw.innerHTML='

'+tt('cal-select-prov')+'

';return;} ajax('mpp7_get_slots',{provider_id:pid,date:ds},function(data){ if(!sw)return; if(!data.slots||!data.slots.length){sw.innerHTML='

'+tt('cal-no-slots')+'

';return;} sw.innerHTML='
'+tt('cal-slots-title')+'
' +'
' +data.slots.map(function(s){ return '
' +s.time+'
'; }).join('')+'
'; },function(){if(sw)sw.innerHTML='

'+tt('error-generic')+'

';}); } function calPickSlot(t){ selSlot=t; document.querySelectorAll('.mpp7-slot').forEach(function(s){s.classList.toggle('sel',s.textContent.trim()===t);}); var disp=document.getElementById('mpp7-cal-datetime-disp'); if(disp)disp.value=selDay+' — '+t; } function calConfirmBook(){ var name=document.getElementById('mpp7-cal-name')?document.getElementById('mpp7-cal-name').value.trim():''; var email=document.getElementById('mpp7-cal-email')?document.getElementById('mpp7-cal-email').value.trim():''; var petName=document.getElementById('mpp7-cal-pet-name')?document.getElementById('mpp7-cal-pet-name').value.trim():''; var petType=document.getElementById('mpp7-cal-pet-type')?document.getElementById('mpp7-cal-pet-type').value:''; var svc=document.getElementById('mpp7-cal-svc')?document.getElementById('mpp7-cal-svc').value:''; var pid=document.getElementById('mpp7-cal-prov-sel')?document.getElementById('mpp7-cal-prov-sel').value:0; if(!name||!email||!petName||!selDay||!selSlot){showToast(tt('required-fields'),'error');return;} ajax('mpp7_book',{ provider_id:pid,client_name:name,client_email:email, client_phone:document.getElementById('mpp7-cal-phone')?document.getElementById('mpp7-cal-phone').value:'', pet_name:petName,pet_type:petType,service_type:svc, appt_date:selDay,appt_time:selSlot, notes:document.getElementById('mpp7-cal-notes')?document.getElementById('mpp7-cal-notes').value:'', lang:lang },function(data){ bookedAppts.push(selDay); var fb=document.getElementById('mpp7-cal-form'); var ok=document.getElementById('mpp7-cal-ok'); var det=document.getElementById('mpp7-cal-ok-detail'); if(fb)fb.style.display='none'; if(ok)ok.style.display='block'; if(det)det.textContent=data.folio+' · '+selDay+' '+selSlot; selDay=null;selSlot=null;renderCalendar(); },function(msg){showToast(msg,'error');}); } function calReset(){ var fb=document.getElementById('mpp7-cal-form'); var ok=document.getElementById('mpp7-cal-ok'); var sw=document.getElementById('mpp7-slots-wrap'); if(fb)fb.style.display='block';if(ok)ok.style.display='none'; if(sw){sw.style.display='none';} ['mpp7-cal-name','mpp7-cal-email','mpp7-cal-phone','mpp7-cal-pet-name','mpp7-cal-notes'].forEach(function(id){ var el=document.getElementById(id);if(el)el.value=''; }); var disp=document.getElementById('mpp7-cal-datetime-disp');if(disp)disp.value=''; renderCalendar(); } /* ── BOOKING MODAL ── */ function openBookingModal(idx){ var prov=(d().providers||[])[idx]; if(!prov)return; selProv=prov; openModal('book',idx); } /* ── MODALS ── */ function openModal(type,idx){ var t=d(); var bg=document.getElementById('mpp7-modal-bg'); var title=document.getElementById('mpp7-modal-title'); var body=document.getElementById('mpp7-modal-body'); if(!bg||!body)return; bg.classList.remove('hidden'); if(type==='book'){ var prov=(t.providers||[])[idx||0]; if(!prov)return; title.textContent=tt('cal-book-title')+' — '+prov.name; body.innerHTML='
' +''+prov.name+' · '+prov.spec+' · '+prov.price+'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +''; } else if(type==='provider'){ var pv=(t.providers||[])[idx||0]; if(!pv)return; title.textContent=pv.name; body.innerHTML='
' +'
'+pv.ini+'
' +'
'+pv.name+'
' +'
'+pv.spec+'
' +'
'+stars(pv.rating)+' '+pv.rating+' ('+pv.reviews+' '+(lang==='fr'?'avis':lang==='en'?'reviews':'reseñas')+')
' +'
'+pv.price+'
'+pv.badge+'
' +'
' +'
98%
'+(lang==='fr'?'Taux de réponse':lang==='en'?'Response rate':'Tasa de respuesta')+'
' +'
<1h
'+(lang==='fr'?'Temps de réponse':lang==='en'?'Response time':'Tiempo de respuesta')+'
' +'
' +''; } else if(type==='signin'||type==='signup'){ var isSU=type==='signup'; title.textContent=isSU?tt('signup-h'):tt('signin-h'); body.innerHTML=(isSU?'
':'') +'
' +'
' +(isSU?'
':'') +'' +'

'+(isSU?'Already have an account?':'Don\'t have an account?')+' ' +''+(isSU?tt('signin-btn'):tt('signup-btn'))+'

'; } else if(type==='pro-reg'){ title.textContent=tt('pro-reg-h'); var svcsOpts=(t.svcs||[]).map(function(s){return'';}).join(''); body.innerHTML='
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +''; } } function submitBookModal(idx){ var name=document.getElementById('bk-name')?document.getElementById('bk-name').value.trim():''; var email=document.getElementById('bk-email')?document.getElementById('bk-email').value.trim():''; var pet=document.getElementById('bk-pet')?document.getElementById('bk-pet').value.trim():''; var petType=document.getElementById('bk-pet-type')?document.getElementById('bk-pet-type').value:''; var svc=document.getElementById('bk-svc')?document.getElementById('bk-svc').value:''; var date=document.getElementById('bk-date')?document.getElementById('bk-date').value:''; var time=document.getElementById('bk-time')?document.getElementById('bk-time').value:''; if(!name||!email||!pet||!date||!time){showToast(tt('required-fields'),'error');return;} var pv=(d().providers||[])[idx]; ajax('mpp7_book',{ provider_id:idx+1,client_name:name,client_email:email, client_phone:'',pet_name:pet,pet_type:petType,service_type:svc, appt_date:date,appt_time:time, notes:document.getElementById('bk-notes')?document.getElementById('bk-notes').value:'', lang:lang },function(data){ bookedAppts.push(date);renderCalendar(); showModalSuccess(data.folio+' · '+date+' '+time+(pv?' · '+pv.name:'')); },function(msg){showToast(msg,'error');}); } function showModalSuccess(detail){ var body=document.getElementById('mpp7-modal-body'); if(!body)return; body.innerHTML='
' +'' +'

'+(lang==='fr'?'Succès !':lang==='en'?'Success!':'¡Listo!')+'

' +(detail?'

'+detail+'

':'') +'

'+(lang==='fr'?'Vous recevrez un email de confirmation.':lang==='en'?'You\'ll receive a confirmation email.':'Recibirás un correo de confirmación.')+'

' +'
' +''; } function closeModal(){var bg=document.getElementById('mpp7-modal-bg');if(bg)bg.classList.add('hidden');} /* ── PRO DASHBOARD ── */ function proTab(tab,btn){ document.querySelectorAll('#mpp7pg-provider .mpp7-sb-item').forEach(function(b){b.classList.remove('act');}); if(btn)btn.classList.add('act'); renderProTab(tab); } function renderProTab(tab){ var c=document.getElementById('mpp7-pro-content'); if(!c)return; var t=d(); var pill=function(s,cl){return''+s+'';}; var stL=function(s){return tt('status_'+s)||s;}; var bC=function(s){return{confirmed:'p-gr',pending:'p-am',cancelled:'p-red',completed:'p-bl',active:'p-gr',rejected:'p-red'}[s]||'p-gy';}; var sampleAppts=[ {folio:'MPP7-A1B2',client_name:'Patricia Soto',pet_name:'Max',pet_type:'Dog',service_type:(t.svcs||[{name:'Boarding'}])[0].name,appt_date:'2026-06-10',appt_time:'09:00',status:'confirmed'}, {folio:'MPP7-C3D4',client_name:'Jorge Méndez',pet_name:'Luna',pet_type:'Cat',service_type:(t.svcs||[{name:'Boarding'},{name:'Drop-In'}])[2]?t.svcs[2].name:'Drop-In',appt_date:'2026-06-12',appt_time:'14:00',status:'pending'}, {folio:'MPP7-E5F6',client_name:'Laura Cruz',pet_name:'Rocky',pet_type:'Dog',service_type:(t.svcs||[{name:'Boarding'},{name:'Drop-In'},{name:'Walk'}])[4]?t.svcs[4].name:'Walking',appt_date:'2026-06-14',appt_time:'08:00',status:'pending'}, ]; var sampleSvcs=[ {title:lang==='fr'?'Pension chiens/chats':lang==='en'?'Dog/Cat boarding':'Alojamiento perros/gatos',cat:(t.svcs||[{name:'Boarding'}])[0].name,price:(t.svcs||[{name:'Boarding',price:'$28/night'}])[0].price,status:'active',views:328,reqs:14}, {title:lang==='fr'?'Promenade quotidienne':lang==='en'?'Daily dog walk':'Paseo diario',cat:(t.svcs||[{name:'Walk'}])[4]?t.svcs[4].name:'Walking',price:(t.svcs||[{name:'Walk',price:'$18/walk'}])[4]?t.svcs[4].price:'$18/walk',status:'active',views:187,reqs:8}, ]; if(tab==='overview'){ c.innerHTML='

'+tt('pro-welcome')+', María 🐾

'+tt('pro-dash-sub')+'

' +'
' +'
248
'+tt('pro-stat-views')+'
↑ 18%
' +'
14
'+tt('pro-stat-req')+'
↑ 5 '+(lang==='fr'?'nouv.':lang==='en'?'new':'nuevas')+'
' +'
9
'+tt('pro-stat-done')+'
✓ ok
' +'
4.9
'+tt('pro-stat-rating')+'
★ Top 5%
' +'
' +'

'+(lang==='fr'?'Prochains rendez-vous':lang==='en'?'Upcoming appointments':'Próximas citas')+'

3 '+tt('status_pending')+'
' +'' +sampleAppts.map(function(a){return'' +'';}).join('') +'
Folio'+(lang==='fr'?'Client':lang==='en'?'Client':'Cliente')+''+(lang==='fr'?'Animal':lang==='en'?'Pet':'Mascota')+''+(lang==='fr'?'Service':lang==='en'?'Service':'Servicio')+''+(lang==='fr'?'Date':lang==='en'?'Date':'Fecha')+'Status'+(lang==='fr'?'Action':lang==='en'?'Action':'Acción')+'
'+a.folio+''+a.client_name+'🐾 '+a.pet_name+' ('+a.pet_type+')'+a.service_type+''+a.appt_date+' '+a.appt_time+''+pill(stL(a.status),bC(a.status))+''+(a.status==='pending'?'':'')+'
' +'
'+(lang==='fr'?'Complétez votre profil pour apparaître en tête des résultats.':lang==='en'?'Complete your profile to appear at the top of search results.':'Completa tu perfil para aparecer primero en los resultados.')+'
'; } else if(tab==='profile'){ var specialties=(t.svcs||[]).map(function(s){return'';}).join(''); c.innerHTML='

'+tt('pro-profile')+'

' +'
'+tt('pro-profile-title')+'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'' +'' +'' +'
' +'
' +'
'+(lang==='fr'?'Photos et documents':lang==='en'?'Photos & documents':'Fotos y documentos')+'
' +'
' +'

'+tt('lbl-name')+'

JPG, PNG · Max 5MB
' +'

'+(lang==='fr'?'Jusqu\'à 8 photos':lang==='en'?'Up to 8 photos':'Hasta 8 fotos')+'

JPG, PNG
' +'

'+(lang==='fr'?'Télécharger ID':lang==='en'?'Upload ID':'Subir identificación')+'

PDF, JPG
' +'

'+(lang==='fr'?'Télécharger cert.':lang==='en'?'Upload certificate':'Subir certificado')+'

PDF, JPG
' +'
' +'
' +'
'; } else if(tab==='schedule'){ var days7=tt('days'); c.innerHTML='

'+tt('pro-schedule-title')+'

'+(lang==='fr'?'Définissez vos créneaux horaires disponibles':lang==='en'?'Set your available time slots':'Configura tus horarios disponibles')+'

' +'
'+(lang==='fr'?'Horaires hebdomadaires':lang==='en'?'Weekly schedule':'Horario semanal')+'
' +'
' +Array(7).fill(0).map(function(_,i){ var dayName=Array.isArray(days7)?days7[i]:''; return '
'+dayName+'
' +'
' +(i>=1&&i<=5?'
-
':'') +'
' +'' +'
'; }).join('') +'
' +'
' +'' +'
' +'
' +'
'+tt('pro-block-title')+'
' +'
' +'
' +'' +'' +'' +'
' +'
'+(lang==='fr'?'Aucune date bloquée pour le moment.':lang==='en'?'No blocked dates yet.':'Sin fechas bloqueadas aún.')+'
' +'
'; } else if(tab==='myservices'){ c.innerHTML='

'+tt('pro-my-svcs')+'

' +'

'+(lang==='fr'?'Services publiés':lang==='en'?'Published services':'Servicios publicados')+' ('+sampleSvcs.length+')

' +'
' +'' +sampleSvcs.map(function(s){return'' +'';}).join('') +'
'+tt('pro-my-svcs')+''+(lang==='fr'?'Catégorie':lang==='en'?'Category':'Categoría')+''+(lang==='fr'?'Prix':lang==='en'?'Price':'Precio')+'Status'+(lang==='fr'?'Vues':lang==='en'?'Views':'Vistas')+''+(lang==='fr'?'Demandes':lang==='en'?'Requests':'Solicitudes')+''+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+s.title+''+s.cat+''+s.price+''+pill(stL(s.status),bC(s.status))+''+s.views+''+s.reqs+'
'; } else if(tab==='requests'){ c.innerHTML='

'+tt('pro-requests')+'

' +sampleAppts.map(function(a){ return '
' +'
🐾
' +'
'+a.client_name+'
' +'
'+a.pet_name+' ('+a.pet_type+') · '+a.service_type+' · 📅 '+a.appt_date+' '+a.appt_time+'
' +pill(stL(a.status),bC(a.status)) +'
' +(a.status==='pending'?'':'') +'' +'
'; }).join(''); } else if(tab==='calendar'){ c.innerHTML='

'+tt('pro-calendar')+'

'+(lang==='fr'?'Vos rendez-vous et disponibilités':lang==='en'?'Your appointments and availability':'Tus citas y disponibilidad')+'

' +'
' +'
' +'
' +'
' +'
' +'

'+(lang==='fr'?'Rendez-vous du mois':lang==='en'?'This month\'s appointments':'Citas del mes')+'

' +'' +sampleAppts.map(function(a){return'';}).join('') +'
Folio'+(lang==='fr'?'Client':'Client')+''+(lang==='fr'?'Animal':lang==='en'?'Pet':'Mascota')+''+(lang==='fr'?'Date':'Date')+'Status
'+a.folio+''+a.client_name+''+a.pet_name+''+a.appt_date+' '+a.appt_time+''+pill(stL(a.status),bC(a.status))+'
'; renderProCalendar(); } else if(tab==='reviews'){ var revs=[ {name:'Patricia V.',rating:5,text:lang==='fr'?'Excellent service, très professionnel!':lang==='en'?'Excellent service, very professional!':'¡Excelente servicio, muy profesional!',date:'May 2026'}, {name:'Jorge M.',rating:5,text:lang==='fr'?'Mon chat était très bien soigné.':lang==='en'?'My cat was very well taken care of.':'Mi gato quedó muy bien atendido.',date:'May 2026'}, {name:'Laura C.',rating:4,text:lang==='fr'?'Bon service, je recommande.':lang==='en'?'Good service, I recommend.':'Buen servicio, lo recomiendo.',date:'Abr 2026'}, ]; var ratDist={5:75,4:18,3:5,2:1,1:1}; c.innerHTML='

'+tt('pro-reviews')+'

' +'
' +'
' +'
4.9
' +'
'+stars(4.9)+'
' +'
'+revs.length+' '+(lang==='fr'?'avis':lang==='en'?'reviews':'reseñas')+'
' +'
' +'
' +Object.entries(ratDist).reverse().map(function(kv){ return '
'+kv[0]+'
'+kv[1]+'%
'; }).join('')+'
' +revs.map(function(r){ return '
' +'
' +'
'+r.name[0]+'
' +'
'+r.name+'
' +'
'+stars(r.rating)+' '+r.date+'
' +'

"'+r.text+'"

' +'
'; }).join(''); } else if(tab==='post'){ var svcsOpts2=(t.svcs||[]).map(function(s){return'';}).join(''); c.innerHTML='

'+tt('pro-post')+'

' +'
' +'
'+(lang==='fr'?'Détails du service':lang==='en'?'Service details':'Detalles del servicio')+'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +Array(4).fill(0).map(function(_,i){return'

Photo '+(i+1)+'

';}).join('') +'
' +'
' +'' +'' +'
'; } } function publishSvcPro(){ var title=document.getElementById('post-title-pro')?document.getElementById('post-title-pro').value:''; var price=document.getElementById('post-price-pro')?document.getElementById('post-price-pro').value:''; var desc=document.getElementById('post-desc-pro')?document.getElementById('post-desc-pro').value:''; var al=document.getElementById('post-alert-pro'); if(!title||!price||!desc){if(al)al.innerHTML='
'+tt('required-fields')+'
';return;} if(al)al.innerHTML='
'+(lang==='fr'?'Service publié ! En attente de validation.':lang==='en'?'Service published! Pending review.':'¡Servicio publicado! Pendiente de revisión.')+'
'; setTimeout(function(){proTab('myservices',null);},2000); } function addSchedSlot(dow){ var db=document.getElementById('sched-day-'+dow); if(!db)return; var row=document.createElement('div');row.className='mpp7-sched-slot-row'; row.innerHTML='-'; db.appendChild(row); } function saveScheduleLocal(){showToast(lang==='fr'?'Planning enregistré !':lang==='en'?'Schedule saved!':'¡Horario guardado!');} function blockDateLocal(){ var date=document.getElementById('block-date-input')?document.getElementById('block-date-input').value:''; var reason=document.getElementById('block-reason-input')?document.getElementById('block-reason-input').value:''; if(!date){showToast(lang==='fr'?'Sélectionnez une date.':lang==='en'?'Select a date.':'Selecciona una fecha.','error');return;} showToast((lang==='fr'?'Date bloquée: ':lang==='en'?'Date blocked: ':'Fecha bloqueada: ')+date); var bl=document.getElementById('blocked-list'); if(bl)bl.innerHTML='
📅 '+date+(reason?' — '+reason:'')+'
'+(bl.innerHTML==='

'+(lang==='fr'?'Aucune date bloquée pour le moment.':lang==='en'?'No blocked dates yet.':'Sin fechas bloqueadas aún.')+'

'?'':bl.innerHTML); } var proCalYear=new Date().getFullYear();var proCalMonth=new Date().getMonth(); function calNavPro(dir){proCalMonth+=dir;if(proCalMonth<0){proCalMonth=11;proCalYear--;}if(proCalMonth>11){proCalMonth=0;proCalYear++;}renderProCalendar();} function renderProCalendar(){ var dowW=document.getElementById('mpp7-pro-cal-dow');var daysW=document.getElementById('mpp7-pro-cal-days');var lbl=document.getElementById('mpp7-pro-cal-month'); if(!dowW||!daysW)return; var days7=tt('days');var months=(d().months||[]); if(lbl&&Array.isArray(months))lbl.textContent=(months[proCalMonth]||'')+' '+proCalYear; if(Array.isArray(days7))dowW.innerHTML=days7.map(function(dd){return'
'+dd+'
';}).join(''); var first=new Date(proCalYear,proCalMonth,1);var total=new Date(proCalYear,proCalMonth+1,0).getDate();var startDow=first.getDay(); var today=new Date();today.setHours(0,0,0,0); var apptDates=['2026-06-10','2026-06-12','2026-06-14']; var html=Array(startDow).fill('
').join(''); for(var i=1;i<=total;i++){ var dt=new Date(proCalYear,proCalMonth,i);var past=dt-1; html+='
'+i+(hasA?'':'')+'
'; } daysW.innerHTML=html; } /* ── USER DASHBOARD ── */ function userTab(tab,btn){ document.querySelectorAll('#mpp7pg-user .mpp7-sb-item').forEach(function(b){b.classList.remove('act');}); if(btn)btn.classList.add('act'); renderUserTab(tab); } function renderUserTab(tab){ var c=document.getElementById('mpp7-user-content'); if(!c)return; var t=d(); var pill=function(s,cl){return''+s+'';}; var stL=function(s){return tt('status_'+s)||s;}; var bC=function(s){return{confirmed:'p-gr',pending:'p-am',cancelled:'p-red',completed:'p-bl'}[s]||'p-gy';}; var userAppts=[ {folio:'MPP7-A1B2',provider:'María García',pet:'Max (Dog)',service:(t.svcs||[{name:'Boarding'}])[0].name,date:'2026-06-10',time:'09:00',status:'confirmed',price:'$28'}, {folio:'MPP7-G7H8',provider:'Carlos López',pet:'Rocky (Dog)',service:(t.svcs||[{name:'Boarding'},{},{},{},{name:'Walk'}])[4]?t.svcs[4].name:'Walking',date:'2026-06-14',time:'08:00',status:'pending',price:'$18'}, ]; if(tab==='appointments'){ c.innerHTML='

'+tt('user-my-appts')+'

'+tt('user-dash-sub')+'

' +'
' +'
'+userAppts.length+'
'+(lang==='fr'?'Total RDV':lang==='en'?'Total appts':'Total citas')+'
' +'
'+userAppts.filter(function(a){return a.status==='confirmed';}).length+'
'+stL('confirmed')+'
' +'
'+userAppts.filter(function(a){return a.status==='pending';}).length+'
'+stL('pending')+'
' +'
0
'+stL('completed')+'
' +'
' +'
'+(lang==='fr'?'Cliquez sur "Agendar cita" pour réserver un nouveau rendez-vous.':lang==='en'?'Click "Book appointment" to schedule a new one.':'Haz clic en "Agendar cita" para reservar una nueva cita.')+'
' +'

'+tt('user-my-appts')+'

' +'' +userAppts.map(function(a){return'';}).join('') +'
Folio'+(lang==='fr'?'Prestataire':lang==='en'?'Provider':'Proveedor')+''+(lang==='fr'?'Animal':lang==='en'?'Pet':'Mascota')+''+(lang==='fr'?'Service':lang==='en'?'Service':'Servicio')+''+(lang==='fr'?'Date':lang==='en'?'Date':'Fecha')+''+(lang==='fr'?'Prix':lang==='en'?'Price':'Precio')+'Status'+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+a.folio+''+a.provider+''+a.pet+''+a.service+''+a.date+' '+a.time+''+a.price+''+pill(stL(a.status),bC(a.status))+'
'; } else if(tab==='pets'){ c.innerHTML='

'+tt('user-my-pets')+'

' +'
'+(lang==='fr'?'Mes animaux':lang==='en'?'My pets':'Mis mascotas')+'
' +'
' +'
' +'
🐕
Max
' +'
Labrador · 3 años
' +''+(lang==='fr'?'Principal':lang==='en'?'Primary':'Principal')+'' +'
' +'
' +'' +'
'+(lang==='fr'?'Ajouter animal':lang==='en'?'Add pet':'Agregar mascota')+'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
'; } else if(tab==='favorites'){ c.innerHTML='

'+tt('user-favorites')+'

' +'
' +(d().providers||[]).slice(0,2).map(function(p,i){ return '
' +'
🐾'+p.badge+'
' +'
' +'
'+p.ini+'
' +'
'+p.name+'
'+p.spec+'
' +'
'+stars(p.rating)+''+p.rating+'
' +'
'+p.price+'
' +'' +'
'; }).join('')+'
'; } } /* ── ADMIN DASHBOARD ── */ function adminTab(tab,btn){ document.querySelectorAll('#mpp7pg-admin .mpp7-sb-item').forEach(function(b){b.classList.remove('act');}); if(btn)btn.classList.add('act'); renderAdminTab(tab); } function renderAdminTab(tab){ var c=document.getElementById('mpp7-admin-content'); if(!c)return; var t=d(); var pill=function(s,cl){return''+s+'';}; var stL=function(s){return tt('status_'+s)||s;}; var bC=function(s){return{confirmed:'p-gr',active:'p-gr',pending:'p-am',cancelled:'p-red',completed:'p-bl',rejected:'p-red',inactive:'p-gy'}[s]||'p-gy';}; var provs=[ {id:1,name:'María García',spec:'Boarding',city:'CDMX',status:'active',rating:5.0,reviews:142,ini:'MG',color:'#7c3aed'}, {id:2,name:'Carlos López',spec:'Dog Walking',city:'GDL',status:'pending',rating:4.9,reviews:87,ini:'CL',color:'#0369a1'}, {id:3,name:'Ana Martínez',spec:'House Sitting',city:'MTY',status:'active',rating:4.8,reviews:63,ini:'AM',color:'#b45309'}, {id:4,name:'Luis Ramírez',spec:'Grooming',city:'CDMX',status:'rejected',rating:5.0,reviews:201,ini:'LR',color:'#0f766e'}, ]; var appts=[ {folio:'MPP7-A1B2',client:'Patricia Soto',pet:'Max (Dog)',provider:'María García',date:'2026-06-10',time:'09:00',service:'Boarding',status:'confirmed'}, {folio:'MPP7-C3D4',client:'Jorge Méndez',pet:'Luna (Cat)',provider:'Carlos López',date:'2026-06-12',time:'14:00',service:'Drop-In',status:'pending'}, {folio:'MPP7-E5F6',client:'Laura Cruz',pet:'Rocky (Dog)',provider:'Ana Martínez',date:'2026-06-14',time:'08:00',service:'Walking',status:'pending'}, ]; var users=[ {id:1,name:'Patricia Soto',email:'patricia@email.com',pet:'Max (Dog)',city:'CDMX',appts:3,status:'active'}, {id:2,name:'Jorge Méndez',email:'jorge@email.com',pet:'Luna (Cat)',city:'GDL',appts:1,status:'active'}, {id:3,name:'Laura Cruz',email:'laura@email.com',pet:'Rocky (Dog)',city:'MTY',appts:2,status:'active'}, ]; if(tab==='overview'){ c.innerHTML='

'+tt('adm-overview')+'

MyPetPro7.com — '+(lang==='fr'?'Tableau de bord':lang==='en'?'Dashboard':'Panel')+'

' +'
' +'
'+provs.length+'
'+tt('adm-providers')+'
↑ 2 '+(lang==='fr'?'nouv.':lang==='en'?'new':'nuevos')+'
' +'
'+users.length+'
'+tt('adm-users')+'
↑ 3 '+(lang==='fr'?'nouv.':lang==='en'?'new':'nuevos')+'
' +'
'+appts.length+'
'+tt('adm-appts')+'
↑ '+appts.filter(function(a){return a.status==='pending';}).length+' '+tt('status_pending')+'
' +'
'+provs.filter(function(p){return p.status==='pending';}).length+'
'+(lang==='fr'?'En attente approbation':lang==='en'?'Pending approval':'Pendientes aprobación')+'
! '+(lang==='fr'?'Action requise':lang==='en'?'Action required':'Requiere acción')+'
' +'
' +'
' +'

'+(lang==='fr'?'Prestataires récents':lang==='en'?'Recent providers':'Proveedores recientes')+'

' +'' +provs.map(function(p){return'';}).join('') +'
'+(lang==='fr'?'Nom':lang==='en'?'Name':'Nombre')+'Status'+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+p.ini+'
'+p.name+'
'+pill(stL(p.status),bC(p.status))+'
' +'

'+(lang==='fr'?'Derniers rendez-vous':lang==='en'?'Latest appointments':'Últimas citas')+'

' +'' +appts.map(function(a){return'';}).join('') +'
Folio'+(lang==='fr'?'Client':lang==='en'?'Client':'Cliente')+''+(lang==='fr'?'Date':lang==='en'?'Date':'Fecha')+'Status
'+a.folio+''+a.client+''+a.date+''+pill(stL(a.status),bC(a.status))+'
' +'
' +'
📋 Shortcodes WordPress
' +'' +[['[mypetpro7]','Plataforma completa — home, búsqueda, secciones'],['[mypetpro7_calendar]','Calendario de citas público'],['[mypetpro7_provider]','Panel del proveedor (requiere login)'],['[mypetpro7_user]','Panel del usuario (requiere login)']].map(function(s){ return''; }).join('') +'
'+s[0]+''+s[1]+'
'; } else if(tab==='providers'){ c.innerHTML='

'+tt('adm-providers')+'

' +'
' +['all','active','pending','rejected'].map(function(f){var cnt=f==='all'?provs.length:provs.filter(function(p){return p.status===f;}).length;return'';}).join('') +'
' +provs.map(function(p){ return '
' +'
'+p.ini+'
' +'
'+p.name+' '+pill(stL(p.status),bC(p.status))+'
' +'
'+p.spec+' · '+p.city+' · ★ '+p.rating+' ('+p.reviews+')
' +'
' +'' +'' +'' +'
'; }).join(''); } else if(tab==='users'){ c.innerHTML='

'+tt('adm-users')+'

' +'

'+tt('adm-users')+' ('+users.length+')

' +'' +users.map(function(u){return'';}).join('') +'
'+(lang==='fr'?'Nom':lang==='en'?'Name':'Nombre')+'Email'+(lang==='fr'?'Animal':lang==='en'?'Pet':'Mascota')+''+(lang==='fr'?'Ville':lang==='en'?'City':'Ciudad')+''+(lang==='fr'?'Citas':lang==='en'?'Appts':'Citas')+'Status'+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+u.name+''+u.email+''+u.pet+''+u.city+''+u.appts+''+pill(stL(u.status),bC(u.status))+'
'; } else if(tab==='appointments'){ c.innerHTML='

'+tt('adm-appts')+'

' +'
' +'
'+appts.length+'
Total
' +'
'+appts.filter(function(a){return a.status==='pending';}).length+'
'+stL('pending')+'
' +'
'+appts.filter(function(a){return a.status==='confirmed';}).length+'
'+stL('confirmed')+'
' +'
0
'+stL('completed')+'
' +'
' +'

'+tt('adm-appts')+'

' +'' +appts.map(function(a){return'' +'';}).join('') +'
Folio'+(lang==='fr'?'Client':lang==='en'?'Client':'Cliente')+''+(lang==='fr'?'Animal':lang==='en'?'Pet':'Mascota')+''+(lang==='fr'?'Prestataire':lang==='en'?'Provider':'Proveedor')+''+(lang==='fr'?'Date':'Date')+'Status'+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+a.folio+''+a.client+''+a.pet+''+a.provider+''+a.date+' '+a.time+''+pill(stL(a.status),bC(a.status))+'
'; } else if(tab==='services'){ var svcsA=[ {title:(t.svcs||[{name:'Boarding'}])[0].name,cat:'Boarding',prov:'María García',price:'$28/night',status:'active',views:328}, {title:(t.svcs||[{},{name:'Walking'}])[1]?t.svcs[1].name:'House Sitting',cat:'House Sitting',prov:'Ana Martínez',price:'$30/night',status:'active',views:187}, {title:(t.svcs||[{},{},{name:'Grooming'}])[5]?t.svcs[5].name:'Grooming',cat:'Grooming',prov:'Luis Ramírez',price:'$35/session',status:'pending',views:0}, ]; c.innerHTML='

'+tt('adm-svcs')+'

' +'
' +svcsA.map(function(s){return'';}).join('') +'
'+(lang==='fr'?'Service':lang==='en'?'Service':'Servicio')+''+(lang==='fr'?'Catégorie':lang==='en'?'Category':'Categoría')+''+(lang==='fr'?'Prestataire':lang==='en'?'Provider':'Proveedor')+''+(lang==='fr'?'Prix':lang==='en'?'Price':'Precio')+'Status'+(lang==='fr'?'Vues':lang==='en'?'Views':'Vistas')+''+(lang==='fr'?'Actions':lang==='en'?'Actions':'Acciones')+'
'+s.title+''+s.cat+''+s.prov+''+s.price+''+pill(stL(s.status),bC(s.status))+''+s.views+'
'; } else if(tab==='messages'){ var msgs=[ {name:'Patricia S.',subject:lang==='fr'?'Question sur la pension':lang==='en'?'Boarding question':'Pregunta sobre alojamiento',date:'2026-05-20',status:'unread'}, {name:'Jorge M.',subject:lang==='fr'?'Problème avec ma réservation':lang==='en'?'Issue with my booking':'Problema con mi reserva',date:'2026-05-19',status:'read'}, ]; c.innerHTML='

'+tt('adm-msgs')+'

' +msgs.map(function(m){return'
'+m.name+' — '+m.subject+'
'+m.date+'
';}).join(''); } else if(tab==='reviews'){ c.innerHTML='

'+tt('adm-reviews')+'

' +'
' +'
'+[142,87,63].reduce(function(a,b){return a+b;},0)+'
Total '+(lang==='fr'?'avis':lang==='en'?'reviews':'reseñas')+'
' +'
4.9
'+(lang==='fr'?'Note moyenne':lang==='en'?'Avg rating':'Calificación prom.')+'
' +'
98%
'+(lang==='fr'?'5 étoiles':lang==='en'?'5 stars':'5 estrellas')+'
' +'
0
'+(lang==='fr'?'Signalements':lang==='en'?'Reports':'Reportes')+'
' +'
' +[{name:'Patricia V.',text:lang==='fr'?'Excellent !':lang==='en'?'Excellent!':'¡Excelente!',rating:5,prov:'María García'},{name:'Jorge M.',text:lang==='fr'?'Très bon service':lang==='en'?'Very good service':'Muy buen servicio',rating:4,prov:'Carlos López'}].map(function(r){ return '
' +'
'+r.name[0]+'
' +'
'+r.name+' → '+r.prov+'
' +'
'+stars(r.rating)+'
' +'
"'+r.text+'"
' +'
'; }).join(''); } else if(tab==='settings'){ c.innerHTML='

'+tt('adm-settings')+'

' +'
'+(lang==='fr'?'Paramètres généraux':lang==='en'?'General settings':'Ajustes generales')+'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
' +'
'; } } function admApprove(id,status){showToast((status==='active'?'✅ ':status==='rejected'?'❌ ':'')+tt('status_'+status)+': Provider #'+id);} /* ── INIT ── */ window.addEventListener('DOMContentLoaded',function(){ applyT(); document.querySelectorAll('.mpp7-overlay, #mpp7-modal-bg').forEach(function(bg){ bg.addEventListener('click',function(e){if(e.target===bg)closeModal();}); }); }); /* ── GLOBAL EXPORTS ── */ Object.assign(window,{ setMPP7Lang:setLang,goPage:goPage,openModal:openModal,closeModal:closeModal, openBookingModal:openBookingModal,submitBookModal:submitBookModal,showModalSuccess:showModalSuccess, calNav:calNav,calPickDay:calPickDay,calPickSlot:calPickSlot,calConfirmBook:calConfirmBook,calReset:calReset, proTab:proTab,userTab:userTab,adminTab:adminTab, selTab:selTab,addSchedSlot:addSchedSlot,saveScheduleLocal:saveScheduleLocal,blockDateLocal:blockDateLocal, publishSvcPro:publishSvcPro,admApprove:admApprove,calNavPro:calNavPro,showToast:showToast, }); })();