[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: group_game.js
// Group Game JavaScript let currentTimer = null; $(document).ready(function() { console.log('Group Game JavaScript loaded'); console.log('Game data:', gameData); initializeGame(); playSound('gameStart'); }); function initializeGame() { console.log('Initializing game...'); updateGroupDisplay(); updateScoreDisplay(); // Highlight first group highlightActiveGroup(0); console.log('Group Game initialized with', gameData.groups.length, 'groups'); console.log('Available cards:', gameData.cards.length); } function selectCard(cardNumber) { console.log('Selecting card:', cardNumber); console.log('Cards disabled:', gameData.cards_disabled); console.log('Available cards:', gameData.cards.length); if (gameData.cards_disabled) { console.log('Cards are disabled, showing alert'); showAlert('انتظر حتى انتهاء الدور الحالي', 'warning'); return; } if (gameData.used_cards.includes(cardNumber)) { console.log('Card already used:', cardNumber); showAlert('هذه البطاقة مستخدمة بالفعل', 'warning'); return; } if (!gameData.cards || gameData.cards.length === 0) { console.log('No cards available'); showAlert('لا توجد بطاقات متاحة', 'error'); return; } if (cardNumber > gameData.cards.length) { console.log('Invalid card number:', cardNumber, 'max:', gameData.cards.length); showAlert('رقم البطاقة غير صحيح', 'error'); return; } console.log('Card selection valid, proceeding...'); // Disable all cards during question $('.game-card').addClass('disabled').css('pointer-events', 'none'); gameData.cards_disabled = true; // Mark card as used gameData.used_cards.push(cardNumber); $(`[data-card-number="${cardNumber}"]`).addClass('used'); const selectedCard = gameData.cards[cardNumber - 1]; console.log('Selected card data:', selectedCard); // Select random student from current group const currentGroup = gameData.groups[gameData.current_group]; console.log('Current group:', currentGroup); // Show student selection animation showStudentSelection(currentGroup.students, (selectedStudent) => { console.log('Selected student:', selectedStudent); setTimeout(() => { processCard(selectedCard, cardNumber); }, 1000); }); playSound('cardFlip'); } function showStudentSelection(students, callback) { if (!students || students.length === 0) { callback('طالب'); return; } const $studentDisplay = $('#selectedStudent'); const $studentDisplayTop = $('#selectedStudentTop'); const $selectionContainer = $('.student-selection'); const $selectionContainerTop = $('.student-selection-top'); // Add spinning animation $selectionContainer.addClass('selecting'); $selectionContainerTop.addClass('selecting'); let currentIndex = 0; let rotations = 0; const maxRotations = students.length * 3 + Math.floor(Math.random() * students.length); const baseSpeed = 100; let currentSpeed = baseSpeed; const interval = setInterval(() => { $studentDisplay.text(students[currentIndex]); $studentDisplayTop.text(students[currentIndex]); $studentDisplay.addClass('student-highlight'); $studentDisplayTop.addClass('student-highlight'); setTimeout(() => { $studentDisplay.removeClass('student-highlight'); $studentDisplayTop.removeClass('student-highlight'); }, currentSpeed / 2); currentIndex = (currentIndex + 1) % students.length; rotations++; // Gradually slow down if (rotations > maxRotations * 0.7) { currentSpeed += 20; } if (rotations >= maxRotations) { clearInterval(interval); // Final selection with dramatic effect const finalIndex = Math.floor(Math.random() * students.length); $studentDisplay.text(students[finalIndex]); $studentDisplayTop.text(students[finalIndex]); $studentDisplay.addClass('student-selected'); $studentDisplayTop.addClass('student-selected'); $selectionContainer.removeClass('selecting'); $selectionContainerTop.removeClass('selecting'); // Celebration effect setTimeout(() => { $studentDisplay.removeClass('student-selected'); $studentDisplayTop.removeClass('student-selected'); callback(students[finalIndex]); }, 1500); } }, currentSpeed); } function processCard(card, cardNumber) { console.log('Processing card:', card); // Show card type animation first showCardTypeReveal(card, () => { // Then process the specific card type processSpecificCard(card, cardNumber); }); } function processSpecificCard(card, cardNumber) { console.log('Processing specific card:', card); switch (card.card_type) { case 'question': if (card.question_type === 'speed') { showSpeedQuestion(card); } else if (card.question_type === 'essay') { showEssayQuestion(card); } else { showQuestion(card); } break; case 'bonus': applyBonus(card); break; case 'deduction': applyDeduction(card); break; case 'steal': showStealOptions(card); break; default: console.error('Unknown card type:', card.card_type); showAlert('نوع البطاقة غير معروف', 'error'); nextTurn(); break; } } function showQuestion(card) { displayQuestionFullscreen(card); } function displayQuestionFullscreen(card) { // Hide game board and show fullscreen question $('.col-lg-3, .card-grid').hide(); $('.col-lg-9').removeClass('col-lg-9').addClass('col-12'); const questionHtml = ` <div class="fullscreen-question"> <div class="text-center mb-4"> <h2 class="text-primary question-title-large">سؤال للمجموعة ${gameData.current_group + 1}</h2> <h3 class="text-info">الطالب المختار: <span class="selected-student-highlight">${$('#selectedStudent').text()}</span></h3> </div> ${card.question_image ? `<div class="text-center mb-4"><img src="../${card.question_image}" class="img-fluid rounded question-image-large"></div>` : ''} <div class="question-text-fullscreen mb-5"> ${card.question_text} </div> <div class="answers-grid-fullscreen"> <button class="answer-btn-fullscreen" onclick="checkAnswer(1, ${card.correct_answer})"> <span class="answer-label-large">أ:</span> <span class="answer-text-large">${card.answer1}</span> </button> <button class="answer-btn-fullscreen" onclick="checkAnswer(2, ${card.correct_answer})"> <span class="answer-label-large">ب:</span> <span class="answer-text-large">${card.answer2}</span> </button> <button class="answer-btn-fullscreen" onclick="checkAnswer(3, ${card.correct_answer})"> <span class="answer-label-large">ج:</span> <span class="answer-text-large">${card.answer3}</span> </button> <button class="answer-btn-fullscreen" onclick="checkAnswer(4, ${card.correct_answer})"> <span class="answer-label-large">د:</span> <span class="answer-text-large">${card.answer4}</span> </button> </div> <div class="text-center mt-4"> <button class="btn btn-warning btn-xl" onclick="skipQuestion()"> <i class="fas fa-forward me-2"></i> تخطي السؤال </button> </div> </div> `; $('#questionContent').html(questionHtml); $('#questionCard').show(); // Start timer startQuestionTimer(); } function checkAnswer(selectedAnswer, correctAnswer) { // Stop timer if (currentTimer) { clearInterval(currentTimer); $('#timerContainer').hide().removeClass('timer-warning timer-critical'); $('#timerDisplay').removeClass('timer-large'); } // Disable all answer buttons $('.answer-btn-fullscreen').prop('disabled', true); if (selectedAnswer === correctAnswer) { // Correct answer $(`.answer-btn-fullscreen:nth-child(${selectedAnswer})`).addClass('correct-fullscreen'); showCorrectAnswerEffect(); playSound('correct'); // Add points gameData.scores[gameData.current_group] = parseInt(gameData.scores[gameData.current_group]) + 10; updateScoreDisplay(); showAlert('إجابة صحيحة! +10 نقاط', 'success'); setTimeout(() => { nextTurn(); }, 2000); } else { // Wrong answer $(`.answer-btn-fullscreen:nth-child(${selectedAnswer})`).addClass('incorrect-fullscreen'); $(`.answer-btn-fullscreen:nth-child(${correctAnswer})`).addClass('correct-fullscreen'); showIncorrectAnswerEffect(); playSound('incorrect'); showAlert('إجابة خاطئة! الإجابة الصحيحة محددة باللون الأخضر', 'error'); setTimeout(() => { nextTurn(); }, 3000); } } function showSpeedQuestion(card) { // Show card type animation first showCardTypeAnimation('speed', () => { displaySpeedQuestion(card); }); } function displaySpeedQuestion(card) { const questionHtml = ` <div class="fullscreen-question speed-question-container"> <div class="text-center mb-4"> <h2 class="text-warning question-title-large"> <i class="fas fa-bolt me-3"></i> سؤال سرعة </h2> <h3 class="text-white mb-3">أسرع مجموعة تجيب تحصل على النقاط!</h3> </div> ${card.question_image ? `<div class="text-center mb-4"><img src="../${card.question_image}" class="img-fluid rounded question-image-large"></div>` : ''} <div class="question-text-fullscreen speed-question-style mb-5"> ${card.question_text} </div> <div class="answers-grid-fullscreen mb-5"> <div class="answer-option-fullscreen speed-answer-style"> <span class="answer-label-large">أ:</span> <span class="answer-text-large">${card.answer1}</span> </div> <div class="answer-option-fullscreen speed-answer-style"> <span class="answer-label-large">ب:</span> <span class="answer-text-large">${card.answer2}</span> </div> <div class="answer-option-fullscreen speed-answer-style"> <span class="answer-label-large">ج:</span> <span class="answer-text-large">${card.answer3}</span> </div> <div class="answer-option-fullscreen speed-answer-style"> <span class="answer-label-large">د:</span> <span class="answer-text-large">${card.answer4}</span> </div> </div> <div class="text-center"> <h4 class="mb-4 teacher-instruction">اختر المجموعة التي أجابت أولاً:</h4> <div class="row justify-content-center"> ${gameData.groups.map((group, index) => ` <div class="col-md-3 col-lg-2 mb-3"> <button class="btn btn-outline-light btn-xl w-100" onclick="awardSpeedPoints(${index}, ${card.correct_answer})"> ${group.name} </button> </div> `).join('')} </div> <div class="mt-4"> <button class="btn btn-success btn-xl me-3" onclick="showSpeedAnswer(${card.correct_answer})"> <i class="fas fa-eye me-2"></i> إظهار الإجابة الصحيحة </button> <button class="btn btn-warning btn-xl" onclick="skipSpeedQuestion()"> <i class="fas fa-forward me-2"></i> تخطي السؤال </button> </div> </div> </div> `; $('#questionContent').html(questionHtml); $('#questionCard').show(); // No timer for speed questions - teacher controls playSound('bonus'); // Different sound for speed questions } function showSpeedAnswer(correctAnswer) { $('.answer-option-fullscreen').removeClass('speed-correct-highlight'); $(`.answer-option-fullscreen:nth-child(${correctAnswer})`).addClass('speed-correct-highlight'); // Add dramatic reveal effect setTimeout(() => { $(`.answer-option-fullscreen:nth-child(${correctAnswer})`).addClass('answer-reveal-animation'); }, 300); } function awardSpeedPoints(groupIndex, correctAnswer) { // Award points to the selected group gameData.scores[groupIndex] = parseInt(gameData.scores[groupIndex]) + 10; updateScoreDisplay(); // Show correct answer setTimeout(() => { showSpeedAnswer(correctAnswer); }, 500); playSound('correct'); showAlert(`تم منح 10 نقاط لـ ${gameData.groups[groupIndex].name}!`, 'success'); setTimeout(() => { nextTurn(); }, 4000); } function skipSpeedQuestion() { showAlert('تم تخطي سؤال السرعة', 'info'); nextTurn(); } function showEssayQuestion(card) { // Show card type animation first showCardTypeAnimation('essay', () => { displayEssayQuestion(card); }); } function displayEssayQuestion(card) { const questionHtml = ` <div class="fullscreen-question essay-question-container"> <div class="text-center mb-4"> <h2 class="text-info question-title-large"> <i class="fas fa-pen me-3"></i> سؤال مقالي </h2> <h3 class="text-white mb-3">للمجموعة ${gameData.current_group + 1}</h3> <h4 class="text-info">الطالب المختار: <span class="selected-student-highlight">${$('#selectedStudent').text()}</span></h4> </div> ${card.question_image ? `<div class="text-center mb-4"><img src="../${card.question_image}" class="img-fluid rounded question-image-large"></div>` : ''} <div class="question-text-fullscreen essay-question-style mb-5"> ${card.question_text} </div> <div class="text-center"> <h4 class="mb-4 teacher-instruction">اختر الدرجة المناسبة للإجابة:</h4> <div class="row justify-content-center"> <div class="col-md-2 mb-3"> <button class="btn btn-success btn-xl w-100 grade-btn" onclick="markEssayAnswer(100)"> <i class="fas fa-star me-2"></i> ممتاز<br> <small>10/10</small> </button> </div> <div class="col-md-2 mb-3"> <button class="btn btn-info btn-xl w-100 grade-btn" onclick="markEssayAnswer(75)"> <i class="fas fa-star-half-alt me-2"></i> جيد جداً<br> <small>7.5/10</small> </button> </div> <div class="col-md-2 mb-3"> <button class="btn btn-warning btn-xl w-100 grade-btn" onclick="markEssayAnswer(50)"> <i class="fas fa-star-half me-2"></i> جيد<br> <small>5/10</small> </button> </div> <div class="col-md-2 mb-3"> <button class="btn btn-secondary btn-xl w-100 grade-btn" onclick="markEssayAnswer(25)"> <i class="fas fa-certificate me-2"></i> مقبول<br> <small>2.5/10</small> </button> </div> <div class="col-md-2 mb-3"> <button class="btn btn-danger btn-xl w-100 grade-btn" onclick="markEssayAnswer(0)"> <i class="fas fa-times me-2"></i> خاطئ<br> <small>0/10</small> </button> </div> </div> <div class="mt-4"> <button class="btn btn-outline-light btn-lg" onclick="skipQuestion()"> <i class="fas fa-forward me-2"></i> تخطي السؤال </button> </div> </div> </div> `; $('#questionContent').html(questionHtml); $('#questionCard').show(); // No timer for essay questions - teacher controls playSound('bonus'); // Different sound for essay questions } function markEssayAnswer(percentage) { // Disable buttons $('.grade-btn').prop('disabled', true); // Calculate points (10 is the base score) const points = (10 * percentage) / 100; if (points > 0) { showCorrectAnswerEffect(); playSound('correct'); // Add points gameData.scores[gameData.current_group] = parseInt(gameData.scores[gameData.current_group]) + points; updateScoreDisplay(); const gradeText = percentage === 100 ? 'ممتاز!' : percentage === 75 ? 'جيد جداً!' : percentage === 50 ? 'جيد!' : percentage === 25 ? 'مقبول!' : 'خاطئ!'; showAlert(`${gradeText} +${points} نقطة`, 'success'); } else { showIncorrectAnswerEffect(); playSound('incorrect'); showAlert('إجابة خاطئة!', 'error'); } setTimeout(() => { nextTurn(); }, 2500); } function applyBonus(card) { // Show card type animation first showCardTypeAnimation('bonus', () => { displayBonusCard(card); }); } function displayBonusCard(card) { const points = card.points_value || Math.floor(Math.random() * 20) + 5; gameData.scores[gameData.current_group] = parseInt(gameData.scores[gameData.current_group]) + parseInt(points); updateScoreDisplay(); showBonusEffect(); playSound('bonus'); showAlert(`بطاقة مكافأة! +${points} نقطة`, 'success'); $('#questionContent').html(` <div class="text-center"> <i class="fas fa-gift fa-4x text-success mb-3 bonus-icon"></i> <h3>بطاقة مكافأة!</h3> <h4 class="text-success">+${points} نقطة</h4> <p>تم إضافة النقاط لمجموعتك</p> </div> `); $('#questionCard').show(); setTimeout(() => { nextTurn(); }, 3000); } function applyDeduction(card) { // Show card type animation first showCardTypeAnimation('deduction', () => { displayDeductionCard(card); }); } function displayDeductionCard(card) { const points = card.points_value || Math.floor(Math.random() * 15) + 5; gameData.scores[gameData.current_group] = Math.max(0, parseInt(gameData.scores[gameData.current_group]) - parseInt(points)); updateScoreDisplay(); showDeductionEffect(); playSound('deduction'); showAlert(`بطاقة خصم! -${points} نقطة`, 'warning'); $('#questionContent').html(` <div class="text-center"> <i class="fas fa-minus-circle fa-4x text-warning mb-3 deduction-icon"></i> <h3>بطاقة خصم!</h3> <h4 class="text-warning">-${points} نقطة</h4> <p>تم خصم النقاط من مجموعتك</p> </div> `); $('#questionCard').show(); setTimeout(() => { nextTurn(); }, 3000); } function showStealOptions(card) { // Show card type animation first showCardTypeAnimation('steal', () => { displayStealOptions(card); }); } function displayStealOptions(card) { let optionsHtml = ''; gameData.groups.forEach((group, index) => { if (index !== gameData.current_group && gameData.scores[index] > 0) { optionsHtml += ` <button class="btn btn-outline-danger w-100 mb-2" onclick="stealFromGroup(${index})"> ${group.name} (${gameData.scores[index]} نقطة) </button> `; } }); if (optionsHtml === '') { optionsHtml = '<p class="text-muted">لا توجد مجموعات لديها نقاط للسرقة</p>'; setTimeout(() => { $('#stealModal').modal('hide'); nextTurn(); }, 2000); } $('#stealOptions').html(optionsHtml); $('#stealModal').modal('show'); } function stealFromGroup(targetGroupIndex) { const stealPoints = Math.min(parseInt(gameData.scores[targetGroupIndex]), Math.floor(Math.random() * 15) + 5); // Remove points from target group gameData.scores[targetGroupIndex] = parseInt(gameData.scores[targetGroupIndex]) - parseInt(stealPoints); // Add points to current group gameData.scores[gameData.current_group] = parseInt(gameData.scores[gameData.current_group]) + parseInt(stealPoints); updateScoreDisplay(); playSound('steal'); showStealEffect(); $('#stealModal').modal('hide'); showAlert(`تم سرقة ${stealPoints} نقطة من ${gameData.groups[targetGroupIndex].name}!`, 'info'); $('#questionContent').html(` <div class="text-center"> <i class="fas fa-mask fa-4x text-info mb-3 steal-icon"></i> <h3>بطاقة سرقة!</h3> <h4 class="text-info">+${stealPoints} نقطة</h4> <p>تم سرقة النقاط من ${gameData.groups[targetGroupIndex].name}</p> </div> `); $('#questionCard').show(); setTimeout(() => { nextTurn(); }, 3000); } function startQuestionTimer() { let timeLeft = parseInt(gameData.question_time) || 30; console.log('Starting timer with duration:', timeLeft); $('#timerDisplay').text(formatTime(timeLeft)); $('#timerContainer').show(); currentTimer = setInterval(() => { timeLeft--; $('#timerDisplay').text(formatTime(timeLeft)); // Make timer bigger and more visible when 5 seconds left if (timeLeft <= 5) { $('#timerContainer').addClass('timer-critical'); $('#timerDisplay').addClass('timer-large'); playSound('timer'); } else if (timeLeft <= 10) { $('#timerContainer').addClass('timer-warning'); } else { $('#timerContainer').removeClass('timer-warning timer-critical'); $('#timerDisplay').removeClass('timer-large'); } if (timeLeft <= 0) { clearInterval(currentTimer); $('#timerContainer').hide().removeClass('timer-warning timer-critical'); $('#timerDisplay').removeClass('timer-large'); // Time's up $('.answer-btn-fullscreen').prop('disabled', true); showAlert('انتهى الوقت!', 'warning'); setTimeout(() => { nextTurn(); }, 2000); } }, 1000); } function skipQuestion() { if (currentTimer) { clearInterval(currentTimer); $('#timerContainer').hide(); } showAlert('تم تخطي السؤال', 'info'); nextTurn(); } function nextTurn() { // Hide question card and restore normal view $('#questionCard').hide(); $('#questionContent').html(''); // Restore normal game view $('.col-lg-3, .card-grid').show(); $('.col-12').removeClass('col-12').addClass('col-lg-9'); // Re-enable card selection $('.game-card').removeClass('disabled').css('pointer-events', 'auto'); gameData.cards_disabled = false; // Move to next group gameData.current_group = (gameData.current_group + 1) % gameData.groups.length; // Update display updateGroupDisplay(); highlightActiveGroup(gameData.current_group); // Reset selected student $('#selectedStudent').text('اختر بطاقة للمتابعة'); $('#selectedStudentTop').text('اختر بطاقة للمتابعة'); // Check if game should end checkGameEnd(); } function checkGameEnd() { if (gameData.used_cards.length >= gameData.cards.length) { setTimeout(() => { endGame(); }, 1000); } } function updateGroupDisplay() { $('#currentGroup').html(`<strong>${gameData.groups[gameData.current_group].name}</strong>`); $('#currentGroupDisplay').html(`<strong>${gameData.groups[gameData.current_group].name}</strong>`); } function updateScoreDisplay() { gameData.scores.forEach((score, index) => { $(`#score-${index}`).text(formatScore(score)); }); } function highlightActiveGroup(groupIndex) { $('.group-card').removeClass('active'); $(`#group-${groupIndex}`).addClass('active'); } function confirmEndGame() { if (confirm('هل أنت متأكد من إنهاء المسابقة؟ سيتم عرض النتائج النهائية.')) { endGame(); } } function endGame() { console.log('Ending game...'); if (currentTimer) { clearInterval(currentTimer); $('#timerContainer').hide(); } playSound('gameEnd'); // Calculate winner const maxScore = Math.max(...gameData.scores); const winners = []; gameData.scores.forEach((score, index) => { if (score === maxScore) { winners.push({ name: gameData.groups[index].name, students: gameData.groups[index].students, score: score }); } }); // Show celebration and results showGameResults(winners, maxScore); // Save results if not public game if (!gameData.is_public) { saveGameResults(); } } function showGameResults(winners, maxScore) { let resultsHtml = ''; if (winners.length === 1) { // Single winner - show celebration resultsHtml = ` <div class="winner-celebration"> <div class="confetti"></div> <div class="text-center"> <div class="winner-crown"> <i class="fas fa-crown fa-4x text-warning mb-3"></i> </div> <h1 class="winner-title">🎉 تهانينا! 🎉</h1> <h2 class="text-success mb-4">${winners[0].name}</h2> <h3 class="text-primary mb-4">${formatScore(winners[0].score)} نقطة</h3> <div class="winner-students"> <h4 class="mb-3">أعضاء المجموعة الفائزة:</h4> <div class="students-list"> ${winners[0].students.map((student, index) => ` <div class="student-winner" style="animation-delay: ${index * 0.2}s"> <i class="fas fa-star text-warning me-2"></i> <span class="student-name">${student}</span> <i class="fas fa-medal text-warning ms-2"></i> </div> `).join('')} </div> </div> </div> </div> `; } else { // Multiple winners - show tie resultsHtml = ` <div class="text-center"> <h2 class="mb-4">🏆 تعادل مثير! 🏆</h2> <h3 class="text-success mb-4">المجموعات الفائزة:</h3> <div class="row"> ${winners.map(winner => ` <div class="col-md-6 mb-3"> <div class="card border-warning"> <div class="card-body text-center"> <h5>${winner.name}</h5> <h4 class="text-primary">${formatScore(winner.score)} نقطة</h4> <div class="mt-2"> ${winner.students.map(student => ` <div class="small text-muted">${student}</div> `).join('')} </div> </div> </div> </div> `).join('')} </div> </div> `; } // Add final results table resultsHtml += ` <div class="final-results mt-4"> <h4 class="text-center mb-3">النتائج النهائية:</h4> <div class="row"> ${gameData.groups.map((group, index) => ` <div class="col-md-6 mb-3"> <div class="card ${gameData.scores[index] === maxScore ? 'border-success bg-light' : ''}"> <div class="card-body text-center"> <h6>${group.name}</h6> <h4 class="text-primary">${formatScore(gameData.scores[index])} نقطة</h4> ${gameData.scores[index] === maxScore ? '<i class="fas fa-trophy text-warning"></i>' : ''} </div> </div> </div> `).join('')} </div> </div> <div class="text-center mt-4"> <button class="btn btn-info btn-lg me-2" onclick="showQuestionsReview()"> <i class="fas fa-list me-1"></i> مراجعة جميع الأسئلة </button> <button class="btn btn-primary btn-lg me-2" onclick="location.reload()"> <i class="fas fa-redo me-1"></i> لعب مرة أخرى </button> <button class="btn btn-secondary btn-lg" onclick="window.location.href='../index.php'"> <i class="fas fa-home me-1"></i> العودة للرئيسية </button> </div> `; $('#questionContent').html(resultsHtml); $('#questionCard').show(); // Add celebration animations setTimeout(() => { $('.winner-celebration').addClass('show'); $('.student-winner').each(function(index) { setTimeout(() => { $(this).addClass('animate'); }, index * 200); }); }, 500); } function showQuestionsReview() { console.log('Showing questions review...'); let reviewHtml = ` <div class="questions-review"> <div class="text-center mb-4"> <h3 class="text-primary">مراجعة جميع الأسئلة والبطاقات</h3> <p class="text-muted">يمكن للمعلم مراجعة الأسئلة مع الطلاب</p> </div> `; console.log('Total cards to review:', gameData.cards.length); gameData.cards.forEach((card, index) => { const cardNumber = index + 1; const wasUsed = gameData.used_cards.includes(cardNumber); console.log(`Card ${cardNumber}:`, card, 'Used:', wasUsed); reviewHtml += ` <div class="review-question mb-4 ${wasUsed ? 'border-success' : 'border-secondary'}" style="border: 2px solid; border-radius: 15px; padding: 1.5rem;"> <div class="d-flex justify-content-between align-items-center mb-3"> <h5 class="mb-0">البطاقة رقم ${cardNumber}</h5> <div> ${getCardTypeBadge(card)} ${wasUsed ? '<span class="badge bg-success ms-2">تم استخدامها</span>' : '<span class="badge bg-secondary ms-2">لم تُستخدم</span>'} </div> </div> `; if (card.card_type === 'question') { const questionText = card.question_text || 'نص السؤال غير متوفر'; reviewHtml += ` <div class="question-text mb-3" style="font-size: 1.4rem; font-weight: 600;"> ${questionText} </div> <div class="row"> <div class="col-md-6 mb-2"> <div class="answer-option ${parseInt(card.correct_answer) === 1 ? 'correct-answer' : ''}" style="padding: 0.8rem; border-radius: 8px; border: 2px solid #dee2e6;"> <strong>أ:</strong> ${card.answer1 || 'غير متوفر'} </div> </div> <div class="col-md-6 mb-2"> <div class="answer-option ${parseInt(card.correct_answer) === 2 ? 'correct-answer' : ''}" style="padding: 0.8rem; border-radius: 8px; border: 2px solid #dee2e6;"> <strong>ب:</strong> ${card.answer2 || 'غير متوفر'} </div> </div> <div class="col-md-6 mb-2"> <div class="answer-option ${parseInt(card.correct_answer) === 3 ? 'correct-answer' : ''}" style="padding: 0.8rem; border-radius: 8px; border: 2px solid #dee2e6;"> <strong>ج:</strong> ${card.answer3 || 'غير متوفر'} </div> </div> <div class="col-md-6 mb-2"> <div class="answer-option ${parseInt(card.correct_answer) === 4 ? 'correct-answer' : ''}" style="padding: 0.8rem; border-radius: 8px; border: 2px solid #dee2e6;"> <strong>د:</strong> ${card.answer4 || 'غير متوفر'} </div> </div> </div> `; } else { reviewHtml += ` <div class="text-center"> <h4>${getCardTypeText(card.card_type)}</h4> <p class="text-muted">${card.points_value} نقطة</p> </div> `; } reviewHtml += '</div>'; }); reviewHtml += ` <div class="text-center mt-4"> <button class="btn btn-secondary btn-lg" onclick="hideQuestionsReview()"> <i class="fas fa-arrow-right me-1"></i> العودة للنتائج </button> </div> </div> `; $('#questionContent').html(reviewHtml); console.log('Questions review HTML generated'); } function hideQuestionsReview() { $('#questionCard').hide(); // Calculate winner again for results display const maxScore = Math.max(...gameData.scores); const winners = []; gameData.scores.forEach((score, index) => { if (score === maxScore) { winners.push({ name: gameData.groups[index].name, students: gameData.groups[index].students, score: score }); } }); showGameResults(winners, maxScore); } function getCardTypeBadge(card) { const badges = { question: `<span class="badge bg-primary">${card.question_type === 'speed' ? 'سؤال سرعة' : (card.question_type === 'essay' ? 'سؤال مقالي' : 'سؤال عادي')}</span>`, bonus: '<span class="badge bg-success">بطاقة مكافأة</span>', deduction: '<span class="badge bg-warning">بطاقة خصم</span>', steal: '<span class="badge bg-danger">بطاقة سرقة</span>' }; return badges[card.card_type] || '<span class="badge bg-secondary">غير محدد</span>'; } function getCardTypeText(cardType) { const texts = { bonus: 'بطاقة مكافأة', deduction: 'بطاقة خصم', steal: 'بطاقة سرقة' }; return texts[cardType] || 'بطاقة خاصة'; } // Manage behavior points function manageBehaviorPoints(groupIndex, action) { console.log('Managing behavior points:', groupIndex, action); gameData.current_points_group = groupIndex; gameData.current_points_action = action; // Set modal title based on action const modalTitle = action === 'add' ? 'إضافة نقاط سلوك' : 'خصم نقاط سلوك'; $('#pointsModalTitle').text(modalTitle); // Reset input values $('#pointsAmount').val(5); $('#pointsReason').val(''); // Show modal $('#pointsModal').modal('show'); } // Confirm points action $(document).on('click', '#confirmPointsAction', function() { const points = parseInt($('#pointsAmount').val()) || 0; const reason = $('#pointsReason').val(); const groupIndex = gameData.current_points_group; const action = gameData.current_points_action; console.log('Confirming points action:', { points, reason, groupIndex, action }); if (points <= 0) { showAlert('الرجاء إدخال عدد نقاط صحيح', 'warning'); return; } const $groupCard = $(`#group-${groupIndex}`); if (action === 'add') { gameData.scores[groupIndex] = parseInt(gameData.scores[groupIndex]) + parseInt(points); $groupCard.addClass('points-added'); playSound('bonus'); showAlert(`تم إضافة ${points} نقطة لـ ${gameData.groups[groupIndex].name}${reason ? ' - ' + reason : ''}`, 'success'); } else if (action === 'subtract') { gameData.scores[groupIndex] = Math.max(0, parseInt(gameData.scores[groupIndex]) - parseInt(points)); $groupCard.addClass('points-deducted'); playSound('deduction'); showAlert(`تم خصم ${points} نقطة من ${gameData.groups[groupIndex].name}${reason ? ' - ' + reason : ''}`, 'warning'); } // Remove animation classes after animation completes setTimeout(() => { $groupCard.removeClass('points-added points-deducted'); }, 1000); updateScoreDisplay(); // Hide modal $('#pointsModal').modal('hide'); }); function saveGameResults() { const results = gameData.groups.map((group, index) => ({ group_name: group.name, students: group.students, score: gameData.scores[index] })); $.ajax({ url: '../ajax/save_group_results.php', type: 'POST', data: { competition_id: gameData.competition_id, results: JSON.stringify(results) }, success: function(response) { console.log('Results saved successfully'); }, error: function() { console.log('Failed to save results'); } }); } // Visual effects functions function showCardSelectionAnimation(cardNumber) { const $card = $(`[data-card-number="${cardNumber}"]`); $card.addClass('selected'); setTimeout(() => { $card.removeClass('selected'); }, 1000); } function showCardTypeAnimation(cardType, callback) { const animations = { question: { icon: 'fa-question-circle', color: '#007bff', text: 'سؤال اختيار من متعدد' }, speed: { icon: 'fa-bolt', color: '#ffc107', text: 'سؤال سرعة' }, essay: { icon: 'fa-pen', color: '#17a2b8', text: 'سؤال مقالي' }, bonus: { icon: 'fa-gift', color: '#28a745', text: 'بطاقة مكافأة' }, deduction: { icon: 'fa-minus-circle', color: '#ffc107', text: 'بطاقة خصم' }, steal: { icon: 'fa-mask', color: '#dc3545', text: 'بطاقة سرقة' } }; const anim = animations[cardType]; const animationHtml = ` <div class="card-type-animation"> <div class="card-type-icon" style="color: ${anim.color};"> <i class="fas ${anim.icon}"></i> </div> <div class="card-type-text" style="color: ${anim.color};"> ${anim.text} </div> </div> `; $('#questionContent').html(animationHtml); $('#questionCard').show(); setTimeout(() => { callback(); }, 2000); } function showCardTypeReveal(card, callback) { const cardTypes = { question: { normal: { icon: 'fa-question-circle', color: '#007bff', text: 'سؤال اختيار من متعدد', bg: 'linear-gradient(135deg, #007bff, #0056b3)' }, speed: { icon: 'fa-bolt', color: '#ffc107', text: 'سؤال سرعة', bg: 'linear-gradient(135deg, #ffc107, #e0a800)' }, essay: { icon: 'fa-pen', color: '#17a2b8', text: 'سؤال مقالي', bg: 'linear-gradient(135deg, #17a2b8, #138496)' } }, bonus: { icon: 'fa-gift', color: '#28a745', text: 'بطاقة مكافأة', bg: 'linear-gradient(135deg, #28a745, #1e7e34)' }, deduction: { icon: 'fa-minus-circle', color: '#ffc107', text: 'بطاقة خصم', bg: 'linear-gradient(135deg, #ffc107, #e0a800)' }, steal: { icon: 'fa-mask', color: '#dc3545', text: 'بطاقة سرقة', bg: 'linear-gradient(135deg, #dc3545, #c82333)' } }; let cardInfo; if (card.card_type === 'question') { const questionType = card.question_type || 'normal'; cardInfo = cardTypes.question[questionType]; } else { cardInfo = cardTypes[card.card_type]; } if (!cardInfo) { callback(); return; } // Create fullscreen card reveal const revealHtml = ` <div class="card-type-reveal-fullscreen" style="background: ${cardInfo.bg};"> <div class="card-reveal-content"> <div class="card-reveal-icon" style="color: white;"> <i class="fas ${cardInfo.icon}"></i> </div> <div class="card-reveal-text" style="color: white;"> ${cardInfo.text} </div> <div class="card-reveal-subtitle"> ${card.card_type === 'question' ? 'للمجموعة ' + (gameData.current_group + 1) : 'بطاقة خاصة'} </div> </div> </div> `; // Hide game board $('.col-lg-3, .card-grid').hide(); $('.col-lg-9').removeClass('col-lg-9').addClass('col-12'); $('#questionContent').html(revealHtml); $('#questionCard').show(); // Play reveal animation setTimeout(() => { $('.card-type-reveal-fullscreen').addClass('revealed'); }, 100); // Continue after animation setTimeout(() => { callback(); }, 2500); } function showCorrectAnswerEffect() { // Flash effect $('body').append('<div class="flash-effect flash-correct"></div>'); setTimeout(() => $('.flash-effect').remove(), 1500); // Confetti effect createConfetti(); } function showIncorrectAnswerEffect() { // Flash effect $('body').append('<div class="flash-effect flash-incorrect"></div>'); setTimeout(() => $('.flash-effect').remove(), 1500); // Shake effect $('.question-card').addClass('shake-effect'); setTimeout(() => $('.question-card').removeClass('shake-effect'), 500); } function showBonusEffect() { // Sparkle effect $('body').append('<div class="sparkle-effect"></div>'); setTimeout(() => $('.sparkle-effect').remove(), 2000); } function showDeductionEffect() { // Warning flash $('body').append('<div class="flash-effect flash-warning"></div>'); setTimeout(() => $('.flash-effect').remove(), 1500); } function showStealEffect() { // Smoke effect $('body').append('<div class="smoke-effect"></div>'); setTimeout(() => $('.smoke-effect').remove(), 2000); } function createConfetti() { const colors = ['#ffc107', '#28a745', '#dc3545', '#007bff', '#6f42c1']; for (let i = 0; i < 50; i++) { const confetti = $('<div class="confetti-piece"></div>'); confetti.css({ left: Math.random() * 100 + '%', backgroundColor: colors[Math.floor(Math.random() * colors.length)], animationDelay: Math.random() * 3 + 's' }); $('body').append(confetti); setTimeout(() => confetti.remove(), 3000); } }
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium320.web-hosting.com
Server IP: 66.29.153.54
PHP Version: 8.2.29
Server Software: LiteSpeed
System: Linux premium320.web-hosting.com 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 76.86 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
Yes
pkexec:
No
git:
Yes
User Info
Username: aoneqssk
User ID (UID): 1285
Group ID (GID): 1290
Script Owner UID: 1285
Current Dir Owner: 1285