<!DOCTYPE html>
<html dir="rtl" lang="ar">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>السفر والترفيه والضيافة – مزايا منسوبي UPM</title>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-firestore-compat.js"></script>
<script>
const FIREBASE_CONFIG = {
apiKey: "AIzaSyCBvuJ907YcP5ybsGn41G_zwnb83N-sbkk",
authDomain: "upm-mazaya.firebaseapp.com",
projectId: "upm-mazaya",
storageBucket: "upm-mazaya.firebasestorage.app",
messagingSenderId: "271717030243",
appId: "1:271717030243:web:e9964b0d6e8d24bba5db56"
};
firebase.initializeApp(FIREBASE_CONFIG);
const db = firebase.firestore();
db.settings({ experimentalForceLongPolling: true, merge: true });
</script>
</head>
<body style="background-color:#fafaf8;font-family:'Cairo',Tahoma,sans-serif;margin:0;padding:0;">
<!-- HERO -->
<div style="background-color:#0a3d62;background-image:linear-gradient(135deg,#0a3d62 0%,#1a5276 60%,#16213e 100%);padding:60px 60px 50px;">
<div style="max-width:1180px;margin:0 auto;">
<a href="mazaya-complete.html" style="align-items:center;color:rgba(255,255,255,0.6);display:inline-flex;font-size:13px;gap:6px;margin-bottom:24px;text-decoration:none;">→ العودة للصفحة الرئيسية</a>
<div style="align-items:center;display:flex;gap:20px;">
<div style="align-items:center;background-color:rgba(255,255,255,0.12);border-radius:20px;display:flex;font-size:40px;height:72px;justify-content:center;width:72px;">🏨</div>
<div>
<div style="color:rgba(201,168,76,0.9);font-size:13px;letter-spacing:1.5px;margin-bottom:6px;"><strong>— شركاء البرنامج</strong></div>
<h1 style="color:#ffffff;font-size:36px;margin:0 0 6px 0;"><strong>السفر والترفيه والضيافة</strong></h1>
<p style="color:rgba(255,255,255,0.65);font-size:15px;margin:0;">عروض خاصة على الفنادق والمنتجعات وخدمات السفر والوجهات الترفيهية</p>
</div>
</div>
<div style="align-items:center;background-color:rgba(255,255,255,0.07);border-radius:16px;display:flex;flex-wrap:wrap;gap:32px;margin-top:36px;padding:20px 28px;">
<div style="text-align:center;"><div id="statCount" style="color:#f0d080;font-size:28px;font-weight:800;">—</div><div style="color:rgba(255,255,255,0.5);font-size:12px;margin-top:2px;">شريك معتمد</div></div>
<div style="background-color:rgba(255,255,255,0.15);height:40px;width:1px;"></div>
<div style="text-align:center;"><div id="statRating" style="color:#f0d080;font-size:28px;font-weight:800;">—</div><div style="color:rgba(255,255,255,0.5);font-size:12px;margin-top:2px;">متوسط التقييم</div></div>
<div style="background-color:rgba(255,255,255,0.15);height:40px;width:1px;"></div>
<div style="flex:1;"><p style="color:rgba(255,255,255,0.6);font-size:13px;line-height:1.7;margin:0;">يمكن لمنسوبي الجامعة الاستفادة من جميع العروض المدرجة بإبراز ما يثبت انتماءهم للجامعة.</p></div>
</div>
</div>
</div>
<!-- GRID -->
<div style="margin:0 auto;max-width:1180px;padding:56px 60px;">
<div id="loadingState" style="padding:60px 0;text-align:center;"><div style="color:#0a3d62;font-size:15px;">⏳ جارٍ تحميل الشركاء...</div></div>
<div id="emptyState" style="display:none;padding:80px 0;text-align:center;">
<div style="font-size:52px;margin-bottom:16px;">🏨</div>
<h2 style="color:#0a3d62;font-size:22px;margin:0 0 10px 0;">لا يوجد شركاء حتى الآن</h2>
<p style="color:#7f8c8d;font-size:15px;margin:0 0 28px 0;">سيظهر شركاء السفر والترفيه والضيافة هنا بمجرد اعتمادهم</p>
<a href="mazaya-complete.html" style="background-color:#c9a84c;border-radius:12px;color:#0a3d62;display:inline-block;font-size:15px;font-weight:700;padding:14px 32px;text-decoration:none;">سجّل منشأتك كشريك ←</a>
</div>
<div id="partnersGrid" style="display:grid;gap:24px;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));"></div>
</div>
<!-- CTA -->
<div style="background-color:#f4f4f0;border-top:1px solid #e8e8e0;padding:60px;">
<div style="align-items:center;background-color:#0a3d62;background-image:linear-gradient(135deg,#0a3d62 0%,#16213e 100%);border-radius:20px;display:flex;flex-wrap:wrap;gap:32px;justify-content:space-between;margin:0 auto;max-width:1060px;padding:48px 56px;">
<div>
<h2 style="color:#ffffff;font-size:22px;margin:0 0 10px 0;"><strong>هل منشأتك في قطاع السفر والترفيه والضيافة؟</strong></h2>
<p style="color:rgba(255,255,255,0.65);font-size:15px;line-height:1.8;margin:0;">انضم كشريك وقدّم عروضك لآلاف منسوبي جامعة الأمير مقرن.</p>
</div>
<a href="mazaya-complete.html" style="background-color:#c9a84c;border-radius:12px;color:#0a3d62;font-size:15px;font-weight:700;padding:14px 32px;text-decoration:none;white-space:nowrap;"><strong>سجّل الآن ←</strong></a>
</div>
</div>
<!-- RATING MODAL -->
<div id="ratingModal" onclick="if(event.target===this)closeRating()" style="align-items:center;background-color:rgba(10,61,98,0.6);bottom:0;display:none;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:9999;">
<div style="background-color:#ffffff;border-radius:20px;max-width:440px;padding:36px 40px;position:relative;text-align:center;width:90%;">
<button onclick="closeRating()" style="background:rgba(0,0,0,0.07);border:none;border-radius:50%;color:#0a3d62;cursor:pointer;font-size:16px;height:34px;left:14px;position:absolute;top:14px;width:34px;">✕</button>
<div id="ratingPartnerName" style="color:#0a3d62;font-size:18px;font-weight:800;margin-bottom:6px;"></div>
<div style="color:#7f8c8d;font-size:13px;margin-bottom:24px;">كيف تقيّم تجربتك مع هذا الشريك؟</div>
<div id="starRow" style="display:flex;gap:8px;justify-content:center;margin-bottom:24px;"><button class="star-btn" onclick="selectStar(1)" onmouseover="updateStars(1)" onmouseout="updateStars(selectedStars)" style="background:none;border:none;color:#ddd;cursor:pointer;font-size:36px;padding:4px;transition:all 0.15s;">★</button><button class="star-btn" onclick="selectStar(2)" onmouseover="updateStars(2)" onmouseout="updateStars(selectedStars)" style="background:none;border:none;color:#ddd;cursor:pointer;font-size:36px;padding:4px;transition:all 0.15s;">★</button><button class="star-btn" onclick="selectStar(3)" onmouseover="updateStars(3)" onmouseout="updateStars(selectedStars)" style="background:none;border:none;color:#ddd;cursor:pointer;font-size:36px;padding:4px;transition:all 0.15s;">★</button><button class="star-btn" onclick="selectStar(4)" onmouseover="updateStars(4)" onmouseout="updateStars(selectedStars)" style="background:none;border:none;color:#ddd;cursor:pointer;font-size:36px;padding:4px;transition:all 0.15s;">★</button><button class="star-btn" onclick="selectStar(5)" onmouseover="updateStars(5)" onmouseout="updateStars(selectedStars)" style="background:none;border:none;color:#ddd;cursor:pointer;font-size:36px;padding:4px;transition:all 0.15s;">★</button></div>
<button id="submitRating" onclick="submitRating()" disabled style="background-color:#aaa;border-radius:10px;border:none;color:#fff;cursor:not-allowed;font-family:'Cairo',sans-serif;font-size:15px;font-weight:700;padding:12px 36px;transition:all 0.2s;width:100%;">أرسل التقييم</button>
<div id="ratingMsg" style="display:none;margin-top:12px;"></div>
</div>
</div>
<script>
const CATEGORY = "سفر وضيافة";
let currentPartnerId = null;
let selectedStars = 0;
let partners = [];
let ratingPartnerName = '';
async function loadPartners() {
try {
const snap = await db.collection('partner_requests')
.where('status','==','approved')
.where('offer.category','==', CATEGORY)
.get();
const raw = snap.docs.map(d => ({id: d.id, ...d.data()}));
partners = await Promise.all(raw.map(async p => {
const rSnap = await db.collection('ratings').where('partnerId','==', p.id).get();
const stars = rSnap.docs.map(r => r.data().stars);
p.ratingCount = stars.length;
p.ratingAvg = stars.length ? (stars.reduce((a,b)=>a+b,0)/stars.length).toFixed(1) : null;
return p;
}));
document.getElementById('loadingState').style.display = 'none';
if (partners.length === 0) {
document.getElementById('emptyState').style.display = 'block';
return;
}
const rated = partners.filter(p => p.ratingAvg);
const avgAll = rated.length ? (rated.reduce((s,p)=>s+parseFloat(p.ratingAvg),0)/rated.length).toFixed(1) : '—';
document.getElementById('statCount').textContent = partners.length;
document.getElementById('statRating').textContent = avgAll !== '—' ? avgAll + ' ★' : '—';
renderPartners();
} catch(e) {
console.error(e);
document.getElementById('loadingState').innerHTML = '<div style="color:#e74c3c;font-size:14px;">❌ خطأ في تحميل البيانات</div>';
}
}
function renderPartners() {
const grid = document.getElementById('partnersGrid');
grid.innerHTML = partners.map(p => {
const name = p.businessInfo && p.businessInfo.name ? p.businessInfo.name : 'شريك';
const desc = p.offer && p.offer.description ? p.offer.description : '—';
const city = p.businessInfo && p.businessInfo.city ? p.businessInfo.city : '';
const branches = p.offer && p.offer.branches ? p.offer.branches : '';
const start = p.offer && p.offer.startDate ? p.offer.startDate : '';
const end = p.offer && p.offer.endDate ? p.offer.endDate : '';
const avg = p.ratingAvg ? parseFloat(p.ratingAvg) : 0;
const count = p.ratingCount || 0;
const full = Math.floor(avg);
const empty = 5 - full;
const starsDisp = '<span style="color:#f0b429;">' + '★'.repeat(full) + '</span><span style="color:#ddd;">' + '★'.repeat(empty) + '</span>';
const cityHtml = city ? '<div style="color:#7f8c8d;font-size:12px;margin-top:2px;">📍 ' + city + '</div>' : '';
const branchHtml = branches ? '<span style="background-color:#f4f4f0;border-radius:6px;color:#555;font-size:11px;padding:4px 10px;">🏢 ' + branches + '</span>' : '';
const startHtml = start ? '<span style="background-color:#f4f4f0;border-radius:6px;color:#555;font-size:11px;padding:4px 10px;">📅 من ' + start + '</span>' : '';
const endHtml = end ? '<span style="background-color:#f4f4f0;border-radius:6px;color:#555;font-size:11px;padding:4px 10px;">حتى ' + end + '</span>' : '';
const ratingDisp = avg > 0
? '<div style="text-align:center;"><div style="font-size:17px;">' + starsDisp + '</div><div style="color:#aaa;font-size:11px;margin-top:2px;">' + avg + ' / 5 (' + count + ' تقييم)</div></div>'
: '<div style="background-color:#f8f9fc;border-radius:8px;color:#aaa;font-size:11px;padding:6px 10px;">لا يوجد تقييم بعد</div>';
return '<div style="background-color:#ffffff;border-radius:18px;border:1px solid #e8e8e0;display:flex;flex-direction:column;overflow:hidden;transition:box-shadow 0.2s;" onmouseover="this.style.boxShadow=\'0 6px 24px rgba(10,61,98,0.1)\'" onmouseout="this.style.boxShadow=\'none\'">'
+ '<div style="background-color:#f4f6fa;border-bottom:1px solid #e8e8e0;padding:22px 24px;">'
+ '<div style="align-items:center;display:flex;gap:14px;justify-content:space-between;">'
+ '<div style="align-items:center;display:flex;gap:12px;">'
+ '<div style="align-items:center;background-color:#fff;border-radius:14px;border:1px solid #e8e8e0;display:flex;font-size:26px;height:52px;justify-content:center;width:52px;">🏨</div>'
+ '<div><div style="color:#0a3d62;font-size:16px;font-weight:800;">' + name + '</div>' + cityHtml + '</div></div>'
+ ratingDisp + '</div></div>'
+ '<div style="flex:1;padding:20px 24px;">'
+ '<div style="background-color:#f0f6ff;border-radius:10px;border-right:3px solid #0a3d62;margin-bottom:16px;padding:12px 16px;">'
+ '<div style="color:#1a5276;font-size:11px;font-weight:700;margin-bottom:4px;">🎁 العرض المقدَّم</div>'
+ '<div style="color:#0a3d62;font-size:14px;line-height:1.8;">' + desc + '</div></div>'
+ '<div style="display:flex;flex-wrap:wrap;gap:8px;">' + branchHtml + startHtml + endHtml + '</div></div>'
+ '<div style="border-top:1px solid #e8e8e0;padding:14px 24px;">'
+ '<button onclick="openRating(\'' + p.id + '\',\'' + name.replace(/'/g,"\\'") + '\')" style="background-color:#0a3d62;border-radius:10px;border:none;color:#fff;cursor:pointer;font-family:\'Cairo\',sans-serif;font-size:13px;font-weight:700;padding:10px;width:100%;">★ قيّم تجربتك</button></div></div>';
}).join('');
}
function openRating(id, name) {
currentPartnerId = id; ratingPartnerName = name; selectedStars = 0;
document.getElementById('ratingPartnerName').textContent = name;
const btn = document.getElementById('submitRating');
btn.disabled = true; btn.style.backgroundColor = '#aaa'; btn.style.cursor = 'not-allowed'; btn.textContent = 'أرسل التقييم';
document.getElementById('ratingMsg').style.display = 'none';
updateStars(0);
document.getElementById('ratingModal').style.display = 'flex';
}
function closeRating() {
document.getElementById('ratingModal').style.display = 'none';
currentPartnerId = null;
}
function selectStar(n) {
selectedStars = n; updateStars(n);
const btn = document.getElementById('submitRating');
btn.disabled = false; btn.style.backgroundColor = '#c9a84c'; btn.style.color = '#0a3d62'; btn.style.cursor = 'pointer';
}
function updateStars(n) {
document.querySelectorAll('.star-btn').forEach((s,i) => {
s.style.color = i < n ? '#f0b429' : '#ddd';
s.style.transform = i < n ? 'scale(1.2)' : 'scale(1)';
});
}
async function submitRating() {
if (!currentPartnerId || !selectedStars) return;
const btn = document.getElementById('submitRating');
btn.textContent = '⏳ جارٍ الإرسال...'; btn.disabled = true;
try {
await db.collection('ratings').add({
partnerId: currentPartnerId, partnerName: ratingPartnerName,
category: CATEGORY, stars: selectedStars,
createdAt: firebase.firestore.FieldValue.serverTimestamp()
});
const msg = document.getElementById('ratingMsg');
msg.style.display='block'; msg.style.backgroundColor='#d4edda'; msg.style.borderRadius='8px';
msg.style.color='#155724'; msg.style.fontSize='13px'; msg.style.padding='10px';
msg.textContent = '✅ شكراً! تم إرسال تقييمك بنجاح';
btn.textContent = 'تم ✓'; btn.style.backgroundColor = '#2ecc71';
setTimeout(() => { closeRating(); loadPartners(); }, 1800);
} catch(e) {
console.error(e);
const msg = document.getElementById('ratingMsg');
msg.style.display='block'; msg.style.backgroundColor='#f8d7da';
msg.style.color='#721c24'; msg.style.fontSize='13px'; msg.style.padding='10px';
msg.textContent = '❌ خطأ — حاول مجدداً';
btn.textContent = 'أرسل التقييم'; btn.disabled = false;
}
}
loadPartners();
</script>
</body>
</html>