T.ME/BIBIL_0DAY
CasperSecurity


Server : Apache/2
System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User : gositeme ( 1004)
PHP Version : 8.2.29
Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Directory :  /home/gositeme/domains/gositeme.com/public_html/demo/robert/js/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/gositeme.com/public_html/demo/robert/js/menu.js
// Menu data
const menuData = {
    'appetizers': [
        {
            id: 1,
            name: 'Rouleaux de Printemps',
            description: 'Rouleaux de printemps croustillants aux légumes servis avec sauce chili douce',
            price: 6.99,
            image: 'images/menu/spring-rolls.jpg',
            rating: 4.5,
            reviewCount: 128,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: false
        },
        {
            id: 2,
            name: 'Boulettes de Porc',
            description: 'Boulettes de porc et légumes cuites à la vapeur avec sauce soja',
            price: 7.99,
            image: 'images/menu/dumplings.jpg',
            rating: 4.7,
            reviewCount: 156,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: false
        }
    ],
    'soups': [
        {
            id: 3,
            name: 'Soupe Aigre-Douce',
            description: 'Soupe traditionnelle chinoise au tofu, champignons et pousses de bambou',
            price: 5.99,
            image: 'images/menu/hot-sour-soup.jpg',
            rating: 4.6,
            reviewCount: 112,
            isVegetarian: true,
            isSpicy: true,
            isGlutenFree: true
        },
        {
            id: 4,
            name: 'Soupe Wonton',
            description: 'Bouillon clair avec wontons au porc et aux crevettes',
            price: 6.99,
            image: 'images/menu/wonton-soup.jpg',
            rating: 4.4,
            reviewCount: 89,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: false
        }
    ],
    'main-courses': [
        {
            id: 5,
            name: 'Poulet Général Tso',
            description: 'Poulet croustillant dans une sauce sucrée et épicée',
            price: 14.99,
            image: 'images/menu/general-tsos.jpg',
            rating: 4.8,
            reviewCount: 245,
            isVegetarian: false,
            isSpicy: true,
            isGlutenFree: false
        },
        {
            id: 6,
            name: 'Bœuf au Brocoli',
            description: 'Lanières de bœuf tendres avec brocoli frais dans une sauce à l\'ail',
            price: 15.99,
            image: 'images/menu/beef-broccoli.jpg',
            rating: 4.5,
            reviewCount: 178,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: true
        }
    ],
    'noodles': [
        {
            id: 7,
            name: 'Pad Thai',
            description: 'Nouilles de riz sautées avec œuf, légumes et cacahuètes',
            price: 12.99,
            image: 'images/menu/pad-thai.jpg',
            rating: 4.6,
            reviewCount: 189,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: true
        },
        {
            id: 8,
            name: 'Lo Mein',
            description: 'Nouilles de blé sautées avec légumes et choix de protéines',
            price: 11.99,
            image: 'images/menu/lo-mein.jpg',
            rating: 4.4,
            reviewCount: 134,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: false
        }
    ],
    'rice': [
        {
            id: 9,
            name: 'Riz Frit',
            description: 'Riz sauté avec œuf, légumes et choix de protéines',
            price: 10.99,
            image: 'images/menu/fried-rice.jpg',
            rating: 4.3,
            reviewCount: 167,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: true
        },
        {
            id: 10,
            name: 'Riz Frit Yangzhou',
            description: 'Riz frit premium avec crevettes, jambon et légumes',
            price: 12.99,
            image: 'images/menu/yangzhou-rice.jpg',
            rating: 4.7,
            reviewCount: 98,
            isVegetarian: false,
            isSpicy: false,
            isGlutenFree: true
        }
    ],
    'desserts': [
        {
            id: 11,
            name: 'Riz Gluant à la Mangue',
            description: 'Riz gluant sucré avec mangue fraîche et lait de coco',
            price: 6.99,
            image: 'images/menu/mango-sticky-rice.jpg',
            rating: 4.8,
            reviewCount: 145,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: true
        },
        {
            id: 12,
            name: 'Crêpe aux Haricots Rouges',
            description: 'Crêpe croustillante fourrée à la pâte de haricots rouges',
            price: 5.99,
            image: 'images/menu/red-bean-pancake.jpg',
            rating: 4.5,
            reviewCount: 112,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: false
        }
    ],
    'beverages': [
        {
            id: 13,
            name: 'Thé à Bulles',
            description: 'Thé au lait sucré avec perles de tapioca',
            price: 4.99,
            image: 'images/menu/bubble-tea.jpg',
            rating: 4.7,
            reviewCount: 234,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: true
        },
        {
            id: 14,
            name: 'Thé au Jasmin',
            description: 'Thé chinois traditionnel au jasmin',
            price: 3.99,
            image: 'images/menu/jasmine-tea.jpg',
            rating: 4.4,
            reviewCount: 156,
            isVegetarian: true,
            isSpicy: false,
            isGlutenFree: true
        }
    ]
};

// Expose menuData to global scope
window.menuData = menuData;

// DOM Elements
const menuItemsGrid = document.getElementById('menu-items');
const searchInput = document.getElementById('menu-search');
const filterButtons = document.querySelectorAll('.filter-btn');
const dietaryButtons = document.querySelectorAll('.dietary-btn');

