ÿØÿà 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 '
';
}).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 '
';
}).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='
';});
}
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='
';
}
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'?'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='
'+(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')+'
';
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='
';
}).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='
'+(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.')+'
'
+[['[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'
';
}
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='