DP-Logopedicka-Platforma/js/pexeso/menu-pexeso.js
2026-04-23 15:41:11 +02:00

274 lines
9.6 KiB
JavaScript

let allWords = {};
let selectedCategory = null;
let selectedWords = [];
async function loadAllWords() {
try {
const response = await fetch('js/pexeso/words.json');
allWords = await response.json();
renderCategoryList();
selectRandomLevel(); // Select "Náhodný level" by default
preloadCustomLevelImages(); // Preload images for "Vlastný level"
} catch (error) {
console.error('Chyba pri načítání slov:', error);
}
}
function renderCategoryList() {
const wordList = document.getElementById('wordList');
wordList.innerHTML = '';
document.getElementById('wordCountContainer').style.display = 'none';
// Přidání tlačítka pro náhodný level
const randomLevelButton = document.createElement('button');
randomLevelButton.textContent = 'Základný level';
randomLevelButton.classList.add('category-button');
randomLevelButton.dataset.category = 'random';
randomLevelButton.addEventListener('click', selectCategory);
wordList.appendChild(randomLevelButton);
// Přidání tlačítek kategorií
Object.keys(allWords).forEach(category => {
const categoryButton = document.createElement('button');
categoryButton.textContent = `Level ${category}`;
categoryButton.classList.add('category-button');
categoryButton.dataset.category = category;
categoryButton.addEventListener('click', selectCategory);
wordList.appendChild(categoryButton);
});
// Přidání tlačítka pro vlastní level
const customLevelButton = document.createElement('button');
customLevelButton.textContent = 'Vlastný level';
customLevelButton.addEventListener('click', showAllWords);
wordList.appendChild(customLevelButton);
}
function selectCategory(event) {
// Odstraň zelené zvýraznění ze všech tlačítek
document.querySelectorAll('.category-button').forEach(btn => {
btn.style.backgroundColor = '';
});
// Zvýrazni vybrané tlačítko zeleně
event.target.style.backgroundColor = 'lightgreen';
// Ulož vybranou kategorii
selectedCategory = event.target.dataset.category;
}
function selectRandomLevel() {
const randomLevelButton = document.querySelector('button[data-category="random"]');
if (randomLevelButton) {
randomLevelButton.click();
}
}
function preloadCustomLevelImages() {
const allWordsFlat = Object.values(allWords).flat();
allWordsFlat.forEach(word => {
const img = new Image();
img.src = word.src;
});
}
function showRandomWords() {
document.getElementById('wordCountContainer').style.display = 'none';
const wordList = document.getElementById('wordList');
wordList.innerHTML = '';
// Sloučení všech slov z kategorií
const allWordsFlat = Object.values(allWords).flat();
// Náhodný výběr 15 slov
const randomWords = getRandomWords(allWordsFlat, 15).map(word => ({
...word,
selected: false
}));
randomWords.forEach((word, index) => {
const wordItem = createWordItem(word, index);
wordList.appendChild(wordItem);
});
const backButton = document.createElement('button');
backButton.textContent = 'Naspäť';
backButton.addEventListener('click', renderCategoryList);
wordList.appendChild(backButton);
}
function showCategoryWords(category) {
document.getElementById('wordCountContainer').style.display = 'none';
selectedCategory = category;
const wordList = document.getElementById('wordList');
wordList.innerHTML = '';
const words = allWords[category].map(word => ({ ...word, selected: false }));
words.forEach((word, index) => {
const wordItem = createWordItem(word, index);
wordList.appendChild(wordItem);
});
const backButton = document.createElement('button');
backButton.textContent = 'Naspäť';
backButton.addEventListener('click', renderCategoryList);
wordList.appendChild(backButton);
}
// Funkce pro náhodný výběr slov
function getRandomWords(words, count) {
// Pokud je požadovaný počet větší než počet dostupných slov, vrátí všechna slova
if (count >= words.length) return words;
// Náhodný výběr slov
const shuffled = [...words].sort(() => 0.5 - Math.random());
return shuffled.slice(0, count);
}
function showAllWords() {
selectedCategory = null;
const wordList = document.getElementById('wordList');
wordList.innerHTML = '';
document.getElementById('wordCountContainer').style.display = 'block';
const allWordsFlat = Object.values(allWords).flat().map(word => ({ ...word, selected: false }));
allWordsFlat.forEach((word, index) => {
const wordItem = createWordItem(word, index);
wordList.appendChild(wordItem);
});
const backButton = document.createElement('button');
backButton.textContent = 'Naspäť';
backButton.addEventListener('click', () => {
renderCategoryList();
document.getElementById('wordCountContainer').style.display = 'none';
});
backButton.style.backgroundColor = '#ff4444';
backButton.style.color = 'white';
backButton.style.padding = '10px 20px';
backButton.style.border = 'none';
backButton.style.borderRadius = '5px';
backButton.style.cursor = 'pointer';
wordList.appendChild(backButton);
}
function createWordItem(word, index) {
const wordItem = document.createElement('div');
wordItem.className = 'word-item';
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = `word-${index}`;
checkbox.checked = word.selected;
checkbox.addEventListener('change', () => toggleWordSelection(word));
const img = document.createElement('img');
img.src = word.src;
img.alt = word.word;
const label = document.createElement('label');
label.htmlFor = `word-${index}`;
label.textContent = word.word;
wordItem.appendChild(checkbox);
wordItem.appendChild(img);
wordItem.appendChild(label);
return wordItem;
}
function toggleWordSelection(word) {
if (word.selected) {
// Odstraň slovo ze selectedWords
selectedWords = selectedWords.filter(w => w !== word);
word.selected = false;
} else {
// Přidej slovo do selectedWords
selectedWords.push(word);
word.selected = true;
}
updateSelectedWordsCount();
}
function updateSelectedWordsCount() {
document.getElementById('selectedWordsCount').textContent = selectedWords.length;
}
function startCustomGame() {
const playerInputs = document.querySelectorAll('#playerInputs input');
const players = Array.from(playerInputs)
.filter(input => input.value.trim() !== '')
.map(input => ({
name: input.value,
score: 0
}));
if (players.length < 1) {
alert('Musíte zadať aspoň jedného hráča.');
return;
}
let wordsToUse;
if (selectedCategory) {
if (selectedCategory === 'random') {
// Náhodný level
const allWordsFlat = Object.values(allWords).flat();
wordsToUse = getRandomWords(allWordsFlat, 15);
} else {
// Náhodný výběr 15 slov z kategorie
wordsToUse = getRandomWords(allWords[selectedCategory], 15);
}
} else {
// Pro vlastní level použij vybrané slova
if (selectedWords.length < 2) {
alert('Vyberte aspoň 2 slová');
return;
}
wordsToUse = selectedWords;
}
const customWordsParam = encodeURIComponent(JSON.stringify(wordsToUse));
const playersParam = encodeURIComponent(JSON.stringify(players));
window.location.href = `pexesocustom.html?custom=true&words=${customWordsParam}&players=${playersParam}`;
}
function openCustomLevel() {
document.getElementById('customLevelModal').style.display = 'flex';
}
function closeCustomLevel() {
document.getElementById('customLevelModal').style.display = 'none';
selectedWords = [];
updateSelectedWordsCount();
// Zrušení výběru všech slov
Object.values(allWords).flat().forEach(word => {
word.selected = false;
});
}
function addPlayer() {
const playerInputs = document.getElementById('playerInputs');
const playerCount = playerInputs.children.length;
if (playerCount < 4) {
const input = document.createElement('input');
input.type = 'text';
input.placeholder = `Hráč ${playerCount + 1}`;
input.value = `Hráč ${playerCount + 1}`;
playerInputs.appendChild(input);
}
}
function removePlayer() {
const playerInputs = document.getElementById('playerInputs');
if (playerInputs.children.length > 1) {
playerInputs.removeChild(playerInputs.lastChild);
}
}
// Inicializace
document.addEventListener('DOMContentLoaded', loadAllWords);