// Initialize menu
document.addEventListener('DOMContentLoaded', () => {
    loadMenuItems();
    
    // Add event listeners
    filterButtons.forEach(button => {
        button.addEventListener('click', handleCategoryFilter);
    });

    dietaryButtons.forEach(button => {
        button.addEventListener('click', handleDietaryFilter);
    });

    searchInput.addEventListener('input', filterMenuItems);

    // Menu page hero slideshow
    const slides = document.querySelectorAll('.hero-slide');
    let currentSlide = 0;
    const slideCount = slides.length;

    function showSlide(index) {
        // Remove active class from all slides
        slides.forEach(slide => slide.classList.remove('active'));
        
        // Add active class to current slide
        slides[index].classList.add('active');
    }

    function nextSlide() {
        currentSlide = (currentSlide + 1) % slideCount;
        showSlide(currentSlide);
    }

    // Show first slide initially
    showSlide(currentSlide);

    // Change slide every 4 seconds
    setInterval(nextSlide, 4000);

    // Add language change listener
    const langToggle = document.getElementById('langToggle');
    if (langToggle) {
        langToggle.addEventListener('click', () => {
            const currentLang = document.documentElement.lang;
            const newLang = currentLang === 'fr' ? 'en' : 'fr';
            document.documentElement.lang = newLang;
            loadMenuItems(getActiveCategory(), getActiveDietaryFilters());
        });
    }
});

function loadMenuItems(category = 'all', dietaryFilters = []) {
    menuItemsGrid.innerHTML = '';
    
    let items = [];
    if (category === 'all') {
        // Get all items from all categories
        Object.values(menuData).forEach(categoryItems => {
            items = items.concat(categoryItems);
        });
    } else {
        // Get items from specific category
        items = menuData[category] || [];
    }

    // Apply dietary filters
    if (dietaryFilters.length > 0) {
        items = items.filter(item => {
            if (dietaryFilters.includes('vegetarian') && !item.isVegetarian) return false;
            if (dietaryFilters.includes('vegan') && !item.isVegan) return false;
            if (dietaryFilters.includes('spicy') && !item.isSpicy) return false;
            return true;
        });
    }

    // Display items
    items.forEach(item => {
        const card = createMenuItemCard(item);
        menuItemsGrid.appendChild(card);
    });
}

function createMenuItemCard(item) {
    const card = document.createElement('div');
    card.className = 'menu-item';
    
    // Get current language
    const currentLang = document.documentElement.lang || 'fr';
    
    // Get translations for dietary tags
    const vegetarianText = translations[currentLang]['tag-vegetarian'] || 'Vegetarian';
    const spicyText = translations[currentLang]['tag-spicy'] || 'Spicy';
    const glutenFreeText = translations[currentLang]['tag-gluten-free'] || 'Gluten Free';
    
    card.innerHTML = `
        <img src="${item.image}" alt="${translations[currentLang][item.name] || item.name}" class="menu-item-image">
        <div class="menu-item-content">
            <div class="menu-item-header">
                <h3>${translations[currentLang][item.name] || item.name}</h3>
                <span class="price">$${item.price.toFixed(2)}</span>
            </div>
            <p>${translations[currentLang][item.name + '-desc'] || item.description}</p>
            <div class="menu-item-footer">
                <div class="rating">
                    ${generateStarRating(item.rating)}
                    <span>(${item.reviewCount})</span>
                </div>
                <div class="tags">
                    ${item.isVegetarian ? `<span class="tag vegetarian">${vegetarianText}</span>` : ''}
                    ${item.isSpicy ? `<span class="tag spicy">${spicyText}</span>` : ''}
                    ${item.isGlutenFree ? `<span class="tag gluten-free">${glutenFreeText}</span>` : ''}
                </div>
            </div>
        </div>
    `;
    return card;
}

function generateStarRating(rating) {
    const fullStars = Math.floor(rating);
    const halfStar = rating % 1 >= 0.5;
    const emptyStars = 5 - fullStars - (halfStar ? 1 : 0);
    
    let stars = '';
    for (let i = 0; i < fullStars; i++) {
        stars += '<i class="fas fa-star"></i>';
    }
    if (halfStar) {
        stars += '<i class="fas fa-star-half-alt"></i>';
    }
    for (let i = 0; i < emptyStars; i++) {
        stars += '<i class="far fa-star"></i>';
    }
    return stars;
}

function filterMenuItems() {
    const searchTerm = searchInput.value.toLowerCase();
    const activeCategory = getActiveCategory();
    const dietaryFilters = getActiveDietaryFilters();
    
    loadMenuItems(activeCategory, dietaryFilters);
    
    // Filter by search term
    const items = menuItemsGrid.querySelectorAll('.menu-item');
    items.forEach(item => {
        const name = item.querySelector('h3').textContent.toLowerCase();
        const description = item.querySelector('p').textContent.toLowerCase();
        const matchesSearch = name.includes(searchTerm) || description.includes(searchTerm);
        item.style.display = matchesSearch ? 'block' : 'none';
    });
}

function handleCategoryFilter(e) {
    // Remove active class from all buttons
    filterButtons.forEach(btn => btn.classList.remove('active'));
    // Add active class to clicked button
    e.target.classList.add('active');
    // Load items for selected category
    const category = e.target.dataset.category;
    const dietaryFilters = getActiveDietaryFilters();
    loadMenuItems(category, dietaryFilters);
}

function handleDietaryFilter(e) {
    e.target.classList.toggle('active');
    const activeCategory = getActiveCategory();
    const dietaryFilters = getActiveDietaryFilters();
    loadMenuItems(activeCategory, dietaryFilters);
}

function getActiveCategory() {
    const activeButton = document.querySelector('.filter-btn.active');
    return activeButton ? activeButton.dataset.category : 'all';
}

function getActiveDietaryFilters() {
    const activeButtons = document.querySelectorAll('.dietary-btn.active');
    return Array.from(activeButtons).map(btn => btn.dataset.filter);
} 

CasperSecurity Mini