From 1411844677c20799af8cf44d77081b71f11e37dc Mon Sep 17 00:00:00 2001 From: Eye of Horus Team <225619771+eyeofhorussecurity@users.noreply.github.com> Date: Fri, 9 Jan 2026 02:49:28 +0200 Subject: [PATCH 1/8] Delete js directory --- js/animate-on-scroll.js | 70 --- js/assistant.js | 263 ----------- js/blog.js | 121 ----- js/main.js | 201 --------- js/report.js | 85 ---- js/script.js | 961 ---------------------------------------- 6 files changed, 1701 deletions(-) delete mode 100644 js/animate-on-scroll.js delete mode 100644 js/assistant.js delete mode 100644 js/blog.js delete mode 100644 js/main.js delete mode 100644 js/report.js delete mode 100644 js/script.js diff --git a/js/animate-on-scroll.js b/js/animate-on-scroll.js deleted file mode 100644 index 8234be2..0000000 --- a/js/animate-on-scroll.js +++ /dev/null @@ -1,70 +0,0 @@ -// Animate on scroll using IntersectionObserver -// Adds 'in-view' class to elements with .animate-on-scroll when they intersect - -(function(){ - const defaultOptions = { - root: null, - rootMargin: '0px 0px -8% 0px', - threshold: 0.12 - }; - - function applyObserver(selector = '.animate-on-scroll'){ - const elements = document.querySelectorAll(selector); - if(!elements.length) return; - - const observer = new IntersectionObserver((entries, obs) => { - entries.forEach(entry => { - const el = entry.target; - if(entry.isIntersecting){ - // handle optional delay in ms from data-delay or CSS var --delay - const delayAttr = el.getAttribute('data-delay'); - if(delayAttr){ - el.style.setProperty('--delay', `${parseInt(delayAttr,10)}ms`); - // ensure stagger class is present so transition-delay applies - el.classList.add('stagger'); - } - - el.classList.add('in-view'); - - // If data-once is 'true' (default) unobserve after first reveal - const once = el.getAttribute('data-once'); - if(once === null || once === 'true'){ - obs.unobserve(el); - } - } else { - // If data-once is explicitly 'false', allow toggling - const once = el.getAttribute('data-once'); - if(once === 'false'){ - el.classList.remove('in-view'); - } - } - }); - }, defaultOptions); - - elements.forEach(el => observer.observe(el)); - } - - // Auto-init on DOMContentLoaded - if(document.readyState === 'loading'){ - document.addEventListener('DOMContentLoaded', () => applyObserver()); - } else { - applyObserver(); - } - - window.EoHAnimateOnScroll = { init: applyObserver }; -})(); -const cards = document.querySelectorAll('.tip-timeline'); - -const observer = new IntersectionObserver((entries, observer) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - entry.target.classList.add('show'); - observer.unobserve(entry.target); - } - }); -}, { - threshold: 0.2 -}); -cards.forEach(card => { - observer.observe(card); -}); diff --git a/js/assistant.js b/js/assistant.js deleted file mode 100644 index 4960e75..0000000 --- a/js/assistant.js +++ /dev/null @@ -1,263 +0,0 @@ -let selectedFiles = []; - -const messageInput = document.getElementById('messageInput'); -const sendBtn = document.getElementById('sendBtn'); -const chatMessages = document.getElementById('chatMessages'); -const fileInput = document.getElementById('fileInput'); -const filePreview = document.getElementById('filePreview'); -const typingIndicator = document.getElementById('typingIndicator'); -typingIndicator.style.display = 'none'; -messageInput.addEventListener('input', function () { - this.style.height = 'auto'; - this.style.height = Math.min(this.scrollHeight, 100) + 'px'; -}); - -messageInput.addEventListener('keypress', function (e) { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - sendMessage(); - } -}); - -sendBtn.addEventListener('click', sendMessage); - -fileInput.addEventListener('change', function (e) { - const files = Array.from(e.target.files); - files.forEach(file => { - if (selectedFiles.length < 5 && file.size <= 10 * 1024 * 1024) { - selectedFiles.push(file); - addFilePreview(file); - } - }); -}); - -function addFilePreview(file) { - const fileItem = document.createElement('div'); - fileItem.className = 'file-item'; - fileItem.innerHTML = ` - - ${file.name} - × - `; - filePreview.appendChild(fileItem); -} - -function removeFile(fileName) { - selectedFiles = selectedFiles.filter(file => file.name !== fileName); - updateFilePreview(); -} - -function updateFilePreview() { - filePreview.innerHTML = ''; - selectedFiles.forEach(file => addFilePreview(file)); -} - -function sendQuickMessage(message) { - messageInput.value = message; - sendMessage(); -} -function showTypingIndicator() { - typingIndicator.style.display = 'flex'; -} - -function hideTypingIndicator() { - typingIndicator.style.display = 'none'; -} - -function sendAnimation() { - const btn = document.querySelector('.send-btn'); - const icon = btn.querySelector('i'); - - btn.classList.add('fly'); - - // particles - for (let i = 0; i < 8; i++) { - const p = document.createElement('span'); - p.classList.add('particle'); - - p.style.setProperty('--x', `${Math.random() * 60 - 30}px`); - p.style.setProperty('--y', `${Math.random() * 60 - 30}px`); - - btn.appendChild(p); - - setTimeout(() => p.remove(), 600); - } - - setTimeout(() => { - btn.classList.remove('fly'); - icon.style.opacity = 1; - icon.style.transform = 'none'; - }, 900); -} -function sendMessage() { - const message = messageInput.value.trim(); - const contentType = document.getElementById('contentType').value; - - if (!message && selectedFiles.length === 0) return; - - addMessage('user', message, selectedFiles); - - messageInput.value = ''; - messageInput.style.height = 'auto'; - selectedFiles = []; - updateFilePreview(); - - showTypingIndicator(); - - setTimeout(() => { - hideTypingIndicator(); - const response = generateBotResponse(message, contentType); - addMessage('bot', response); - addToRecentAnalyses(contentType, response); - }, 2000); -} - -function addMessage(sender, text, files = []) { - const messageDiv = document.createElement('div'); - messageDiv.className = `message ${sender}`; - - let filesHtml = ''; - if (files.length > 0) { - filesHtml = `
- ${files.map(file => ` ${file.name}`).join('')} -
`; - } - - messageDiv.innerHTML = ` -
- -
-
- ${text} - ${filesHtml} -
- `; - - chatMessages.insertBefore(messageDiv, typingIndicator); - scrollToBottom(); -} - -function showTypingIndicator() { - typingIndicator.style.display = 'flex'; - scrollToBottom(); -} - -function hideTypingIndicator() { - typingIndicator.style.display = 'none'; -} - -function scrollToBottom() { - chatMessages.scrollTop = chatMessages.scrollHeight; -} - -function generateBotResponse(message, contentType) { - const phishingIndicators = [ - 'urgent', 'عاجل', 'فوري', 'click here', 'اضغط هنا', 'limited time', 'وقت محدود', - 'verify account', 'تأكيد الحساب', 'suspended', 'معلق', 'winner', 'فائز', - 'congratulations', 'مبروك', 'free money', 'فلوس مجانية', 'bitcoin', 'بيتكوين' - ]; - - const suspiciousDomains = [ - '.tk', '.ml', '.ga', '.cf', 'bit.ly', 'tinyurl', 'ngrok.com' - ]; - - let indicatorCount = 0; - - phishingIndicators.forEach(indicator => { - if (message.toLowerCase().includes(indicator.toLowerCase())) { - indicatorCount++; - } - }); - - suspiciousDomains.forEach(domain => { - if (message.toLowerCase().includes(domain)) { - indicatorCount += 2; - } - }); - - let response = ''; - - if (message.includes('نصائح') || message.includes('حماية')) { - response = `إليك أهم النصائح للحماية من التصيد الإلكتروني: - -🔒 تحقق دائماً من عنوان URL قبل إدخال معلوماتك -📧 لا تثق في الرسائل التي تطلب معلومات حساسة -🔍 ابحث عن الأخطاء الإملائية والنحوية -🛡️ استخدم المصادقة الثنائية عند الإمكان -📱 حدث برامجك ومتصفحك باستمرار`; - } else if (indicatorCount >= 4) { - response = `⚠️ تحذير: مستوى الخطر عالي! - -تم اكتشاف عدة علامات تحذيرية في المحتوى الذي أرسلته. هذا المحتوى يحتوي على مؤشرات قوية لكونه محاولة تصيد إلكتروني. - -التوصيات: -❌ لا تضغط على أي روابط -❌ لا تدخل أي معلومات شخصية -🗑️ احذف هذه الرسالة فوراً -📞 أبلغ عن هذا المحتوى للجهات المختصة`; - } else if (indicatorCount >= 2) { - response = `⚠️ تحذير: مستوى الخطر متوسط - -تم اكتشاف بعض العلامات المشبوهة في المحتوى. يُنصح بالحذر الشديد. - -التوصيات: -🔍 تحقق من مصدر الرسالة بعناية -❌ لا تدخل معلومات حساسة -📞 تواصل مع الجهة المرسلة مباشرة للتأكد -🔄 استخدم طرق تواصل بديلة للتحقق`; - } else { - response = `✅ مستوى الخطر منخفض - -لم يتم اكتشاف علامات تحذيرية واضحة، لكن يُنصح دائماً بالحذر. - -التوصيات: -🔍 تحقق من صحة المعلومات من مصادر موثوقة -⚠️ كن حذراً عند إدخال معلومات شخصية -🔒 تأكد من أمان الموقع قبل التفاعل معه`; - } - - return response; -} - -function addToRecentAnalyses(type, analysis) { - const recentDiv = document.getElementById('recentAnalyses'); - const now = new Date().toLocaleString('ar-EG'); - - let riskLevel = 'منخفض'; - let riskColor = 'success'; - - if (analysis.includes('عالي')) { - riskLevel = 'عالي'; - riskColor = 'danger'; - } else if (analysis.includes('متوسط')) { - riskLevel = 'متوسط'; - riskColor = 'warning'; - } - - const analysisItem = ` -
- ${riskLevel} - ${type} - ${now} -
- `; - - // Insert at top - if (recentDiv.innerHTML.includes('لا توجد تحليلات سابقة')) { - recentDiv.innerHTML = analysisItem; - } else { - recentDiv.innerHTML = analysisItem + recentDiv.innerHTML; - } - - // Keep only last 3 - const items = recentDiv.querySelectorAll('.recent-item'); - if (items.length > 3) { - for (let i = 3; i < items.length; i++) { - items[i].remove(); - } - } -} - - -document.addEventListener('DOMContentLoaded', function () { - scrollToBottom(); -}); \ No newline at end of file diff --git a/js/blog.js b/js/blog.js deleted file mode 100644 index f48f59f..0000000 --- a/js/blog.js +++ /dev/null @@ -1,121 +0,0 @@ -document.getElementById('newPostForm').addEventListener('submit', function (e) { - e.preventDefault(); - - const title = document.getElementById('postTitle').value; - const category = document.getElementById('postCategory').value; - const content = document.getElementById('postContent').value; - const url = document.getElementById('postUrl').value; - - if (title && category && content) { - addNewPost(title, category, content, url); - this.reset(); - alert('تم نشر التحذير بنجاح! شكراً لك على مساعدة الآخرين.'); - } -}); - -function addNewPost(title, category, content, url) { - const categoryNames = { - 'email': 'رسائل إيميل مزيفة', - 'sms': 'رسائل نصية احتيالية', - 'social': 'منشورات مواقع التواصل', - 'website': 'مواقع مزيفة', - 'app': 'تطبيقات مشبوهة', - 'other': 'أخرى' - }; - - const categoryColors = { - 'email': 'danger', - 'sms': 'warning', - 'social': 'info', - 'website': 'primary', - 'app': 'success', - 'other': 'secondary' - }; - - const postHtml = ` -
-
-
-
-
- -
-
-
مستخدم جديد
- الآن -
-
- ${categoryNames[category]} -
- -
${title}
-

${content}

- - ${url ? ` -
- - الرابط المشبوه: ${url.replace('https://', '').replace('http://', '')} -
- ` : ''} - -
-
- - -
- - 1 مشاهدة - -
-
-
- `; - - const postsContainer = document.getElementById('postsContainer'); - postsContainer.insertAdjacentHTML('afterbegin', postHtml); -} - -document.querySelectorAll('[data-filter]').forEach(button => { - button.addEventListener('click', function () { - const filter = this.getAttribute('data-filter'); - - document.querySelectorAll('[data-filter]').forEach(btn => btn.classList.remove('active')); - this.classList.add('active'); - - const posts = document.querySelectorAll('.post-item'); - let visibleCount = 0; - - posts.forEach(post => { - if (filter === 'all' || post.getAttribute('data-category') === filter) { - post.style.display = 'block'; - visibleCount++; - } else { - post.style.display = 'none'; - } - }); - - const noPostsMessage = document.getElementById('noPostsMessage'); - if (visibleCount === 0) { - noPostsMessage.style.display = 'block'; - } else { - noPostsMessage.style.display = 'none'; - } - }); -}); - -document.addEventListener('click', function (e) { - if (e.target.closest('.btn-outline-success')) { - const button = e.target.closest('.btn-outline-success'); - const currentText = button.innerHTML; - const currentCount = parseInt(currentText.match(/\d+/)[0]); - const newCount = currentCount + 1; - - button.innerHTML = currentText.replace(/\d+/, newCount); - button.classList.remove('btn-outline-success'); - button.classList.add('btn-success'); - } -}); diff --git a/js/main.js b/js/main.js deleted file mode 100644 index 5e67406..0000000 --- a/js/main.js +++ /dev/null @@ -1,201 +0,0 @@ -const quizItems = [ - { - id: "q1", - title: "بنك المثال - صفحة تسجيل الدخول", - url: "https://secure-example-bank.com/login", - language: "ar", - imageText: "صفحة تسجيل دخول بنكي - شعار متكرر\n(معاينة تعليمية)", - isPhishing: true, - explanation: "علامات تحذير: النطاق لا يتطابق مع نطاق انستجرام الرسمي، وجود ضغط لإدخال معلومات حساسة فورًا. تحقق دائمًا من النطاق الرسمي وتواصل مع الدعم إن شككت." - }, - { - id: "q2", - title: "متجر إلكتروني شهير - صفحة رئيسية", - url: "https://www.shop-example.com", - language: "en", - imageText: "صفحة متجر - عروض وتخفيضات\n(معاينة تعليمية)", - isPhishing: false, - explanation: "هذه صفحة تبدو حقيقية: نطاق معروف، واجهة متوافقة، ولا تطلب معلومات حساسة مباشرة." - }, - { - id: "q3", - title: "خدمات البريد - رسالة تفعيل حساب", - url: "http://mail.example-verify.com/activate", - language: "ar", - imageText: "صفحة تفعيل حساب بريدية\n(معاينة تعليمية)", - isPhishing: true, - explanation: "يستخدم HTTP بدلاً من HTTPS، والنطاق لا يبدو رسميًا. الأخطاء الإملائية شائعة في صفحات الاحتيال." - }, - { - id: "q4", - title: "موقع حكومي - بوابة خدمات المواطنين", - url: "https://gov.example.gov.eg", - language: "ar", - imageText: "بوابة حكومية - خدمات المواطنين\n(معاينة تعليمية)", - isPhishing: false, - explanation: "نطاق حكومي واضح ووجود تشفير https. مع ذلك، راجع دومًا الشهادة الرقمية إذا لزم." - }, - { - id: "q5", - title: "عرض وظيفة عاجل - استمارة بيانات", - url: "https://apply-now-jobs.example", - language: "en", - imageText: "نموذج طلب وظيفة - يطلب معلومات بنكية\n(معاينة تعليمية)", - isPhishing: true, - explanation: "طلب بيانات بنكية مبكرًا هو إشارة تحذيرية. قابل للشبهة إن طُلب رقم حساب أو تفاصيل بطاقة قبل مقابلة رسمية." - } - ]; - - // =======State======= - let currentIndex = 0; - let score = 0; - let answered = new Array(quizItems.length).fill(false); - let corrects = new Array(quizItems.length).fill(false); - - // =======DOM elements======= - const btnStart = document.getElementById('btnStart'); - const btnShowRules = document.getElementById('btnShowRules'); - const rulesDiv = document.getElementById('rules'); - - const qCard = document.getElementById('question-card'); - const intro = document.getElementById('intro'); - const qIndexText = document.getElementById('qIndex'); - const scoreBadge = document.getElementById('scoreBadge'); - const scoreShort = document.getElementById('scoreShort'); - const qCount = document.getElementById('qCount'); - - const screenshot = document.getElementById('screenshot'); - const screenshotText = document.getElementById('screenshotText'); - const siteTitle = document.getElementById('siteTitle'); - const urlText = document.getElementById('urlText'); - const btnPhish = document.getElementById('btnPhish'); - const btnLegit = document.getElementById('btnLegit'); - const btnExplain = document.getElementById('btnExplain'); - const feedback = document.getElementById('feedback'); - const noteArea = document.getElementById('noteArea'); - - const btnPrev = document.getElementById('btnPrev'); - const btnNext = document.getElementById('btnNext'); - const btnSkip = document.getElementById('btnSkip'); - const btnRestart = document.getElementById('btnRestart'); - - const finalCard = document.getElementById('final-card'); - const finalScore = document.getElementById('finalScore'); - const finalText = document.getElementById('finalText'); - - // =======Functions======= - function updateOverview() { - qCount.innerText = (currentIndex+1) + " / " + quizItems.length; - scoreShort.innerText = score; - scoreBadge.innerText = "النتيجة: " + score; - } - - function showQuestion(index) { - if (index < 0) index = 0; - if (index >= quizItems.length) index = quizItems.length - 1; - currentIndex = index; - const item = quizItems[index]; - intro.style.display = 'none'; - finalCard.style.display = 'none'; - qCard.style.display = 'block'; - - const iframeSrc = `sites/${item.id}/${item.id}.html`; - let iframe = screenshot.querySelector('iframe.quiz-site-iframe'); - if (!iframe) { - iframe = document.createElement('iframe'); - iframe.className = 'quiz-site-iframe'; - iframe.style.width = '100%'; - iframe.style.height = '100%'; - iframe.style.border = '0'; - iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin'); - screenshot.insertBefore(iframe, screenshot.firstChild); - } - iframe.src = iframeSrc; - screenshotText.innerText = item.imageText; - - siteTitle.innerText = item.title; - urlText.innerText = item.url; - feedback.style.display = 'none'; - noteArea.innerText = ""; - updateOverview(); - btnPrev.disabled = (index === 0); - btnNext.disabled = (index === quizItems.length - 1); - } - - function showFinal() { - qCard.style.display = 'none'; - finalCard.style.display = 'block'; - finalScore.innerText = `نتيجتك: ${score} من ${quizItems.length}`; - const percent = Math.round((score / quizItems.length) * 100); - finalText.innerText = (percent >= 70) ? "ممتاز — لديك فهم جيد لعلامات التصيّد." : (percent >= 40 ? "مقبول — حاول المراجعة أكثر." : "بحاجة لتحسين — راجع إشارات التحذير بعناية."); - updateOverview(); - } - - function giveFeedback(isCorrect, explanation) { - feedback.style.display = 'block'; - feedback.className = isCorrect ? 'alert alert-success' : 'alert alert-danger'; - feedback.innerHTML = (isCorrect ? 'إجابة صحيحة — ' : 'إجابة خاطئة — ') + `
${explanation}
`; - noteArea.innerText = explanation; - } - - function answer(selectedPhishing) { - const item = quizItems[currentIndex]; - if (answered[currentIndex]) { - return; - } - answered[currentIndex] = true; - const correct = (selectedPhishing === item.isPhishing); - corrects[currentIndex] = correct; - if (correct) { score += 1; } - giveFeedback(correct, item.explanation); - updateOverview(); - - setTimeout(() => { - if (currentIndex < quizItems.length - 1) { - showQuestion(currentIndex + 1); - } else { - showFinal(); - } - }, 1200); - } - - btnStart.addEventListener('click', () => { - currentIndex = 0; score = 0; - answered.fill(false); corrects.fill(false); - updateOverview(); - showQuestion(0); - }); - - btnShowRules.addEventListener('click', () => { - rulesDiv.style.display = (rulesDiv.style.display === 'none') ? 'block' : 'none'; - }); - - btnPhish.addEventListener('click', () => answer(true)); - btnLegit.addEventListener('click', () => answer(false)); - - btnExplain.addEventListener('click', () => { - const item = quizItems[currentIndex]; - alert("شرح:\\n\\n" + item.explanation); - }); - - btnPrev.addEventListener('click', () => { - if (currentIndex > 0) showQuestion(currentIndex - 1); - }); - btnNext.addEventListener('click', () => { - if (currentIndex < quizItems.length - 1) showQuestion(currentIndex + 1); - else showFinal(); - }); - btnSkip.addEventListener('click', () => { - answered[currentIndex] = true; - showQuestion(Math.min(currentIndex + 1, quizItems.length - 1)); - }); - - btnRestart.addEventListener('click', () => { - currentIndex = 0; score = 0; answered.fill(false); corrects.fill(false); - updateOverview(); - intro.style.display = 'block'; - finalCard.style.display = 'none'; - qCard.style.display = 'none'; - }); - - updateOverview(); \ No newline at end of file diff --git a/js/report.js b/js/report.js deleted file mode 100644 index 1ebfe17..0000000 --- a/js/report.js +++ /dev/null @@ -1,85 +0,0 @@ -document.addEventListener('DOMContentLoaded', function () { - const form = document.getElementById('reportForm'); - const maxFiles = 5; - const maxSize = 10 * 1024 * 1024; // 10 MB - - if (form) { - form.addEventListener('submit', function (e) { - e.preventDefault(); - - const threatTypeElem = document.getElementById('threatType'); - const descriptionElem = document.getElementById('reportDescription'); - const consentElem = document.getElementById('consentCheck'); - const reportSuccessElem = document.getElementById('reportSuccess'); - - const threatType = threatTypeElem ? threatTypeElem.value.trim() : ''; - const description = descriptionElem ? descriptionElem.value.trim() : ''; - const consent = consentElem ? consentElem.checked : false; - - if (threatType && description && consent) { - if (reportSuccessElem) reportSuccessElem.style.display = 'block'; - - this.reset(); - - if (reportSuccessElem) { - reportSuccessElem.scrollIntoView({ - behavior: 'smooth', - block: 'center' - }); - - setTimeout(() => { - reportSuccessElem.style.display = 'none'; - }, 10000); - } - } else { - // Provide simple feedback if required fields are missing - if (!threatType || !description) { - alert('يرجى ملء نوع التهديد والوصف قبل الإرسال.'); - } else if (!consentElem || !consent) { - alert('يرجى الموافقة على الشروط للمتابعة.'); - } - } - }); - } - - const evidenceInput = document.getElementById('evidenceFiles'); - if (evidenceInput) { - evidenceInput.addEventListener('change', function (e) { - const files = e.target.files || []; - - if (files.length > maxFiles) { - alert(`يمكنك إرفاق حتى ${maxFiles} ملفات فقط`); - this.value = ''; - return; - } - - for (let file of files) { - if (file.size > maxSize) { - alert(`حجم الملف ${file.name} كبير جداً. الحد الأقصى 10 ميجا`); - this.value = ''; - return; - } - } - }); - } - - const threatTypeElem = document.getElementById('threatType'); - if (threatTypeElem) { - threatTypeElem.addEventListener('change', function () { - const impactLevel = document.getElementById('impactLevel'); - const value = this.value; - - if (!impactLevel) return; - - if (value === 'phishing-website' || value === 'fake-app') { - impactLevel.value = 'high'; - } else if (value === 'fake-email' || value === 'sms-scam') { - impactLevel.value = 'medium'; - } else if (value === 'social-scam') { - impactLevel.value = 'low'; - } else { - impactLevel.value = ''; - } - }); - } -}); \ No newline at end of file diff --git a/js/script.js b/js/script.js deleted file mode 100644 index 9afbbf6..0000000 --- a/js/script.js +++ /dev/null @@ -1,961 +0,0 @@ -// ... existing code for phishing templates ... - -const phishingTemplates = { - "google-login": { - title: "جوجل - صفحة تسجيل الدخول", - url: "https://g00gle.com/login", - scenario: "دخلت على جوجل عشان تسجل دخول لحسابك، لقيت الصفحة دي قدامك وطالبة منك الإيميل والباسورد", - isPhishing: true, - explanation: - "علامات تحذير: النطاق لا يتطابق مع نطاق جوجل الرسمي (google.com)، وجود ضغط لإدخال معلومات حساسة فورًا. تحقق دائمًا من النطاق الرسمي.", - isSecure: false, - }, - "instagram-home": { - title: "انستجرام - الصفحة الرئيسية", - url: "https://www.home-instagram.com", - scenario: "صاحبك بعتلك لينك قالك عليه إنه انستجرام جديد، لما دخلت لقيت الصفحة دي", - isPhishing: true, - explanation: "هذه صفحة مزيفة: النطاق خاطئ (instagram.com هو الصحيح)، تطلب معلومات حساسة مباشرة.", - isSecure: false, - }, - "linkedin-login": { - title: "لينكد إن - صفحة تسجيل الدخول", - url: "https://www.linkedin.com/login", - scenario: "عايز تدخل على حسابك في لينكد إن عشان تشوف الرسايل، دخلت على الموقع ولقيت الصفحة دي", - isPhishing: false, - explanation: "هذا موقع LinkedIn الحقيقي. النطاق صحيح (linkedin.com) ووجود تشفير HTTPS.", - isSecure: true, - }, - "adobe-login": { - title: "أدوبي - صفحة تسجيل الدخول", - url: "http://photoshop.com", - scenario: "عايز تحمل فوتوشوب، دورت على النت ولقيت الموقع ده، دخلت عليه ولقيت صفحة تسجيل دخول", - isPhishing: true, - explanation: "يستخدم HTTP بدلاً من HTTPS، والنطاق لا يبدو رسميًا. Adobe الحقيقية تستخدم adobe.com.", - isSecure: false, - }, - "pinterest-login": { - title: "بنترست - صفحة تسجيل الدخول", - url: "http://ngrok.com/3afw32a3yay3awy33/3dsf3/index.php", - scenario: "جالك إيميل من بنترست بيقولك إن حسابك هيتقفل، واللينك ده هيخليك تأكد بياناتك", - isPhishing: true, - explanation: - "الرابط تصيّد لأنه لا يستخدم نطاق Pinterest الرسمي (pinterest.com) بل نطاق ngrok.com، ويفتقد بروتوكول الحماية HTTPS.", - isSecure: false, - }, - "facebook-contest-post": { - title: "فيسبوك - منشور مسابقة", - url: "https://facebook.com/posts/123456", - scenario: "شوفت منشور على فيسبوك بيقول مسابقة كبيرة وجوايز، والمنشور ده قدامك", - isPhishing: true, - explanation: - "ده منشور تصيد! المسابقات اللي بتطلب معلومات شخصية أو فلوس عشان تشارك فيها غالباً بتكون نصب. الصفحات الحقيقية مش بتطلب كده.", - isSecure: true, - }, - "banque-misr-sms": { - title: "رسالة نصية - بنك مصر", - url: "https://messages.google.com", - scenario: "جالك SMS على موبايلك من بنك مصر بيقولك إن فيه مشكلة في حسابك ولازم تأكد بياناتك", - isPhishing: true, - explanation: - "الرسالة دي مزيفة! البنوك الحقيقية مش بتبعت رسايل تطلب فيها رقم البطاقة أو الرقم السري. لو شاكك، اتصل بالبنك مباشرة.", - isSecure: true, - }, - "uber-egypt": { - title: "أوبر مصر - الصفحة الرئيسية", - url: "https://www.uber.com/eg/", - scenario: "عايز تطلب عربية أوبر، دخلت على الموقع من جوجل ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع أوبر الحقيقي في مصر. النطاق صحيح (uber.com) وفيه HTTPS. التطبيق آمن للاستخدام.", - isSecure: true, - }, - "vodafone-offer": { - title: "فودافون مصر - صفحة عرض خاص", - url: "http://vodafone-egypt-offer.net/win", - scenario: - "جالك SMS بيقولك: 'كسبت ٥٠٠ جنيه من فودافون، دوس هنا تستلمهم'، واللينك بيفتح صفحة تسجيل بيانات شبه موقع فودافون", - isPhishing: true, - explanation: - "العرض ده مزيف! فودافون الحقيقية نطاقها vodafone.com.eg مش .net. العروض الحقيقية مش بتطلب معلومات بنكية.", - isSecure: false, - }, - "amazon-egypt-email": { - title: "رسالة إيميل - أمازون مصر", - url: "https://mail.google.com", - scenario: "جالك إيميل من أمازون مصر بيقولك إن طلبك اتألغى ولازم تأكد بياناتك، فتحت الإيميل ولقيت المحتوى ده", - isPhishing: true, - explanation: - "الإيميل ده مزيف! أمازون في مصر بتشتغل تحت اسم أمازون الإمارات، وأمازون الحقيقية بتبعت من amazon.com مش amazon-egypt.com.", - isSecure: true, - }, - "souq-home": { - title: "سوق.كوم - الصفحة الرئيسية", - url: "https://www.souq.com", - scenario: "عايز تشتري حاجة أونلاين، فاكر موقع سوق.كوم القديم، دخلت عليه ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع سوق.كوم الحقيقي (اللي بقى أمازون الإمارات دلوقتي). النطاق صحيح وآمن للتسوق.", - isSecure: true, - }, - "whatsapp-gold-message": { - title: "رسالة واتساب - واتساب جولد", - url: "https://web.whatsapp.com", - scenario: - "جالك رسالة على الواتساب من صاحبك بيقولك على تطبيق واتساب جولد الجديد، ولما دخلت على اللينك شوفت الرسالة دي", - isPhishing: true, - explanation: "الرسالة دي نصب! مفيش حاجة اسمها 'واتساب جولد' أو عروض مجانية من واتساب. متضغطش على أي لينك مشبوه.", - isSecure: true, - }, - "nbe-update": { - title: "البنك الأهلي المصري - صفحة تحديث البيانات", - url: "http://nbe-egypt-update.com/verify", - scenario: "جالك إيميل من البنك الأهلي بيقولك لازم تحدث بياناتك، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "ده موقع مزيف! البنك الأهلي الحقيقي موقعه nbe.com.eg مش nbe-egypt-update.com. البنوك مش بتطلب تحديث البيانات عن طريق لينكات في الإيميل.", - isSecure: false, - }, - "careem-home": { - title: "كريم مصر - الصفحة الرئيسية", - url: "https://www.careem.com/egypt", - scenario: "عايز تطلب عربية كريم، دخلت على الموقع من جوجل ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع كريم الحقيقي في مصر. النطاق صحيح (careem.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "telegram-gold": { - title: "تليجرام جولد - صفحة التحميل", - url: "https://telegram-gold-egypt.net/download", - scenario: "صاحبك قالك على تطبيق تليجرام جولد الجديد اللي فيه مميزات أكتر، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "ده موقع نصب! مفيش حاجة اسمها 'تليجرام جولد'. تليجرام الحقيقي موقعه telegram.org. أي موقع تاني بيدعي إنه تليجرام يبقى مشبوه.", - isSecure: true, - }, - "cib-alert": { - title: "البنك التجاري الدولي - تنبيه أمني", - url: "http://cib-bank-egypt.net/alert", - scenario: "جالك إيميل من البنك التجاري الدولي بيقولك فيه نشاط مشبوه على حسابك، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "ده موقع مزيف! البنك التجاري الدولي الحقيقي موقعه cibeg.com. البنوك مش بتبعت تنبيهات أمنية تطلب بيانات حساسة عبر الإيميل.", - isSecure: false, - }, - "orange-bill": { - title: "أورانج مصر - فاتورة الشهر", - url: "http://orange-egypt-bill.com/pay", - scenario: "جالك إيميل من أورانج بفاتورة الشهر وطالب منك تدفع أونلاين، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: "الموقع ده مزيف! أورانج الحقيقية موقعها orange.eg. الشركات الحقيقية مش بتبعت فواتير من نطاقات مشبوهة.", - isSecure: false, - }, - "etisalat-home": { - title: "اتصالات مصر - الصفحة الرئيسية", - url: "https://www.etisalat.eg", - scenario: "عايز تشوف فاتورة التليفون، دخلت على موقع اتصالات ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع اتصالات مصر الحقيقي. النطاق صحيح (etisalat.eg) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "jumia-sale": { - title: "جوميا - عرض خاص", - url: "http://jumia-egypt-sale.net/mega-sale", - scenario: "شوفت إعلان على فيسبوك لعرض كبير في جوميا، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "العرض ده مزيف! جوميا الحقيقية موقعها jumia.com.eg. العروض الحقيقية مش بتطلب دفع مقدم أو معلومات بنكية قبل الشراء.", - isSecure: false, - }, - "paypal-security": { - title: "باي بال - تحذير أمني", - url: "http://paypal-security-egypt.com/verify", - scenario: "جالك إيميل من PayPal بيقولك إن حسابك في خطر ولازم تأكد بياناتك، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "ده موقع مزيف! PayPal الحقيقي موقعه paypal.com. PayPal مش بيطلب تأكيد الحساب عن طريق لينكات في الإيميل.", - isSecure: false, - }, - "microsoft-office": { - title: "مايكروسوفت أوفيس - صفحة التفعيل", - url: "http://office-activation-egypt.net/activate", - scenario: "اشتريت أوفيس جديد وعايز تفعله، دورت على النت على طريقة التفعيل ولقيت الموقع ده", - isPhishing: true, - explanation: - "الموقع ده مزيف! Microsoft الحقيقية موقعها microsoft.com. تفعيل Office بيتم من خلال الموقع الرسمي أو التطبيق نفسه.", - isSecure: false, - }, - "netflix-payment": { - title: "نتفليكس - مشكلة في الدفع", - url: "https://mail.yahoo.com", - scenario: "جالك إيميل من نتفليكس بيقولك إن فيه مشكلة في الدفع وحسابك هيتقفل، فتحت الإيميل ولقيت المحتوى ده", - isPhishing: true, - explanation: - "الإيميل ده مزيف! Netflix الحقيقي موقعه netflix.com. Netflix مش بيطلب تحديث بيانات الدفع عن طريق لينكات في الإيميل.", - isSecure: true, - }, - "spotify-home": { - title: "سبوتيفاي - الصفحة الرئيسية", - url: "https://www.spotify.com", - scenario: "عايز تسمع موسيقى، دخلت على سبوتيفاي ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع Spotify الحقيقي. النطاق صحيح (spotify.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "apple-icloud": { - title: "آبل - تحذير iCloud", - url: "http://icloud-security-alert.net/verify", - scenario: "جالك إيميل من آبل بيقولك إن حد حاول يدخل على حسابك، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "ده موقع مزيف! Apple الحقيقية موقعها apple.com أو icloud.com. Apple مش بتبعت تحذيرات أمنية تطلب كلمة المرور عبر الإيميل.", - isSecure: false, - }, - "amazon-home": { - title: "أمازون - الصفحة الرئيسية", - url: "https://www.amazon.com", - scenario: "عايز تشتري حاجة من أمازون، دخلت على الموقع ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع Amazon الحقيقي. النطاق صحيح (amazon.com) وفيه HTTPS. الموقع آمن للتسوق.", - isSecure: true, - }, - "ebay-seller": { - title: "إي باي - صفحة بائع", - url: "http://ebay-egypt-deals.net/seller", - scenario: "لقيت عرض حلو على إي باي، البائع بعتلك لينك خاص عشان تشتري منه بسعر أقل، دخلت ولقيت الصفحة دي", - isPhishing: true, - explanation: - "الموقع ده مزيف! eBay الحقيقي موقعه ebay.com. البائعين الحقيقيين على eBay مش بيطلبوا دفع خارج المنصة الرسمية.", - isSecure: false, - }, - "gmail-storage": { - title: "جيميل - تحذير امتلاء المساحة", - url: "http://gmail-storage-full.net/upgrade", - scenario: "جالك إيميل من جوجل بيقولك إن مساحة الجيميل بتاعك خلصت ولازم تزودها، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: "ده موقع مزيف! Gmail الحقيقي موقعه gmail.com. Google مش بتطلب ترقية المساحة عن طريق لينكات مشبوهة.", - isSecure: false, - }, - "yahoo-breach": { - title: "ياهو - تحذير اختراق", - url: "https://mail.yahoo.com", - scenario: "جالك إيميل من ياهو بيقولك إن حسابك اتهكر ولازم تغير الباسورد، فتحت الإيميل ولقيت المحتوى ده", - isPhishing: true, - explanation: - "الإيميل ده مزيف! Yahoo الحقيقي موقعه yahoo.com. Yahoo مش بتطلب تغيير كلمة المرور عن طريق لينكات في الإيميل.", - isSecure: true, - }, - "twitter-verification": { - title: "تويتر - صفحة التوثيق", - url: "http://twitter-verification-egypt.com/verify", - scenario: "شوفت إعلان بيقولك إزاي تاخد علامة التوثيق الزرقا في تويتر، دخلت على اللينك ولقيت الصفحة دي", - isPhishing: true, - explanation: - "الموقع ده مزيف! Twitter (X) الحقيقي موقعه x.com. التوثيق بيتم من خلال الموقع الرسمي مش من لينكات خارجية.", - isSecure: false, - }, - "tiktok-monetization": { - title: "تيك توك - صفحة الربح", - url: "http://tiktok-egypt-money.net/earn", - scenario: "شوفت فيديو بيقولك إزاي تكسب فلوس من تيك توك، دخلت على اللينك اللي في الوصف ولقيت الصفحة دي", - isPhishing: true, - explanation: - "العرض ده مزيف! TikTok الحقيقي موقعه tiktok.com. برامج الربح الحقيقية بتتم من خلال التطبيق الرسمي مش مواقع خارجية.", - isSecure: false, - }, - "youtube-monetization": { - title: "يوتيوب - صفحة تفعيل الربح", - url: "http://youtube-egypt-partner.com/monetize", - scenario: "عايز تفعل الربح من قناتك على يوتيوب، دورت على النت ولقيت الموقع ده بيقولك هيساعدك", - isPhishing: true, - explanation: "الموقع ده مزيف! YouTube الحقيقي موقعه youtube.com. تفعيل الربح بيتم من خلال YouTube Studio الرسمي.", - isSecure: false, - }, - "google-homepage": { - title: "جوجل - الصفحة الرئيسية", - url: "https://www.google.com", - scenario: "فتحت المتصفح عشان تدور على حاجة، دخلت على جوجل ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع Google الحقيقي. النطاق صحيح (google.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "facebook-homepage": { - title: "فيسبوك - الصفحة الرئيسية", - url: "https://www.facebook.com", - scenario: "عايز تشوف آخر الأخبار من أصحابك، دخلت على فيسبوك ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع Facebook الحقيقي. النطاق صحيح (facebook.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "instagram-homepage": { - title: "انستجرام - الصفحة الرئيسية", - url: "https://www.instagram.com", - scenario: "عايز تشوف الصور الجديدة، دخلت على انستجرام ولقيت الصفحة دي", - isPhishing: false, - explanation: "ده موقع Instagram الحقيقي. النطاق صحيح (instagram.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, - "whatsapp-home": { - title: "واتساب - الصفحة الرئيسية", - url: "https://www.whatsapp.com", - scenario: "عايز تحمل واتساب على الكمبيوتر، دخلت على الموقع الرسمي ولقيت الص��حة دي", - isPhishing: false, - explanation: "ده موقع WhatsApp الحقيقي. النطاق صحيح (whatsapp.com) وفيه HTTPS. الموقع آمن للاستخدام.", - isSecure: true, - }, -} - -let currentLanguage = localStorage.getItem("language") || "ar" -let currentTheme = localStorage.getItem("theme") || "light" - -// Initialize theme on load -document.addEventListener("DOMContentLoaded", () => { - initializeTheme() - initializeLanguage() - setupThemeToggle() - setupLanguageToggle() -}) - -function initializeTheme() { - if (currentTheme === "dark") { - document.body.classList.add("dark-mode") - document.getElementById("themeToggle")?.setAttribute("checked", "checked") - document.getElementById("themeToggleMobile")?.setAttribute("checked", "checked") - } -} - -function initializeLanguage() { - if (currentLanguage === "en") { - switchToEnglish() - } -} - -function setupThemeToggle() { - const themeToggle = document.getElementById("themeToggle") - const themeToggleMobile = document.getElementById("themeToggleMobile") - - themeToggle?.addEventListener("change", () => { - toggleTheme() - }) - - themeToggleMobile?.addEventListener("change", () => { - toggleTheme() - }) -} - -function setupLanguageToggle() { - const langButtons = document.querySelectorAll(".lang-btn") - - langButtons.forEach((btn) => { - btn.addEventListener("click", (e) => { - e.preventDefault() - const lang = btn.getAttribute("data-lang") - if (lang === "en") { - switchToEnglish() - } else { - switchToArabic() - } - }) - }) -} - -function toggleTheme() { - currentTheme = currentTheme === "light" ? "dark" : "light" - localStorage.setItem("theme", currentTheme) - - if (currentTheme === "dark") { - document.body.classList.add("dark-mode") - } else { - document.body.classList.remove("dark-mode") - } - - // Sync both toggles - const themeToggle = document.getElementById("themeToggle") - const themeToggleMobile = document.getElementById("themeToggleMobile") - if (themeToggle) { - themeToggle.checked = currentTheme === "dark" - } - if (themeToggleMobile) { - themeToggleMobile.checked = currentTheme === "dark" - } -} - -function switchToEnglish() { - currentLanguage = "en" - localStorage.setItem("language", "en") - document.documentElement.setAttribute("lang", "en") - document.documentElement.setAttribute("dir", "ltr") - updatePageContent("en") - updateLanguageButtons("en") -} - -function switchToArabic() { - currentLanguage = "ar" - localStorage.setItem("language", "ar") - document.documentElement.setAttribute("lang", "ar") - document.documentElement.setAttribute("dir", "rtl") - updatePageContent("ar") - updateLanguageButtons("ar") -} - -function updatePageContent(lang) { - const elements = document.querySelectorAll("[data-ar][data-en]") - - elements.forEach((el) => { - if (lang === "en") { - el.textContent = el.getAttribute("data-en") - } else { - el.textContent = el.getAttribute("data-ar") - } - }) - - // Special handling for html/body attributes - if (lang === "en") { - document.body.style.direction = "ltr" - } else { - document.body.style.direction = "rtl" - } -} - -function updateLanguageButtons(lang) { - const buttons = document.querySelectorAll(".lang-btn") - buttons.forEach((btn) => { - btn.classList.remove("active") - if (btn.getAttribute("data-lang") === lang) { - btn.classList.add("active") - } - }) -} - -const toggle = document.getElementById("nav-toggle"); -const menu = document.getElementById("nav-menu"); - -toggle.addEventListener("click", () => { - toggle.classList.toggle("active"); - menu.classList.toggle("active"); -}); -document.addEventListener("DOMContentLoaded", () => { - const toggle = document.getElementById("nav-toggle"); - const menu = document.getElementById("nav-menu"); - - toggle.addEventListener("click", (e) => { - e.stopPropagation(); - toggle.classList.toggle("active"); - menu.classList.toggle("active"); - }); - - // Close the mobile menu when clicking outside it - document.addEventListener("click", (e) => { - if ( - menu.classList.contains("active") && - !menu.contains(e.target) && - !toggle.contains(e.target) - ) { - menu.classList.remove("active"); - toggle.classList.remove("active"); - } - }); -}); - -let currentQuizQuestions = [] -let currentIndex = 0 -let score = 0 -const answered = new Array(20).fill(false) -const corrects = new Array(20).fill(false) - -const btnStart = document.getElementById("btnStart") -const btnShowRules = document.getElementById("btnShowRules") -const rulesDiv = document.getElementById("rules") - -const qCard = document.getElementById("question-card") -const intro = document.getElementById("intro") -const qIndexText = document.getElementById("qIndex") -const scoreBadge = document.getElementById("scoreBadge") -const scoreShort = document.getElementById("scoreShort") -const qCount = document.getElementById("qCount") -const screenshot = document.getElementById("screenshot") -const siteTitle = document.getElementById("siteTitle") -const scenarioText = document.getElementById("scenario") -const urlDisplay = document.getElementById("url-display") -const securityIcon = document.getElementById("security-icon") -const btnPhish = document.getElementById("btnPhish") -const btnLegit = document.getElementById("btnLegit") -const btnExplain = document.getElementById("btnExplain") -const feedback = document.getElementById("feedback") -const noteArea = document.getElementById("noteArea") - -const btnPrev = document.getElementById("btnPrev") -const btnNext = document.getElementById("btnNext") -const btnSkip = document.getElementById("btnSkip") -const btnRestart = document.getElementById("btnRestart") - -const finalCard = document.getElementById("final-card") -const finalScore = document.getElementById("finalScore") -const finalText = document.getElementById("finalText") - -const navToggle = document.getElementById("nav-toggle") -const navMenu = document.getElementById("nav-menu") - -if (navToggle && navMenu) { - navToggle.addEventListener("click", () => { - navMenu.classList.toggle("active") - navToggle.classList.toggle("active") - }) - - document.querySelectorAll(".nav-link, .dropdown-item").forEach((link) => { - link.addEventListener("click", () => { - navMenu.classList.remove("active") - navToggle.classList.remove("active") - }) - }) -} - -function selectRandomQuestions() { - const templateKeys = Object.keys(phishingTemplates) - const shuffled = templateKeys.sort(() => 0.5 - Math.random()) - const selected = shuffled.slice(0, 20) - - currentQuizQuestions = selected.map((key) => ({ - templateName: key, - ...phishingTemplates[key], - })) -} - -function updateOverview() { - if (qCount) qCount.innerText = currentIndex + 1 + " / 20" - if (scoreShort) scoreShort.innerText = score - if (scoreBadge) scoreBadge.innerText = (currentLanguage === "en" ? "Score: " : "النتيجة: ") + score -} - -function updateUrlBar(item) { - if (urlDisplay) urlDisplay.innerText = item.url - - if (securityIcon) { - if (item.isSecure) { - securityIcon.innerText = "🔒" - } else { - securityIcon.innerText = "⚠️" - } - } -} - -function showQuestion(index) { - if (index < 0) index = 0 - if (index >= 20) index = 19 - currentIndex = index - const item = currentQuizQuestions[index] - - if (intro) intro.style.display = "none" - if (finalCard) finalCard.style.display = "none" - if (qCard) qCard.style.display = "block" - - if (screenshot) { - screenshot.innerHTML = ` - -` - } - - if (siteTitle) siteTitle.innerText = item.title - if (scenarioText) scenarioText.innerText = item.scenario - updateUrlBar(item) - if (qIndexText) qIndexText.innerText = currentLanguage === "en" ? `Question ${index + 1}` : `السؤال ${index + 1}` - if (feedback) feedback.style.display = "none" - if (noteArea) noteArea.innerHTML = "" - - resetButtonStates() - updateOverview() - - if (btnPrev) btnPrev.disabled = index === 0 - if (btnNext) { - btnNext.disabled = index === 19 - if (index < 19) { - btnNext.disabled = !answered[index] - } - } -} - - const headers = document.querySelectorAll(".accordion-header"); - - headers.forEach(header => { - header.addEventListener("click", () => { - const content = header.nextElementSibling; - - headers.forEach(h => { - if (h !== header) { - h.nextElementSibling.style.maxHeight = null; - } - }); - - if (content.style.maxHeight) { - content.style.maxHeight = null; - } else { - content.style.maxHeight = content.scrollHeight + "px"; - } - }); - }); -function resetButtonStates() { - if (btnPhish) { - btnPhish.disabled = false - btnPhish.className = "btn btn-danger btn-quiz" - } - if (btnLegit) { - btnLegit.disabled = false - btnLegit.className = "btn btn-outline-primary btn-quiz" - } -} - -function showFinal() { - if (qCard) qCard.style.display = "none" - if (finalCard) finalCard.style.display = "block" - - const scoreText = currentLanguage === "en" ? `Your Score: ${score} out of 20` : `نتيجتك: ${score} من 20` - if (finalScore) finalScore.innerText = scoreText - - const percent = Math.round((score / 20) * 100) - let message = "" - let alertClass = "" - - if (percent >= 80) { - message = - currentLanguage === "en" - ? "🎉 Excellent! You have a great understanding of phishing signs. Keep applying this knowledge." - : "🎉 ممتاز! لديك فهم ممتاز لعلامات التصيّد الإلكتروني. استمر في تطبيق هذه المعرفة." - alertClass = "alert-success" - } else if (percent >= 60) { - message = - currentLanguage === "en" - ? "⚠️ Good! You have a good understanding but can improve more. Review the tips below." - : "⚠️ جيد! لديك فهم جيد ولكن يمكنك التحسن أكثر. راجع النصائح أدناه." - alertClass = "alert-warning" - } else { - message = - currentLanguage === "en" - ? "❌ Needs Improvement! Review warning signs carefully and try again." - : "❌ بحاجة لتحسين! راجع إشارات التحذير بعناية وأعد المحاولة." - alertClass = "alert-danger" - } - - if (finalText) { - finalText.innerHTML = `
${message}
` - } - updateOverview() -} - -function giveFeedback(isCorrect, explanation) { - if (feedback) { - feedback.style.display = "block" - const alertClass = isCorrect ? "alert-success" : "alert-danger" - const icon = isCorrect ? "✅" : "❌" - const title = - currentLanguage === "en" - ? isCorrect - ? "Correct Answer!" - : "Wrong Answer!" - : isCorrect - ? "إجابة صحيحة!" - : "إجابة خاطئة!" - - feedback.innerHTML = ` -
-
-${icon} -${title} -
-
${explanation}
-
-` - } - - if (noteArea) { - const alertClass = isCorrect ? "alert-success" : "alert-danger" - const label = currentLanguage === "en" ? (isCorrect ? "Correct" : "Wrong") : isCorrect ? "صحيح" : "خطأ" - noteArea.innerHTML = ` -
-${label}: ${explanation} -
-` - } -} - -function answer(selectedPhishing) { - const item = currentQuizQuestions[currentIndex] - if (answered[currentIndex]) { - return - } - answered[currentIndex] = true - const correct = selectedPhishing === item.isPhishing - corrects[currentIndex] = correct - if (correct) { - score += 1 - } - - if (btnPhish) btnPhish.disabled = true - if (btnLegit) btnLegit.disabled = true - - if (selectedPhishing) { - if (btnPhish) { - btnPhish.className = correct ? "btn btn-success btn-quiz" : "btn btn-danger btn-quiz" - } - } else { - if (btnLegit) { - btnLegit.className = correct ? "btn btn-success btn-quiz" : "btn btn-danger btn-quiz" - } - } - - giveFeedback(correct, item.explanation) - updateOverview() - - if (currentIndex === 19) { - setTimeout(() => { - showFinal() - }, 3000) - } - - if (btnNext && currentIndex < 19) { - btnNext.disabled = false - } -} - -if (btnStart) { - btnStart.addEventListener("click", () => { - selectRandomQuestions() - currentIndex = 0 - score = 0 - answered.fill(false) - corrects.fill(false) - updateOverview() - showQuestion(0) - }) -} - -if (btnShowRules) { - btnShowRules.addEventListener("click", () => { - if (rulesDiv) { - rulesDiv.style.display = rulesDiv.style.display === "none" ? "block" : "none" - } - }) -} - -if (btnPhish) btnPhish.addEventListener("click", () => answer(true)) -if (btnLegit) btnLegit.addEventListener("click", () => answer(false)) - -if (btnExplain) { - btnExplain.addEventListener("click", () => { - const item = currentQuizQuestions[currentIndex] - alert(currentLanguage === "en" ? "Explanation:\n\n" + item.explanation : "شرح:\n\n" + item.explanation) - }) -} - -if (btnPrev) { - btnPrev.addEventListener("click", () => { - if (currentIndex > 0) showQuestion(currentIndex - 1) - }) -} - -if (btnNext) { - btnNext.addEventListener("click", () => { - if (!answered[currentIndex]) { - const msg = - currentLanguage === "en" - ? "You must answer the question first or press 'Skip' to move to the next question" - : "يجب الإجابة على السؤال أولاً أو اضغط 'تخطي' للانتقال للسؤال التالي" - alert(msg) - return - } - - if (currentIndex < 19) { - showQuestion(currentIndex + 1) - } else { - showFinal() - } - }) -} - -if (btnSkip) { - btnSkip.addEventListener("click", () => { - answered[currentIndex] = true - if (currentIndex < 19) { - showQuestion(currentIndex + 1) - } else { - showFinal() - } - }) -} - -if (btnRestart) { - btnRestart.addEventListener("click", () => { - currentIndex = 0 - score = 0 - answered.fill(false) - corrects.fill(false) - updateOverview() - if (intro) intro.style.display = "block" - if (finalCard) finalCard.style.display = "none" - if (qCard) qCard.style.display = "none" - }) -} - -document.addEventListener("DOMContentLoaded", () => { - document.querySelectorAll('a[href^="#"]').forEach((anchor) => { - anchor.addEventListener("click", function (e) { - e.preventDefault() - const target = document.querySelector(this.getAttribute("href")) - if (target) { - target.scrollIntoView({ - behavior: "smooth", - block: "start", - }) - } - }) - }) - - const observerOptions = { - threshold: 0.1, - rootMargin: "0px 0px -50px 0px", - } - - const observer = new IntersectionObserver((entries) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - entry.target.style.opacity = "1" - entry.target.style.transform = "translateY(0)" - } - }) - }, observerOptions) - - document.querySelectorAll(".tip-card").forEach((card) => { - card.style.opacity = "0" - card.style.transform = "translateY(20px)" - card.style.transition = "opacity 0.6s ease, transform 0.6s ease" - observer.observe(card) - }) - - updateOverview() -}) - -document.addEventListener("keydown", (e) => { - if (qCard && qCard.style.display !== "none") { - if (e.key === "1" || e.key === "ArrowLeft") { - if (btnPhish && !btnPhish.disabled) answer(true) - } else if (e.key === "2" || e.key === "ArrowRight") { - if (btnLegit && !btnLegit.disabled) answer(false) - } else if (e.key === "Enter" || e.key === " ") { - if (btnNext && !btnNext.disabled) { - if (currentIndex < 19) { - showQuestion(currentIndex + 1) - } else { - showFinal() - } - } - } - } -}) - -document.addEventListener("DOMContentLoaded", () => { - const cards = Array.from(document.querySelectorAll(".tips-grid .tip-card")) - if (!cards.length) return - cards.forEach((card, i) => { - card.classList.remove("in-from-right", "in-from-left", "fade-in", "offset-right", "offset-left", "offset-scale") - card.classList.add("offset-bottom") - card.classList.add(`stagger-${i % 6}`) - }) - const observerOptions = { - root: null, - rootMargin: "0px 0px -10% 0px", - threshold: 0.15, - } - const io = new IntersectionObserver((entries, obs) => { - entries.forEach((entry) => { - if (!entry.isIntersecting) return - const card = entry.target - card.classList.remove("fade-in") - void card.offsetWidth - card.classList.add("fade-in") - obs.unobserve(card) - }) - }, observerOptions) - cards.forEach((c) => io.observe(c)) -}) - - -// نختار كل العناصر اللي عليها كلاس scroll-element -const scrollElements = document.querySelectorAll(".scroll-element"); - -// دالة تتحقق إذا العنصر ظهر على الشاشة -const elementInView = (el, offset = 0) => { - const elementTop = el.getBoundingClientRect().top; - return elementTop <= (window.innerHeight || document.documentElement.clientHeight) - offset; -}; - -// دالة تضيف الكلاس show -const displayScrollElement = (el) => { - el.classList.add("show"); -}; - -// دالة تزيل الكلاس show (اختياري لو عايز تقدر تعمل scroll up) -const hideScrollElement = (el) => { - el.classList.remove("show"); -}; - -// الدالة الرئيسية اللي هتشتغل عند كل Scroll -const handleScrollAnimation = () => { - scrollElements.forEach((el) => { - if (elementInView(el, 100)) { // يظهر قبل ما يوصل نص العنصر بمقدار 100px - displayScrollElement(el); - } else { - hideScrollElement(el); - } - }); -}; - - - - -// نضيف Event Listener للـ Scroll -window.addEventListener("scroll", handleScrollAnimation); - -// اختياري: نفّذ أول مرة عشان العناصر اللي ظاهر أول الصفحة تظهر مباشرة -handleScrollAnimation(); - - -// Counter Animation -const counters = document.querySelectorAll('.stat-number'); -let started = false; -function animateCounter(el) { - const originalText = el.textContent.trim(); - - // Extract number only - const target = parseInt(originalText.replace(/\D/g, ''), 10); - - // Extract prefix & suffix (like "+", "%", "minutes") - const prefix = originalText.match(/^\D+/)?.[0] || ""; - const suffix = originalText.match(/\D+$/)?.[0] || ""; - - let current = 0; - const speed = target / 60; - - const update = () => { - current += speed; - - if (current < target) { - el.textContent = prefix + Math.floor(current).toLocaleString() + suffix; - requestAnimationFrame(update); - } else { - el.textContent = prefix + target.toLocaleString() + suffix; - } - }; - - el.style.opacity = 1; - update(); -} -const observer = new IntersectionObserver((entries) => { - if (entries[0].isIntersecting && !started) { - counters.forEach(c => animateCounter(c)); - started = true; - } -}); -const statsSection = document.querySelector('.hero-stats'); -observer.observe(statsSection); \ No newline at end of file From cda088037d4a4d6b83f50c3c873fa8a72c4cfa64 Mon Sep 17 00:00:00 2001 From: Eye of Horus Team <225619771+eyeofhorussecurity@users.noreply.github.com> Date: Fri, 9 Jan 2026 02:54:35 +0200 Subject: [PATCH 2/8] Delete pages directory --- pages/assistant.html | 336 ------------------------------------- pages/blog.html | 356 --------------------------------------- pages/extension.html | 366 ---------------------------------------- pages/report.html | 389 ------------------------------------------- pages/simulator.html | 353 --------------------------------------- 5 files changed, 1800 deletions(-) delete mode 100644 pages/assistant.html delete mode 100644 pages/blog.html delete mode 100644 pages/extension.html delete mode 100644 pages/report.html delete mode 100644 pages/simulator.html diff --git a/pages/assistant.html b/pages/assistant.html deleted file mode 100644 index a7d5ba8..0000000 --- a/pages/assistant.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - المساعد الذكي - EoH Security - - - - - - - - - - - - - - - - -
-
-
-
-

- - - المساعد حورس للأمان الرقمي - -

- -

- - تحدث مع المساعد حورس وأرسل له المحتوى المشبوه للحصول على تحليل فوري - -

- - -
-
-
- -
-
-
-
-
-
-
- - - نصائح سريعة - -
- -
    -
  • تحقق من عنوان المرسل في الرسائل الإلكترونية
  • -
  • انتبه للأخطاء الإملائية والنحوية
  • -
  • لا تضغط على الروابط المشبوهة
  • -
  • تأكد من وجود HTTPS في المواقع المهمة
  • -
-
-
-
- -
-
-
-
- - - كيف يعمل المساعد؟ - -
-

- يستخدم المساعد حورس خوارزميات متقدمة لتحليل المحتوى والبحث عن علامات التصيد الإلكتروني مثل الروابط المشبوهة والنصوص المضللة. -

-
-
-
- -
-
-
-
- - - التحليلات الأخيرة - -
-
-

لا توجد تحليلات سابقة

-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
المساعد حورس
- متصل 24/7 -
-
- -
-
- -
-
-
- -
-
- مرحباً! أنا المساعد الذكي للأمان الرقمي. يمكنني مساعدتك في تحليل المحتوى المشبوه. أرسل لي أي رابط أو رسالة أو صورة تشك في أنها قد تكون محاولة تصيد إلكتروني. -
-
- -
- - - - - - - -
- - -
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- - - -
- -
-
- -
-
-
-
-
-
- - - - - - - - - - - diff --git a/pages/blog.html b/pages/blog.html deleted file mode 100644 index 88fb992..0000000 --- a/pages/blog.html +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - EoH Security - المدونة - - - - - - - - - - - - - - - -
-
-
-
-

- - - مدونة الأمان الرقمي - -

-

- شارك تجاربك مع التصيد الإلكتروني وحذر الآخرين من التهديدات الجديدة -

-
-
-
- - -
-
-
-
-
-
-
- شارك تجربتك -
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
سيتم عرضه بشكل آمن للتحذير
-
- -
- -
-
-
-
-
- -
-
-

آخر التحذيرات والتجارب

-
- - - - - -
-
- -
-
-
-
-
-
- -
-
-
أحمد محمد
- منذ ساعتين -
-
- رسائل إيميل مزيفة -
- -
تحذير: رسائل مزيفة باسم البنك الأهلي المصري
-

- وصلتني رسالة إيميل تدعي أنها من البنك الأهلي تطلب تحديث بيانات الحساب. - الرسالة تحتوي على أخطاء إملائية واضحة والرابط يؤدي إلى موقع مشبوه. - انتبهوا من هذا النوع من الرسائل! -

- -
- - الرابط المشبوه: nbe-update-account[.]net -
- -
-
- - -
- - 156 مشاهدة - -
-
-
- -
-
-
-
-
- -
-
-
فاطمة علي
- منذ 4 ساعات -
-
- رسائل نصية احتيالية -
- -
رسائل مزيفة باسم فودافون تطلب تحديث البيانات
-

- وصلتني رسالة نصية تدعي أنها من فودافون تقول أن خطي سيتم إيقافه إذا لم أضغط على الرابط لتحديث البيانات. - اتصلت بخدمة العملاء وأكدوا أنها رسالة احتيالية. -

- -
- نص الرسالة المشبوهة: -

"عزيزي العميل، خطك سيتم إيقافه خلال 24 ساعة. اضغط على الرابط لتحديث بياناتك: [رابط مشبوه]"

-
- -
-
- - -
- - 89 مشاهدة - -
-
-
- -
-
-
-
-
- -
-
-
محمد حسن
- منذ يوم واحد -
-
- منشورات مواقع التواصل -
- -
مسابقة مزيفة على فيسبوك تطلب معلومات شخصية
-

- شاهدت منشور على فيسبوك يدعي أنه مسابقة من شركة سامسونج لربح هاتف جديد. - المنشور يطلب ملء استمارة بالمعلومات الشخصية ورقم البطاقة الائتمانية "للشحن". - هذا نصب واضح! -

- -
- - تحذير: الشركات الحقيقية لا تطلب معلومات بنكية في المسابقات -
- -
-
- - -
- - 203 مشاهدة - -
-
-
-
- - -
-
-
-
- - - - - - - - - - diff --git a/pages/extension.html b/pages/extension.html deleted file mode 100644 index 3baac74..0000000 --- a/pages/extension.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - تحميل إضافة EoH-Guard - - - - - - - - - - - - - - - -
- -
-
-
-

- - إضافة EoH-Guard - حماية ذكية -

-

- اكتشف كيفية تحميل وتثبيت إضافة EoH-Guard على متصفحك للحماية من التصيد والتتبع أثناء التصفح. -

-
-
-
- - -
-
-

مميزات EoH-Guard

-
-
- -

حماية من التتبع

-

توقف تتبع أنشطتك الإلكترونية والحفاظ على خصوصيتك

-
-
- -

كشف التصيد

-

تحديد ومنع المواقع المزيفة قبل أن تؤذيك

-
-
- -

تحديثات فورية

-

تلقي تحديثات حول التهديدات وهي تحدث

-
-
- -

سهل الاستخدام

-

واجهة بسيطة حتى للمستخدمين المبتدئين

-
-
-
-
- - -
-
-

خطوات التحميل والتثبيت

- - -
-
-
1
-

اضغط على زر التحميل

-
-

- ابدأ بالضغط على زر 'تحميل الآن' الموجود أدناه. سيتم تحميل ملف إضافة EoH-Guard على جهازك. -

- -
-
-
- ملاحظة: -

تأكد من أن متصفحك مدعوم: Chrome، Firefox أو Edge

-
-
- - -
-
-
2
-

اختر متصفحك

-
-

- اختر المتصفح الذي تستخدمه وتابع التعليمات الخاصة به: -

-
-
- - Chrome -
-
- - Firefox -
-
- - Edge -
-
-
-
-
- - -
-
-
3
-

تثبيت على Chrome

-
-

- اتبع الخطوات التالية لتثبيت الإضافة على Chrome: -

-
    -
  • اذهب إلى chrome://extensions في شريط العناوين
  • -
  • فعّل 'وضع المطورين' من الزاوية العلوية اليمنى
  • -
  • انقر على 'تحميل الإضافة المفكوكة'
  • -
  • اختر مجلد الإضافة المحملة
  • -
  • تم! ستجد الإضافة الآن في قائمة الإضافات
  • -
-
-
-
- - يجب أن تكون ملفات الإضافة مفك ضغطها لتتمكن من تحميلها -
-
- - -
-
-
4
-

تثبيت على Firefox

-
-

- اتبع الخطوات التالية لتثبيت الإضافة على Firefox: -

-
    -
  • اذهب إلى about:addons في شريط العناوين
  • -
  • انقر على أيقونة الترس وحدد 'تثبيت إضافة من ملف'
  • -
  • اختر ملف الإضافة المحمل (.xpi أو .zip)
  • -
  • انقر 'فتح' وسيبدأ التثبيت تلقائياً
  • -
  • تم! ستظهر الإضافة في قائمة إضافاتك
  • -
-
-
-
- - -
-
-
5
-

تثبيت على Edge

-
-

- اتبع الخطوات التالية لتثبيت الإضافة على Edge: -

-
    -
  • اذهب إلى edge://extensions في شريط العناوين
  • -
  • فعّل 'وضع المطورين' من الزاوية العلوية اليسرى
  • -
  • اسحب وأفلت ملف الإضافة المحمل إلى النافذة
  • -
  • سيطلب منك تأكيد التثبيت - انقر 'إضافة الإضافة'
  • -
  • تم! الإضافة جاهزة للاستخدام الآن
  • -
-
-
-
- - -
-
-
6
-

ضبط الإعدادات

-
-

- بعد التثبيت، قم بضبط إعدادات الإضافة حسب احتياجاتك: -

-
    -
  • انقر على أيقونة EoH-Guard في شريط الأدوات
  • -
  • اختر 'الإعدادات' من القائمة المنسدلة
  • -
  • فعّل 'حماية التتبع' و'كشف التصيد'
  • -
  • يمكنك تخصيص مستوى الحماية (منخفض/متوسط/عالي)
  • -
  • احفظ الإعدادات وتصفح بآمان!
  • -
-
-
-
- نصيحة: -

ننصح بتفعيل جميع خيارات الحماية للحصول على أفضل الأمان

-
-
- - -
-
-
7
-

كيفية الاستخدام

-
-

- بعد التثبيت والتكوين، إليك كيفية استخدام الإضافة: -

-
    -
  • ستعمل الإضافة تلقائياً في الخلفية أثناء تصفحك
  • -
  • إذا اكتشفت موقع تصيد أو متتبع، ستصدر تحذيراً
  • -
  • انقر على أيقونة الإضافة للاطلاع على تقرير النشاط اليومي
  • -
  • إذا واجهت موقع مريب، بلّغ عنه من خلال الإضافة
  • -
  • راقب قائمة المواقع المحظورة والمتتبعات التي تم حجبها
  • -
-
-
-
- - -
-
-
8
-

حل المشاكل

-
-

- إذا واجهت أي مشاكل، جرب الحلول التالية: -

-
    -
  • تحقق من توافقية المتصفح الخاص بك
  • -
  • أعد تشغيل المتصفح بعد التثبيت
  • -
  • تأكد من أن الإضافة مُفعّلة في إعدادات المتصفح
  • -
  • حاول إلغاء تثبيت الإضافة وإعادة تثبيتها
  • -
  • تحقق من أن ملفات الإضافة لم تتضرر أثناء التحميل
  • -
-
-
-
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/pages/report.html b/pages/report.html deleted file mode 100644 index 3305f9e..0000000 --- a/pages/report.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - EoH Security - الإبلاغ عن موقع - - - - - - - - - - - - - - - -
-
-
-
-

- - الإبلاغ عن محتوى مشبوه -

-

- ساعدنا في حماية المجتمع من التصيد الإلكتروني بالإبلاغ عن المحتوى المشبوه -

-
-
-
- -
-
-
-
-
-
-
- - إرشادات الإبلاغ -
-
    -
  • كن دقيقاً في وصف التهديد
  • -
  • أرفق لقطات شاشة إن أمكن
  • -
  • لا تضغط على الروابط المشبوهة
  • -
  • احتفظ بنسخة من الرسالة الأصلية
  • -
  • أبلغ فوراً عن أي محاولة تصيد
  • -
-
-
- -
-
-
- - لماذا الإبلاغ مهم؟ -
-
    -
  • يساعد في حماية المستخدمين الآخرين
  • -
  • يساهم في تطوير أنظمة الحماية
  • -
  • يساعد الجهات المختصة في التتبع
  • -
  • يقلل من انتشار التهديدات
  • -
-
-
- -
-
-
- - إحصائيات التقارير -
-
-
-
-

1,247

- تقرير هذا الشهر -
-
-
-

89%

- تم حلها -
-
-
-
- -
-
-
- - أحدث التهديدات المبلغ عنها -
-
-
- موقع تصيد -
تقليد موقع البنك الأهلي
- منذ ساعة -
-
- رسالة مزيفة -
ادعاء الفوز بجائزة
- منذ 3 ساعات -
-
- تطبيق مزيف -
تقليد تطبيق بنكي
- منذ 5 ساعات -
-
-
-
- -
-
-
- - خصوصيتك محمية -
-

- جميع البلاغات تتم معالجتها بسرية تامة. يمكنك الإبلاغ بشكل مجهول إذا كنت تفضل ذلك. -

-
-
- -
-
-
- - معلومات الاتصال -
-
-

الخط الساخن: 19777

-

البريد الإلكتروني: report@eohsecurity.com

-

ساعات العمل: 24/7

-

- للحالات العاجلة، يمكنك الاتصال بالخط الساخن مباشرة -

-
-
-
-
-
-
-
-
- - نموذج الإبلاغ -
-

- املأ النموذج أدناه للإبلاغ عن أي محتوى مشبوه واجهته. سيتم مراجعة تقريرك من قبل فريق الأمان لدينا. -

- -
-
-
- - -
-
- - -
-
- -
- - -
- -
- - -
إذا كان التهديد يحتوي على رابط
-
- -
- - -
- -
- - -
يمكنك إرفاق حتى 5 ملفات (الحد الأقصى 10 ميجا لكل ملف)
-
- -
- - -
- -
- -
- - -
-
- - -
-
- - -
-
- - -
-
- -
- - -
- -
- - -
- -
- - -
-
- - -
-
-
-
-
-
-
- - - - - - - - - - - diff --git a/pages/simulator.html b/pages/simulator.html deleted file mode 100644 index 132ee0e..0000000 --- a/pages/simulator.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - Eye Of Horus Security - - - - - - - - - - - - - - - -
-
-
-
-

- - - اختبار محاكاة التصيد الإلكتروني - -

-

- تعلم كيفية حماية نفسك من محاولات التصيد الإلكتروني والاحتيال الرقمي. - هذا الاختبار سيساعدك على التعرف على التهديدات الشائعة وكيفية تجنبها. -

- -
-
-
-
-
-

- - - ملاحظات هامة للحماية - -

- - -
-
-
- -
-

تحقق من الروابط

-

- لا تضغط على الروابط المشبوهة في الرسائل الإلكترونية أو الرسائل النصية. - تحقق من عنوان الرابط قبل النقر عليه. -

-
- -
-
- -
-

تأكد من عنوان الموقع

-

- تحقق من عنوان الموقع في شريط العناوين وتأكد من وجود رمز القفل (HTTPS) - قبل إدخال أي بيانات شخصية. -

-
- -
-
- -
-

المصادقة الثنائية

-

- استخدم المصادقة الثنائية (2FA) في جميع حساباتك المهمة لإضافة طبقة - حماية إضافية ضد المتسللين. -

-
- -
-
- -
-

كن حذراً من المعلومات الشخصية

-

- لا تشارك معلوماتك الشخصية أو المالية عبر البريد الإلكتروني أو - المواقع غير الموثوقة. -

-
- -
-
- -
-

تحديث البرامج

-

- حافظ على تحديث نظام التشغيل والبرامج باستمرار للحصول على - أحدث تصحيحات الأمان. -

-
- -
-
- -
-

الإبلاغ عن المحتوى المشبوه

-

- إذا واجهت محتوى مشبوهاً أو محاولة تصيد، قم بالإبلاغ عنها - للجهات المختصة فوراً. -

-
-
-
-
-
-
-

- - اختبر معرفتك بالأمان الرقمي -

-
-
-
-
-
نتائج سريعة
-

السؤال الحالي: 0 / 20

-

النقاط: 0

-
-
ملاحظات بعد كل سؤال
-
-
-
- -
-
-
معلومات مساعدة
-
    -
  • ابحث عن اختلافات في النطاق (domain) أو أحرف غريبة.
  • -
  • تحقق من وجود قفل الأمان في المتصفح لكن لا تعتمد عليه وحده.
  • -
  • لا تُدخل بيانات حساسة إن لم تكن متأكداً من المصدر.
  • -
-
-
-
-
-
-
-
ابدأ الاختبار
-

- سيعرض لك الموقع 20 مثال عشوائي من مجموعة كبيرة من مواقع التصيد باللغة العربية والإنجليزية. عليك أن تختار إن كانت هذه الصفحة تصيّداً أم حقيقية. - الهدف هو تدريب عينك على إشارات التحذير. الاختبار تعليمي فقط. -

- -
-
-

اضغط على ابدأ لبدء الاختبار. لكل إجابة صحيحة تحصل على نقطة.

-
- - -
-
- - - - - - -
-
-
- -
-
-
تحميل إضافة المتصفح
-

قم بتحميل اداة EoH Guard, وتصفح بلا قلق!

- -
-
-
-
-
-
-
- - - - - - - - - - From bd2ddabe036257caab33b7777e759318b40ab879 Mon Sep 17 00:00:00 2001 From: Eye of Horus Team <225619771+eyeofhorussecurity@users.noreply.github.com> Date: Fri, 9 Jan 2026 02:54:48 +0200 Subject: [PATCH 3/8] Delete index.html --- index.html | 840 ----------------------------------------------------- 1 file changed, 840 deletions(-) delete mode 100644 index.html diff --git a/index.html b/index.html deleted file mode 100644 index 5d972d1..0000000 --- a/index.html +++ /dev/null @@ -1,840 +0,0 @@ - - - - - - - Eye Of Horus Security - - - - - - - - - - - - - - - - - - -
-
-
-
-
نظام الأمان الرقمي -
-

- Eye of Horus - Security -

-

- التقدم في حدود السلامة الرقمية من خلال التعليم والمراقبة الفورية وتقنيات المسح المتقدمة. -

-
-
- - 2,000+ - مستخدم محمي -
-
- - 95% - معدل - الحماية -
-
- - 5 - دقائق - للاختبار -
-
-
-
- - - - - -
-
-

- مشاريعنا الرئيسية

- -
-

- في Eye of Horus Security، نؤمن بأن التعليم هو أفضل دفاع ضد التهديدات السيبرانية. نحن نوفر أدوات - وموارس شاملة لمساعدتك في البقاء آمناً في العالم الرقمي.

-
- -
- - -
-
- -
-
-
- -
-

- مكافح التصيد الاحتيالي -

-
- -

- التعليم هو أفضل دفاع. يوفر محاكينا الشامل سيناريوهات واقعية لمساعدة المستخدمين على - تحديد التهديدات - الرقمية قبل وقوعها. -

- -
- -
- -
-

- 20+ سيناريو -

-

- تهديدات واقعية متنوعة -

-
-
- -
- -
-

- إضافة متصفح -

-

- تنبيهات في الوقت الفعلي -

-
-
- -
- -
-

- نصائح تعليمية -

-

- إرشادات أمان الخبراء -

-
-
- -
- -
-

- مساعد حورس -

-

- دعم أمان الذكاء الاصطناعي 24/7 -

-
-
- -
- -
- -
-
-
-
-
- تدريب الدفاع الرقمي -
- -
- حماية مساحة عملك -
- -
-
-
-
- -
-
-
- - - -
-
- -
- -
- - - - http:exmaple.com -
- - -
-
- Phishing Template -
- -
- - - -
-
- - -
-
- -
-
-
- -
-
-
- - - -
- -
-
-
- - - -
- -
-
-
-
-
- -
-
- - -
-
- -
-
-
-
- -
-
-
- -
-
-
- -
-

- Horus Parent -

-
- -

- تعزيز سلامة الأطفال من خلال المراقبة المتصلة. يسمح لك حورس الوالد بتوجيه ومراقبة - النشاط الرقمي في - الوقت الفعلي وبناء الثقة دون قيود كاملة. -

- -
    -
  • - - - نظام المراقبة المتصل في الوقت الفعلي - -
  • -
  • - - - الكشف المبكر عن المخاطر والإرشادات السلوكية - -
  • -
  • - - - يعزز السلوك الرقمي المسؤول - -
  • -
- - - - اعرف أكثر - - - -
- -
-
- - -
-
- -
-
-
- -
-

- حورس QR -

-
- -

- حلل رموز QR على الفور لتحديد التصيد الاحتيالي والاحتيال أو النشاط الضار. -

- -
- -
-

- - - تحليل فوري - -

-

- تقييم المخاطر المفصل لكل رمز تم مسحه. -

-
- -
-

- - - منع الاحتيال - -

-

- يحجب عمليات إعادة التوجيه الضارة وسرقة البيانات المحتملة. -

-
- -
- - - - ابدأ الآن - - - -
-
-
-
-
-
- -
- -
-
- Scanning Secured -
HORUS-SYSTEM-V1.0.4
-
-
-
-
- -
-
- -
- - - - - - - -
- -
-
-

-

قيمنا - الأساسية

- - -
- - -
-
- -
-

التعليم

-

- نحرص على توعية الجميع بأساسيات الأمان الإلكتروني وحماية بياناتهم من محاولات - التصيد - والاختراق

-
- - -
-
- -
-

الحماية

-

- نقدم نصائح عملية لحماية حساباتك وبياناتك من الاختراق ومحاولات التصيد الإلكتروني -

-
- -
-
- -
-

الموثوقية

-

- نلتزم بتقديم محتوى وخدمات موثوقة وآمنة، مع التركيز على حماية بيانات المستخدمين - وبناء - ثقة دائمة معهم

-
- - -
-
- -
-

التوعية - المستمرة -

-

- نشارك المستخدمين باستمرار نصائح وأحدث طرق الحماية الرقمية، ونقدم لهم أمثلة عملية - وتحذيرات دورية تساعدهم على اكتشاف أي نشاط مشبوه قبل الوقوع في الخطر -

-
- - - -
-
-
-
-
- -
-
-

- ماذا تطلب منك مواقع التصيد -

- -
- -
-

- نعم، هذا هو الهدف الأكثر شيوعاً تحاول المواقع الاحتيالية سرقة اسم المستخدم وكلمة المرور - لحساباتك (مثل الفيسبوك، الجيميل، أو حسابك البنكي) عن طريق تزييف صفحة تسجيل دخول تبدو مطابقة - تماماً للموقع الأصلي -

-
-
- -
- -
-

- هذا خطير جداً. إذا حصل المخترق على كلمة المرور لمرة واحدة (OTP)، يمكنه تجاوز التحقق بخطوتين - (2FA) والحصول على السيطرة الكاملة على حسابك، حتى لو كان يعرف كلمة المرور الخاصة بك. -

-
-
- -
- -
-

- تقوم المواقع الاحتيالية أحياناً بالادعاء بأن هناك مشكلة دفع أو جائزة نقدية تتطلب منك إدخال - رقم البطاقة و تاريخ انتهاء الصلاحية و CVV. بمجرد إدخالها، يمكنهم سحب أموالك فوراً. -

-
-
- -
- -
-

- نعم، تُستخدم هذه المعلومات لـ اختراق الهوية. قد يطلب المخترقون منك رقم الهوية أو تاريخ - الميلاد أو العنوان للتمثيل بصفتك أو فتح حسابات احتيالية باسمك. -

-
-
- -
- -
-

- تعتمد مواقع التصيد على 'الضغط النفسي' قد تدعي أن حسابك 'سيتم تعليقه خلال 24 ساعة' أو 'تم - اختراقه' لإجبارك على التصرف دون تفكير. -

-
-
- -
-
- - - -
-
-

- - ملاحظات هامة للحماية -

- -
-
-
- -
-

تحقق من الروابط

-

- لا تضغط على الروابط المشبوهة في الرسائل الإلكترونية أو الرسائل النصية. تحقق من عنوان الرابط - قبل - النقر عليه.

-
- -
-
- -
-

تأكد من عنوان - الموقع

-

- تحقق من عنوان الموقع في شريط العناوين وتأكد من وجود رمز القفل (HTTPS) قبل إدخال أي بيانات - شخصية. -

-
- -
-
- -
-

المصادقة - الثنائية

-

- استخدم المصادقة الثنائية (2FA) في جميع حساباتك المهمة لإضافة طبقة حماية إضافية ضد المتسللين. -

-
- -
-
- -
-

كن حذراً من المعلومات الشخصية

-

لا - تشارك معلوماتك الشخصية أو المالية عبر البريد الإلكتروني أو المواقع غير الموثوقة.

-
- -
-
- -
-

تحديث البرامج

-

- حافظ - على تحديث نظام التشغيل والبرامج باستمرار للحصول على أحدث تصحيحات الأمان.

-
- -
-
- -
-

- الإبلاغ عن المحتوى المشبوه

-

- إذا واجهت محتوى مشبوهاً أو محاولة تصيد، قم بالإبلاغ عنها للجهات المختصة فوراً.

-
-
-
-
-
- - - - - - - - - \ No newline at end of file From f8da508392307d98e15a9ce641bcdf51ea9a9bf4 Mon Sep 17 00:00:00 2001 From: Eye of Horus Team <225619771+eyeofhorussecurity@users.noreply.github.com> Date: Fri, 9 Jan 2026 02:56:48 +0200 Subject: [PATCH 4/8] Add files via upload --- index.html | 840 +++++++++++++++++++++++++++++++++++ js/animate-on-scroll.js | 70 +++ js/assistant.js | 263 +++++++++++ js/blog.js | 121 +++++ js/main.js | 201 +++++++++ js/report.js | 85 ++++ js/script.js | 961 ++++++++++++++++++++++++++++++++++++++++ pages/assistant.html | 336 ++++++++++++++ pages/blog.html | 356 +++++++++++++++ pages/extension.html | 366 +++++++++++++++ pages/report.html | 389 ++++++++++++++++ pages/simulator.html | 353 +++++++++++++++ 12 files changed, 4341 insertions(+) create mode 100644 index.html create mode 100644 js/animate-on-scroll.js create mode 100644 js/assistant.js create mode 100644 js/blog.js create mode 100644 js/main.js create mode 100644 js/report.js create mode 100644 js/script.js create mode 100644 pages/assistant.html create mode 100644 pages/blog.html create mode 100644 pages/extension.html create mode 100644 pages/report.html create mode 100644 pages/simulator.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..5d972d1 --- /dev/null +++ b/index.html @@ -0,0 +1,840 @@ + + + + + + + Eye Of Horus Security + + + + + + + + + + + + + + + + + + +
+
+
+
+
نظام الأمان الرقمي +
+

+ Eye of Horus + Security +

+

+ التقدم في حدود السلامة الرقمية من خلال التعليم والمراقبة الفورية وتقنيات المسح المتقدمة. +

+
+
+ + 2,000+ + مستخدم محمي +
+
+ + 95% + معدل + الحماية +
+
+ + 5 + دقائق + للاختبار +
+
+
+
+ + + + + +
+
+

+ مشاريعنا الرئيسية

+ +
+

+ في Eye of Horus Security، نؤمن بأن التعليم هو أفضل دفاع ضد التهديدات السيبرانية. نحن نوفر أدوات + وموارس شاملة لمساعدتك في البقاء آمناً في العالم الرقمي.

+
+ +
+ + +
+
+ +
+
+
+ +
+

+ مكافح التصيد الاحتيالي +

+
+ +

+ التعليم هو أفضل دفاع. يوفر محاكينا الشامل سيناريوهات واقعية لمساعدة المستخدمين على + تحديد التهديدات + الرقمية قبل وقوعها. +

+ +
+ +
+ +
+

+ 20+ سيناريو +

+

+ تهديدات واقعية متنوعة +

+
+
+ +
+ +
+

+ إضافة متصفح +

+

+ تنبيهات في الوقت الفعلي +

+
+
+ +
+ +
+

+ نصائح تعليمية +

+

+ إرشادات أمان الخبراء +

+
+
+ +
+ +
+

+ مساعد حورس +

+

+ دعم أمان الذكاء الاصطناعي 24/7 +

+
+
+ +
+ +
+ +
+
+
+
+
+ تدريب الدفاع الرقمي +
+ +
+ حماية مساحة عملك +
+ +
+
+
+
+ +
+
+
+ + + +
+
+ +
+ +
+ + + + http:exmaple.com +
+ + +
+
+ Phishing Template +
+ +
+ + + +
+
+ + +
+
+ +
+
+
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+

+ Horus Parent +

+
+ +

+ تعزيز سلامة الأطفال من خلال المراقبة المتصلة. يسمح لك حورس الوالد بتوجيه ومراقبة + النشاط الرقمي في + الوقت الفعلي وبناء الثقة دون قيود كاملة. +

+ +
    +
  • + + + نظام المراقبة المتصل في الوقت الفعلي + +
  • +
  • + + + الكشف المبكر عن المخاطر والإرشادات السلوكية + +
  • +
  • + + + يعزز السلوك الرقمي المسؤول + +
  • +
+ + + + اعرف أكثر + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+

+ حورس QR +

+
+ +

+ حلل رموز QR على الفور لتحديد التصيد الاحتيالي والاحتيال أو النشاط الضار. +

+ +
+ +
+

+ + + تحليل فوري + +

+

+ تقييم المخاطر المفصل لكل رمز تم مسحه. +

+
+ +
+

+ + + منع الاحتيال + +

+

+ يحجب عمليات إعادة التوجيه الضارة وسرقة البيانات المحتملة. +

+
+ +
+ + + + ابدأ الآن + + + +
+
+
+
+
+
+ +
+ +
+
+ Scanning Secured +
HORUS-SYSTEM-V1.0.4
+
+
+
+
+ +
+
+ +
+ + + + + + + +
+ +
+
+

+

قيمنا + الأساسية

+ + +
+ + +
+
+ +
+

التعليم

+

+ نحرص على توعية الجميع بأساسيات الأمان الإلكتروني وحماية بياناتهم من محاولات + التصيد + والاختراق

+
+ + +
+
+ +
+

الحماية

+

+ نقدم نصائح عملية لحماية حساباتك وبياناتك من الاختراق ومحاولات التصيد الإلكتروني +

+
+ +
+
+ +
+

الموثوقية

+

+ نلتزم بتقديم محتوى وخدمات موثوقة وآمنة، مع التركيز على حماية بيانات المستخدمين + وبناء + ثقة دائمة معهم

+
+ + +
+
+ +
+

التوعية + المستمرة +

+

+ نشارك المستخدمين باستمرار نصائح وأحدث طرق الحماية الرقمية، ونقدم لهم أمثلة عملية + وتحذيرات دورية تساعدهم على اكتشاف أي نشاط مشبوه قبل الوقوع في الخطر +

+
+ + + +
+
+
+
+
+ +
+
+

+ ماذا تطلب منك مواقع التصيد +

+ +
+ +
+

+ نعم، هذا هو الهدف الأكثر شيوعاً تحاول المواقع الاحتيالية سرقة اسم المستخدم وكلمة المرور + لحساباتك (مثل الفيسبوك، الجيميل، أو حسابك البنكي) عن طريق تزييف صفحة تسجيل دخول تبدو مطابقة + تماماً للموقع الأصلي +

+
+
+ +
+ +
+

+ هذا خطير جداً. إذا حصل المخترق على كلمة المرور لمرة واحدة (OTP)، يمكنه تجاوز التحقق بخطوتين + (2FA) والحصول على السيطرة الكاملة على حسابك، حتى لو كان يعرف كلمة المرور الخاصة بك. +

+
+
+ +
+ +
+

+ تقوم المواقع الاحتيالية أحياناً بالادعاء بأن هناك مشكلة دفع أو جائزة نقدية تتطلب منك إدخال + رقم البطاقة و تاريخ انتهاء الصلاحية و CVV. بمجرد إدخالها، يمكنهم سحب أموالك فوراً. +

+
+
+ +
+ +
+

+ نعم، تُستخدم هذه المعلومات لـ اختراق الهوية. قد يطلب المخترقون منك رقم الهوية أو تاريخ + الميلاد أو العنوان للتمثيل بصفتك أو فتح حسابات احتيالية باسمك. +

+
+
+ +
+ +
+

+ تعتمد مواقع التصيد على 'الضغط النفسي' قد تدعي أن حسابك 'سيتم تعليقه خلال 24 ساعة' أو 'تم + اختراقه' لإجبارك على التصرف دون تفكير. +

+
+
+ +
+
+ + + +
+
+

+ + ملاحظات هامة للحماية +

+ +
+
+
+ +
+

تحقق من الروابط

+

+ لا تضغط على الروابط المشبوهة في الرسائل الإلكترونية أو الرسائل النصية. تحقق من عنوان الرابط + قبل + النقر عليه.

+
+ +
+
+ +
+

تأكد من عنوان + الموقع

+

+ تحقق من عنوان الموقع في شريط العناوين وتأكد من وجود رمز القفل (HTTPS) قبل إدخال أي بيانات + شخصية. +

+
+ +
+
+ +
+

المصادقة + الثنائية

+

+ استخدم المصادقة الثنائية (2FA) في جميع حساباتك المهمة لإضافة طبقة حماية إضافية ضد المتسللين. +

+
+ +
+
+ +
+

كن حذراً من المعلومات الشخصية

+

لا + تشارك معلوماتك الشخصية أو المالية عبر البريد الإلكتروني أو المواقع غير الموثوقة.

+
+ +
+
+ +
+

تحديث البرامج

+

+ حافظ + على تحديث نظام التشغيل والبرامج باستمرار للحصول على أحدث تصحيحات الأمان.

+
+ +
+
+ +
+

+ الإبلاغ عن المحتوى المشبوه

+

+ إذا واجهت محتوى مشبوهاً أو محاولة تصيد، قم بالإبلاغ عنها للجهات المختصة فوراً.

+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/js/animate-on-scroll.js b/js/animate-on-scroll.js new file mode 100644 index 0000000..8234be2 --- /dev/null +++ b/js/animate-on-scroll.js @@ -0,0 +1,70 @@ +// Animate on scroll using IntersectionObserver +// Adds 'in-view' class to elements with .animate-on-scroll when they intersect + +(function(){ + const defaultOptions = { + root: null, + rootMargin: '0px 0px -8% 0px', + threshold: 0.12 + }; + + function applyObserver(selector = '.animate-on-scroll'){ + const elements = document.querySelectorAll(selector); + if(!elements.length) return; + + const observer = new IntersectionObserver((entries, obs) => { + entries.forEach(entry => { + const el = entry.target; + if(entry.isIntersecting){ + // handle optional delay in ms from data-delay or CSS var --delay + const delayAttr = el.getAttribute('data-delay'); + if(delayAttr){ + el.style.setProperty('--delay', `${parseInt(delayAttr,10)}ms`); + // ensure stagger class is present so transition-delay applies + el.classList.add('stagger'); + } + + el.classList.add('in-view'); + + // If data-once is 'true' (default) unobserve after first reveal + const once = el.getAttribute('data-once'); + if(once === null || once === 'true'){ + obs.unobserve(el); + } + } else { + // If data-once is explicitly 'false', allow toggling + const once = el.getAttribute('data-once'); + if(once === 'false'){ + el.classList.remove('in-view'); + } + } + }); + }, defaultOptions); + + elements.forEach(el => observer.observe(el)); + } + + // Auto-init on DOMContentLoaded + if(document.readyState === 'loading'){ + document.addEventListener('DOMContentLoaded', () => applyObserver()); + } else { + applyObserver(); + } + + window.EoHAnimateOnScroll = { init: applyObserver }; +})(); +const cards = document.querySelectorAll('.tip-timeline'); + +const observer = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('show'); + observer.unobserve(entry.target); + } + }); +}, { + threshold: 0.2 +}); +cards.forEach(card => { + observer.observe(card); +}); diff --git a/js/assistant.js b/js/assistant.js new file mode 100644 index 0000000..4960e75 --- /dev/null +++ b/js/assistant.js @@ -0,0 +1,263 @@ +let selectedFiles = []; + +const messageInput = document.getElementById('messageInput'); +const sendBtn = document.getElementById('sendBtn'); +const chatMessages = document.getElementById('chatMessages'); +const fileInput = document.getElementById('fileInput'); +const filePreview = document.getElementById('filePreview'); +const typingIndicator = document.getElementById('typingIndicator'); +typingIndicator.style.display = 'none'; +messageInput.addEventListener('input', function () { + this.style.height = 'auto'; + this.style.height = Math.min(this.scrollHeight, 100) + 'px'; +}); + +messageInput.addEventListener('keypress', function (e) { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + sendMessage(); + } +}); + +sendBtn.addEventListener('click', sendMessage); + +fileInput.addEventListener('change', function (e) { + const files = Array.from(e.target.files); + files.forEach(file => { + if (selectedFiles.length < 5 && file.size <= 10 * 1024 * 1024) { + selectedFiles.push(file); + addFilePreview(file); + } + }); +}); + +function addFilePreview(file) { + const fileItem = document.createElement('div'); + fileItem.className = 'file-item'; + fileItem.innerHTML = ` + + ${file.name} + × + `; + filePreview.appendChild(fileItem); +} + +function removeFile(fileName) { + selectedFiles = selectedFiles.filter(file => file.name !== fileName); + updateFilePreview(); +} + +function updateFilePreview() { + filePreview.innerHTML = ''; + selectedFiles.forEach(file => addFilePreview(file)); +} + +function sendQuickMessage(message) { + messageInput.value = message; + sendMessage(); +} +function showTypingIndicator() { + typingIndicator.style.display = 'flex'; +} + +function hideTypingIndicator() { + typingIndicator.style.display = 'none'; +} + +function sendAnimation() { + const btn = document.querySelector('.send-btn'); + const icon = btn.querySelector('i'); + + btn.classList.add('fly'); + + // particles + for (let i = 0; i < 8; i++) { + const p = document.createElement('span'); + p.classList.add('particle'); + + p.style.setProperty('--x', `${Math.random() * 60 - 30}px`); + p.style.setProperty('--y', `${Math.random() * 60 - 30}px`); + + btn.appendChild(p); + + setTimeout(() => p.remove(), 600); + } + + setTimeout(() => { + btn.classList.remove('fly'); + icon.style.opacity = 1; + icon.style.transform = 'none'; + }, 900); +} +function sendMessage() { + const message = messageInput.value.trim(); + const contentType = document.getElementById('contentType').value; + + if (!message && selectedFiles.length === 0) return; + + addMessage('user', message, selectedFiles); + + messageInput.value = ''; + messageInput.style.height = 'auto'; + selectedFiles = []; + updateFilePreview(); + + showTypingIndicator(); + + setTimeout(() => { + hideTypingIndicator(); + const response = generateBotResponse(message, contentType); + addMessage('bot', response); + addToRecentAnalyses(contentType, response); + }, 2000); +} + +function addMessage(sender, text, files = []) { + const messageDiv = document.createElement('div'); + messageDiv.className = `message ${sender}`; + + let filesHtml = ''; + if (files.length > 0) { + filesHtml = `
+ ${files.map(file => ` ${file.name}`).join('')} +
`; + } + + messageDiv.innerHTML = ` +
+ +
+
+ ${text} + ${filesHtml} +
+ `; + + chatMessages.insertBefore(messageDiv, typingIndicator); + scrollToBottom(); +} + +function showTypingIndicator() { + typingIndicator.style.display = 'flex'; + scrollToBottom(); +} + +function hideTypingIndicator() { + typingIndicator.style.display = 'none'; +} + +function scrollToBottom() { + chatMessages.scrollTop = chatMessages.scrollHeight; +} + +function generateBotResponse(message, contentType) { + const phishingIndicators = [ + 'urgent', 'عاجل', 'فوري', 'click here', 'اضغط هنا', 'limited time', 'وقت محدود', + 'verify account', 'تأكيد الحساب', 'suspended', 'معلق', 'winner', 'فائز', + 'congratulations', 'مبروك', 'free money', 'فلوس مجانية', 'bitcoin', 'بيتكوين' + ]; + + const suspiciousDomains = [ + '.tk', '.ml', '.ga', '.cf', 'bit.ly', 'tinyurl', 'ngrok.com' + ]; + + let indicatorCount = 0; + + phishingIndicators.forEach(indicator => { + if (message.toLowerCase().includes(indicator.toLowerCase())) { + indicatorCount++; + } + }); + + suspiciousDomains.forEach(domain => { + if (message.toLowerCase().includes(domain)) { + indicatorCount += 2; + } + }); + + let response = ''; + + if (message.includes('نصائح') || message.includes('حماية')) { + response = `إليك أهم النصائح للحماية من التصيد الإلكتروني: + +🔒 تحقق دائماً من عنوان URL قبل إدخال معلوماتك +📧 لا تثق في الرسائل التي تطلب معلومات حساسة +🔍 ابحث عن الأخطاء الإملائية والنحوية +🛡️ استخدم المصادقة الثنائية عند الإمكان +📱 حدث برامجك ومتصفحك باستمرار`; + } else if (indicatorCount >= 4) { + response = `⚠️ تحذير: مستوى الخطر عالي! + +تم اكتشاف عدة علامات تحذيرية في المحتوى الذي أرسلته. هذا المحتوى يحتوي على مؤشرات قوية لكونه محاولة تصيد إلكتروني. + +التوصيات: +❌ لا تضغط على أي روابط +❌ لا تدخل أي معلومات شخصية +🗑️ احذف هذه الرسالة فوراً +📞 أبلغ عن هذا المحتوى للجهات المختصة`; + } else if (indicatorCount >= 2) { + response = `⚠️ تحذير: مستوى الخطر متوسط + +تم اكتشاف بعض العلامات المشبوهة في المحتوى. يُنصح بالحذر الشديد. + +التوصيات: +🔍 تحقق من مصدر الرسالة بعناية +❌ لا تدخل معلومات حساسة +📞 تواصل مع الجهة المرسلة مباشرة للتأكد +🔄 استخدم طرق تواصل بديلة للتحقق`; + } else { + response = `✅ مستوى الخطر منخفض + +لم يتم اكتشاف علامات تحذيرية واضحة، لكن يُنصح دائماً بالحذر. + +التوصيات: +🔍 تحقق من صحة المعلومات من مصادر موثوقة +⚠️ كن حذراً عند إدخال معلومات شخصية +🔒 تأكد من أمان الموقع قبل التفاعل معه`; + } + + return response; +} + +function addToRecentAnalyses(type, analysis) { + const recentDiv = document.getElementById('recentAnalyses'); + const now = new Date().toLocaleString('ar-EG'); + + let riskLevel = 'منخفض'; + let riskColor = 'success'; + + if (analysis.includes('عالي')) { + riskLevel = 'عالي'; + riskColor = 'danger'; + } else if (analysis.includes('متوسط')) { + riskLevel = 'متوسط'; + riskColor = 'warning'; + } + + const analysisItem = ` +
+ ${riskLevel} + ${type} - ${now} +
+ `; + + // Insert at top + if (recentDiv.innerHTML.includes('لا توجد تحليلات سابقة')) { + recentDiv.innerHTML = analysisItem; + } else { + recentDiv.innerHTML = analysisItem + recentDiv.innerHTML; + } + + // Keep only last 3 + const items = recentDiv.querySelectorAll('.recent-item'); + if (items.length > 3) { + for (let i = 3; i < items.length; i++) { + items[i].remove(); + } + } +} + + +document.addEventListener('DOMContentLoaded', function () { + scrollToBottom(); +}); \ No newline at end of file diff --git a/js/blog.js b/js/blog.js new file mode 100644 index 0000000..f48f59f --- /dev/null +++ b/js/blog.js @@ -0,0 +1,121 @@ +document.getElementById('newPostForm').addEventListener('submit', function (e) { + e.preventDefault(); + + const title = document.getElementById('postTitle').value; + const category = document.getElementById('postCategory').value; + const content = document.getElementById('postContent').value; + const url = document.getElementById('postUrl').value; + + if (title && category && content) { + addNewPost(title, category, content, url); + this.reset(); + alert('تم نشر التحذير بنجاح! شكراً لك على مساعدة الآخرين.'); + } +}); + +function addNewPost(title, category, content, url) { + const categoryNames = { + 'email': 'رسائل إيميل مزيفة', + 'sms': 'رسائل نصية احتيالية', + 'social': 'منشورات مواقع التواصل', + 'website': 'مواقع مزيفة', + 'app': 'تطبيقات مشبوهة', + 'other': 'أخرى' + }; + + const categoryColors = { + 'email': 'danger', + 'sms': 'warning', + 'social': 'info', + 'website': 'primary', + 'app': 'success', + 'other': 'secondary' + }; + + const postHtml = ` +
+
+
+
+
+ +
+
+
مستخدم جديد
+ الآن +
+
+ ${categoryNames[category]} +
+ +
${title}
+

${content}

+ + ${url ? ` +
+ + الرابط المشبوه: ${url.replace('https://', '').replace('http://', '')} +
+ ` : ''} + +
+
+ + +
+ + 1 مشاهدة + +
+
+
+ `; + + const postsContainer = document.getElementById('postsContainer'); + postsContainer.insertAdjacentHTML('afterbegin', postHtml); +} + +document.querySelectorAll('[data-filter]').forEach(button => { + button.addEventListener('click', function () { + const filter = this.getAttribute('data-filter'); + + document.querySelectorAll('[data-filter]').forEach(btn => btn.classList.remove('active')); + this.classList.add('active'); + + const posts = document.querySelectorAll('.post-item'); + let visibleCount = 0; + + posts.forEach(post => { + if (filter === 'all' || post.getAttribute('data-category') === filter) { + post.style.display = 'block'; + visibleCount++; + } else { + post.style.display = 'none'; + } + }); + + const noPostsMessage = document.getElementById('noPostsMessage'); + if (visibleCount === 0) { + noPostsMessage.style.display = 'block'; + } else { + noPostsMessage.style.display = 'none'; + } + }); +}); + +document.addEventListener('click', function (e) { + if (e.target.closest('.btn-outline-success')) { + const button = e.target.closest('.btn-outline-success'); + const currentText = button.innerHTML; + const currentCount = parseInt(currentText.match(/\d+/)[0]); + const newCount = currentCount + 1; + + button.innerHTML = currentText.replace(/\d+/, newCount); + button.classList.remove('btn-outline-success'); + button.classList.add('btn-success'); + } +}); diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..5e67406 --- /dev/null +++ b/js/main.js @@ -0,0 +1,201 @@ +const quizItems = [ + { + id: "q1", + title: "بنك المثال - صفحة تسجيل الدخول", + url: "https://secure-example-bank.com/login", + language: "ar", + imageText: "صفحة تسجيل دخول بنكي - شعار متكرر\n(معاينة تعليمية)", + isPhishing: true, + explanation: "علامات تحذير: النطاق لا يتطابق مع نطاق انستجرام الرسمي، وجود ضغط لإدخال معلومات حساسة فورًا. تحقق دائمًا من النطاق الرسمي وتواصل مع الدعم إن شككت." + }, + { + id: "q2", + title: "متجر إلكتروني شهير - صفحة رئيسية", + url: "https://www.shop-example.com", + language: "en", + imageText: "صفحة متجر - عروض وتخفيضات\n(معاينة تعليمية)", + isPhishing: false, + explanation: "هذه صفحة تبدو حقيقية: نطاق معروف، واجهة متوافقة، ولا تطلب معلومات حساسة مباشرة." + }, + { + id: "q3", + title: "خدمات البريد - رسالة تفعيل حساب", + url: "http://mail.example-verify.com/activate", + language: "ar", + imageText: "صفحة تفعيل حساب بريدية\n(معاينة تعليمية)", + isPhishing: true, + explanation: "يستخدم HTTP بدلاً من HTTPS، والنطاق لا يبدو رسميًا. الأخطاء الإملائية شائعة في صفحات الاحتيال." + }, + { + id: "q4", + title: "موقع حكومي - بوابة خدمات المواطنين", + url: "https://gov.example.gov.eg", + language: "ar", + imageText: "بوابة حكومية - خدمات المواطنين\n(معاينة تعليمية)", + isPhishing: false, + explanation: "نطاق حكومي واضح ووجود تشفير https. مع ذلك، راجع دومًا الشهادة الرقمية إذا لزم." + }, + { + id: "q5", + title: "عرض وظيفة عاجل - استمارة بيانات", + url: "https://apply-now-jobs.example", + language: "en", + imageText: "نموذج طلب وظيفة - يطلب معلومات بنكية\n(معاينة تعليمية)", + isPhishing: true, + explanation: "طلب بيانات بنكية مبكرًا هو إشارة تحذيرية. قابل للشبهة إن طُلب رقم حساب أو تفاصيل بطاقة قبل مقابلة رسمية." + } + ]; + + // =======State======= + let currentIndex = 0; + let score = 0; + let answered = new Array(quizItems.length).fill(false); + let corrects = new Array(quizItems.length).fill(false); + + // =======DOM elements======= + const btnStart = document.getElementById('btnStart'); + const btnShowRules = document.getElementById('btnShowRules'); + const rulesDiv = document.getElementById('rules'); + + const qCard = document.getElementById('question-card'); + const intro = document.getElementById('intro'); + const qIndexText = document.getElementById('qIndex'); + const scoreBadge = document.getElementById('scoreBadge'); + const scoreShort = document.getElementById('scoreShort'); + const qCount = document.getElementById('qCount'); + + const screenshot = document.getElementById('screenshot'); + const screenshotText = document.getElementById('screenshotText'); + const siteTitle = document.getElementById('siteTitle'); + const urlText = document.getElementById('urlText'); + const btnPhish = document.getElementById('btnPhish'); + const btnLegit = document.getElementById('btnLegit'); + const btnExplain = document.getElementById('btnExplain'); + const feedback = document.getElementById('feedback'); + const noteArea = document.getElementById('noteArea'); + + const btnPrev = document.getElementById('btnPrev'); + const btnNext = document.getElementById('btnNext'); + const btnSkip = document.getElementById('btnSkip'); + const btnRestart = document.getElementById('btnRestart'); + + const finalCard = document.getElementById('final-card'); + const finalScore = document.getElementById('finalScore'); + const finalText = document.getElementById('finalText'); + + // =======Functions======= + function updateOverview() { + qCount.innerText = (currentIndex+1) + " / " + quizItems.length; + scoreShort.innerText = score; + scoreBadge.innerText = "النتيجة: " + score; + } + + function showQuestion(index) { + if (index < 0) index = 0; + if (index >= quizItems.length) index = quizItems.length - 1; + currentIndex = index; + const item = quizItems[index]; + intro.style.display = 'none'; + finalCard.style.display = 'none'; + qCard.style.display = 'block'; + + const iframeSrc = `sites/${item.id}/${item.id}.html`; + let iframe = screenshot.querySelector('iframe.quiz-site-iframe'); + if (!iframe) { + iframe = document.createElement('iframe'); + iframe.className = 'quiz-site-iframe'; + iframe.style.width = '100%'; + iframe.style.height = '100%'; + iframe.style.border = '0'; + iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin'); + screenshot.insertBefore(iframe, screenshot.firstChild); + } + iframe.src = iframeSrc; + screenshotText.innerText = item.imageText; + + siteTitle.innerText = item.title; + urlText.innerText = item.url; + feedback.style.display = 'none'; + noteArea.innerText = ""; + updateOverview(); + btnPrev.disabled = (index === 0); + btnNext.disabled = (index === quizItems.length - 1); + } + + function showFinal() { + qCard.style.display = 'none'; + finalCard.style.display = 'block'; + finalScore.innerText = `نتيجتك: ${score} من ${quizItems.length}`; + const percent = Math.round((score / quizItems.length) * 100); + finalText.innerText = (percent >= 70) ? "ممتاز — لديك فهم جيد لعلامات التصيّد." : (percent >= 40 ? "مقبول — حاول المراجعة أكثر." : "بحاجة لتحسين — راجع إشارات التحذير بعناية."); + updateOverview(); + } + + function giveFeedback(isCorrect, explanation) { + feedback.style.display = 'block'; + feedback.className = isCorrect ? 'alert alert-success' : 'alert alert-danger'; + feedback.innerHTML = (isCorrect ? 'إجابة صحيحة — ' : 'إجابة خاطئة — ') + `
${explanation}
`; + noteArea.innerText = explanation; + } + + function answer(selectedPhishing) { + const item = quizItems[currentIndex]; + if (answered[currentIndex]) { + return; + } + answered[currentIndex] = true; + const correct = (selectedPhishing === item.isPhishing); + corrects[currentIndex] = correct; + if (correct) { score += 1; } + giveFeedback(correct, item.explanation); + updateOverview(); + + setTimeout(() => { + if (currentIndex < quizItems.length - 1) { + showQuestion(currentIndex + 1); + } else { + showFinal(); + } + }, 1200); + } + + btnStart.addEventListener('click', () => { + currentIndex = 0; score = 0; + answered.fill(false); corrects.fill(false); + updateOverview(); + showQuestion(0); + }); + + btnShowRules.addEventListener('click', () => { + rulesDiv.style.display = (rulesDiv.style.display === 'none') ? 'block' : 'none'; + }); + + btnPhish.addEventListener('click', () => answer(true)); + btnLegit.addEventListener('click', () => answer(false)); + + btnExplain.addEventListener('click', () => { + const item = quizItems[currentIndex]; + alert("شرح:\\n\\n" + item.explanation); + }); + + btnPrev.addEventListener('click', () => { + if (currentIndex > 0) showQuestion(currentIndex - 1); + }); + btnNext.addEventListener('click', () => { + if (currentIndex < quizItems.length - 1) showQuestion(currentIndex + 1); + else showFinal(); + }); + btnSkip.addEventListener('click', () => { + answered[currentIndex] = true; + showQuestion(Math.min(currentIndex + 1, quizItems.length - 1)); + }); + + btnRestart.addEventListener('click', () => { + currentIndex = 0; score = 0; answered.fill(false); corrects.fill(false); + updateOverview(); + intro.style.display = 'block'; + finalCard.style.display = 'none'; + qCard.style.display = 'none'; + }); + + updateOverview(); \ No newline at end of file diff --git a/js/report.js b/js/report.js new file mode 100644 index 0000000..1ebfe17 --- /dev/null +++ b/js/report.js @@ -0,0 +1,85 @@ +document.addEventListener('DOMContentLoaded', function () { + const form = document.getElementById('reportForm'); + const maxFiles = 5; + const maxSize = 10 * 1024 * 1024; // 10 MB + + if (form) { + form.addEventListener('submit', function (e) { + e.preventDefault(); + + const threatTypeElem = document.getElementById('threatType'); + const descriptionElem = document.getElementById('reportDescription'); + const consentElem = document.getElementById('consentCheck'); + const reportSuccessElem = document.getElementById('reportSuccess'); + + const threatType = threatTypeElem ? threatTypeElem.value.trim() : ''; + const description = descriptionElem ? descriptionElem.value.trim() : ''; + const consent = consentElem ? consentElem.checked : false; + + if (threatType && description && consent) { + if (reportSuccessElem) reportSuccessElem.style.display = 'block'; + + this.reset(); + + if (reportSuccessElem) { + reportSuccessElem.scrollIntoView({ + behavior: 'smooth', + block: 'center' + }); + + setTimeout(() => { + reportSuccessElem.style.display = 'none'; + }, 10000); + } + } else { + // Provide simple feedback if required fields are missing + if (!threatType || !description) { + alert('يرجى ملء نوع التهديد والوصف قبل الإرسال.'); + } else if (!consentElem || !consent) { + alert('يرجى الموافقة على الشروط للمتابعة.'); + } + } + }); + } + + const evidenceInput = document.getElementById('evidenceFiles'); + if (evidenceInput) { + evidenceInput.addEventListener('change', function (e) { + const files = e.target.files || []; + + if (files.length > maxFiles) { + alert(`يمكنك إرفاق حتى ${maxFiles} ملفات فقط`); + this.value = ''; + return; + } + + for (let file of files) { + if (file.size > maxSize) { + alert(`حجم الملف ${file.name} كبير جداً. الحد الأقصى 10 ميجا`); + this.value = ''; + return; + } + } + }); + } + + const threatTypeElem = document.getElementById('threatType'); + if (threatTypeElem) { + threatTypeElem.addEventListener('change', function () { + const impactLevel = document.getElementById('impactLevel'); + const value = this.value; + + if (!impactLevel) return; + + if (value === 'phishing-website' || value === 'fake-app') { + impactLevel.value = 'high'; + } else if (value === 'fake-email' || value === 'sms-scam') { + impactLevel.value = 'medium'; + } else if (value === 'social-scam') { + impactLevel.value = 'low'; + } else { + impactLevel.value = ''; + } + }); + } +}); \ No newline at end of file diff --git a/js/script.js b/js/script.js new file mode 100644 index 0000000..9afbbf6 --- /dev/null +++ b/js/script.js @@ -0,0 +1,961 @@ +// ... existing code for phishing templates ... + +const phishingTemplates = { + "google-login": { + title: "جوجل - صفحة تسجيل الدخول", + url: "https://g00gle.com/login", + scenario: "دخلت على جوجل عشان تسجل دخول لحسابك، لقيت الصفحة دي قدامك وطالبة منك الإيميل والباسورد", + isPhishing: true, + explanation: + "علامات تحذير: النطاق لا يتطابق مع نطاق جوجل الرسمي (google.com)، وجود ضغط لإدخال معلومات حساسة فورًا. تحقق دائمًا من النطاق الرسمي.", + isSecure: false, + }, + "instagram-home": { + title: "انستجرام - الصفحة الرئيسية", + url: "https://www.home-instagram.com", + scenario: "صاحبك بعتلك لينك قالك عليه إنه انستجرام جديد، لما دخلت لقيت الصفحة دي", + isPhishing: true, + explanation: "هذه صفحة مزيفة: النطاق خاطئ (instagram.com هو الصحيح)، تطلب معلومات حساسة مباشرة.", + isSecure: false, + }, + "linkedin-login": { + title: "لينكد إن - صفحة تسجيل الدخول", + url: "https://www.linkedin.com/login", + scenario: "عايز تدخل على حسابك في لينكد إن عشان تشوف الرسايل، دخلت على الموقع ولقيت الصفحة دي", + isPhishing: false, + explanation: "هذا موقع LinkedIn الحقيقي. النطاق صحيح (linkedin.com) ووجود تشفير HTTPS.", + isSecure: true, + }, + "adobe-login": { + title: "أدوبي - صفحة تسجيل الدخول", + url: "http://photoshop.com", + scenario: "عايز تحمل فوتوشوب، دورت على النت ولقيت الموقع ده، دخلت عليه ولقيت صفحة تسجيل دخول", + isPhishing: true, + explanation: "يستخدم HTTP بدلاً من HTTPS، والنطاق لا يبدو رسميًا. Adobe الحقيقية تستخدم adobe.com.", + isSecure: false, + }, + "pinterest-login": { + title: "بنترست - صفحة تسجيل الدخول", + url: "http://ngrok.com/3afw32a3yay3awy33/3dsf3/index.php", + scenario: "جالك إيميل من بنترست بيقولك إن حسابك هيتقفل، واللينك ده هيخليك تأكد بياناتك", + isPhishing: true, + explanation: + "الرابط تصيّد لأنه لا يستخدم نطاق Pinterest الرسمي (pinterest.com) بل نطاق ngrok.com، ويفتقد بروتوكول الحماية HTTPS.", + isSecure: false, + }, + "facebook-contest-post": { + title: "فيسبوك - منشور مسابقة", + url: "https://facebook.com/posts/123456", + scenario: "شوفت منشور على فيسبوك بيقول مسابقة كبيرة وجوايز، والمنشور ده قدامك", + isPhishing: true, + explanation: + "ده منشور تصيد! المسابقات اللي بتطلب معلومات شخصية أو فلوس عشان تشارك فيها غالباً بتكون نصب. الصفحات الحقيقية مش بتطلب كده.", + isSecure: true, + }, + "banque-misr-sms": { + title: "رسالة نصية - بنك مصر", + url: "https://messages.google.com", + scenario: "جالك SMS على موبايلك من بنك مصر بيقولك إن فيه مشكلة في حسابك ولازم تأكد بياناتك", + isPhishing: true, + explanation: + "الرسالة دي مزيفة! البنوك الحقيقية مش بتبعت رسايل تطلب فيها رقم البطاقة أو الرقم السري. لو شاكك، اتصل بالبنك مباشرة.", + isSecure: true, + }, + "uber-egypt": { + title: "أوبر مصر - الصفحة الرئيسية", + url: "https://www.uber.com/eg/", + scenario: "عايز تطلب عربية أوبر، دخلت على الموقع من جوجل ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع أوبر الحقيقي في مصر. النطاق صحيح (uber.com) وفيه HTTPS. التطبيق آمن للاستخدام.", + isSecure: true, + }, + "vodafone-offer": { + title: "فودافون مصر - صفحة عرض خاص", + url: "http://vodafone-egypt-offer.net/win", + scenario: + "جالك SMS بيقولك: 'كسبت ٥٠٠ جنيه من فودافون، دوس هنا تستلمهم'، واللينك بيفتح صفحة تسجيل بيانات شبه موقع فودافون", + isPhishing: true, + explanation: + "العرض ده مزيف! فودافون الحقيقية نطاقها vodafone.com.eg مش .net. العروض الحقيقية مش بتطلب معلومات بنكية.", + isSecure: false, + }, + "amazon-egypt-email": { + title: "رسالة إيميل - أمازون مصر", + url: "https://mail.google.com", + scenario: "جالك إيميل من أمازون مصر بيقولك إن طلبك اتألغى ولازم تأكد بياناتك، فتحت الإيميل ولقيت المحتوى ده", + isPhishing: true, + explanation: + "الإيميل ده مزيف! أمازون في مصر بتشتغل تحت اسم أمازون الإمارات، وأمازون الحقيقية بتبعت من amazon.com مش amazon-egypt.com.", + isSecure: true, + }, + "souq-home": { + title: "سوق.كوم - الصفحة الرئيسية", + url: "https://www.souq.com", + scenario: "عايز تشتري حاجة أونلاين، فاكر موقع سوق.كوم القديم، دخلت عليه ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع سوق.كوم الحقيقي (اللي بقى أمازون الإمارات دلوقتي). النطاق صحيح وآمن للتسوق.", + isSecure: true, + }, + "whatsapp-gold-message": { + title: "رسالة واتساب - واتساب جولد", + url: "https://web.whatsapp.com", + scenario: + "جالك رسالة على الواتساب من صاحبك بيقولك على تطبيق واتساب جولد الجديد، ولما دخلت على اللينك شوفت الرسالة دي", + isPhishing: true, + explanation: "الرسالة دي نصب! مفيش حاجة اسمها 'واتساب جولد' أو عروض مجانية من واتساب. متضغطش على أي لينك مشبوه.", + isSecure: true, + }, + "nbe-update": { + title: "البنك الأهلي المصري - صفحة تحديث البيانات", + url: "http://nbe-egypt-update.com/verify", + scenario: "جالك إيميل من البنك الأهلي بيقولك لازم تحدث بياناتك، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "ده موقع مزيف! البنك الأهلي الحقيقي موقعه nbe.com.eg مش nbe-egypt-update.com. البنوك مش بتطلب تحديث البيانات عن طريق لينكات في الإيميل.", + isSecure: false, + }, + "careem-home": { + title: "كريم مصر - الصفحة الرئيسية", + url: "https://www.careem.com/egypt", + scenario: "عايز تطلب عربية كريم، دخلت على الموقع من جوجل ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع كريم الحقيقي في مصر. النطاق صحيح (careem.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "telegram-gold": { + title: "تليجرام جولد - صفحة التحميل", + url: "https://telegram-gold-egypt.net/download", + scenario: "صاحبك قالك على تطبيق تليجرام جولد الجديد اللي فيه مميزات أكتر، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "ده موقع نصب! مفيش حاجة اسمها 'تليجرام جولد'. تليجرام الحقيقي موقعه telegram.org. أي موقع تاني بيدعي إنه تليجرام يبقى مشبوه.", + isSecure: true, + }, + "cib-alert": { + title: "البنك التجاري الدولي - تنبيه أمني", + url: "http://cib-bank-egypt.net/alert", + scenario: "جالك إيميل من البنك التجاري الدولي بيقولك فيه نشاط مشبوه على حسابك، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "ده موقع مزيف! البنك التجاري الدولي الحقيقي موقعه cibeg.com. البنوك مش بتبعت تنبيهات أمنية تطلب بيانات حساسة عبر الإيميل.", + isSecure: false, + }, + "orange-bill": { + title: "أورانج مصر - فاتورة الشهر", + url: "http://orange-egypt-bill.com/pay", + scenario: "جالك إيميل من أورانج بفاتورة الشهر وطالب منك تدفع أونلاين، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: "الموقع ده مزيف! أورانج الحقيقية موقعها orange.eg. الشركات الحقيقية مش بتبعت فواتير من نطاقات مشبوهة.", + isSecure: false, + }, + "etisalat-home": { + title: "اتصالات مصر - الصفحة الرئيسية", + url: "https://www.etisalat.eg", + scenario: "عايز تشوف فاتورة التليفون، دخلت على موقع اتصالات ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع اتصالات مصر الحقيقي. النطاق صحيح (etisalat.eg) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "jumia-sale": { + title: "جوميا - عرض خاص", + url: "http://jumia-egypt-sale.net/mega-sale", + scenario: "شوفت إعلان على فيسبوك لعرض كبير في جوميا، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "العرض ده مزيف! جوميا الحقيقية موقعها jumia.com.eg. العروض الحقيقية مش بتطلب دفع مقدم أو معلومات بنكية قبل الشراء.", + isSecure: false, + }, + "paypal-security": { + title: "باي بال - تحذير أمني", + url: "http://paypal-security-egypt.com/verify", + scenario: "جالك إيميل من PayPal بيقولك إن حسابك في خطر ولازم تأكد بياناتك، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "ده موقع مزيف! PayPal الحقيقي موقعه paypal.com. PayPal مش بيطلب تأكيد الحساب عن طريق لينكات في الإيميل.", + isSecure: false, + }, + "microsoft-office": { + title: "مايكروسوفت أوفيس - صفحة التفعيل", + url: "http://office-activation-egypt.net/activate", + scenario: "اشتريت أوفيس جديد وعايز تفعله، دورت على النت على طريقة التفعيل ولقيت الموقع ده", + isPhishing: true, + explanation: + "الموقع ده مزيف! Microsoft الحقيقية موقعها microsoft.com. تفعيل Office بيتم من خلال الموقع الرسمي أو التطبيق نفسه.", + isSecure: false, + }, + "netflix-payment": { + title: "نتفليكس - مشكلة في الدفع", + url: "https://mail.yahoo.com", + scenario: "جالك إيميل من نتفليكس بيقولك إن فيه مشكلة في الدفع وحسابك هيتقفل، فتحت الإيميل ولقيت المحتوى ده", + isPhishing: true, + explanation: + "الإيميل ده مزيف! Netflix الحقيقي موقعه netflix.com. Netflix مش بيطلب تحديث بيانات الدفع عن طريق لينكات في الإيميل.", + isSecure: true, + }, + "spotify-home": { + title: "سبوتيفاي - الصفحة الرئيسية", + url: "https://www.spotify.com", + scenario: "عايز تسمع موسيقى، دخلت على سبوتيفاي ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع Spotify الحقيقي. النطاق صحيح (spotify.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "apple-icloud": { + title: "آبل - تحذير iCloud", + url: "http://icloud-security-alert.net/verify", + scenario: "جالك إيميل من آبل بيقولك إن حد حاول يدخل على حسابك، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "ده موقع مزيف! Apple الحقيقية موقعها apple.com أو icloud.com. Apple مش بتبعت تحذيرات أمنية تطلب كلمة المرور عبر الإيميل.", + isSecure: false, + }, + "amazon-home": { + title: "أمازون - الصفحة الرئيسية", + url: "https://www.amazon.com", + scenario: "عايز تشتري حاجة من أمازون، دخلت على الموقع ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع Amazon الحقيقي. النطاق صحيح (amazon.com) وفيه HTTPS. الموقع آمن للتسوق.", + isSecure: true, + }, + "ebay-seller": { + title: "إي باي - صفحة بائع", + url: "http://ebay-egypt-deals.net/seller", + scenario: "لقيت عرض حلو على إي باي، البائع بعتلك لينك خاص عشان تشتري منه بسعر أقل، دخلت ولقيت الصفحة دي", + isPhishing: true, + explanation: + "الموقع ده مزيف! eBay الحقيقي موقعه ebay.com. البائعين الحقيقيين على eBay مش بيطلبوا دفع خارج المنصة الرسمية.", + isSecure: false, + }, + "gmail-storage": { + title: "جيميل - تحذير امتلاء المساحة", + url: "http://gmail-storage-full.net/upgrade", + scenario: "جالك إيميل من جوجل بيقولك إن مساحة الجيميل بتاعك خلصت ولازم تزودها، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: "ده موقع مزيف! Gmail الحقيقي موقعه gmail.com. Google مش بتطلب ترقية المساحة عن طريق لينكات مشبوهة.", + isSecure: false, + }, + "yahoo-breach": { + title: "ياهو - تحذير اختراق", + url: "https://mail.yahoo.com", + scenario: "جالك إيميل من ياهو بيقولك إن حسابك اتهكر ولازم تغير الباسورد، فتحت الإيميل ولقيت المحتوى ده", + isPhishing: true, + explanation: + "الإيميل ده مزيف! Yahoo الحقيقي موقعه yahoo.com. Yahoo مش بتطلب تغيير كلمة المرور عن طريق لينكات في الإيميل.", + isSecure: true, + }, + "twitter-verification": { + title: "تويتر - صفحة التوثيق", + url: "http://twitter-verification-egypt.com/verify", + scenario: "شوفت إعلان بيقولك إزاي تاخد علامة التوثيق الزرقا في تويتر، دخلت على اللينك ولقيت الصفحة دي", + isPhishing: true, + explanation: + "الموقع ده مزيف! Twitter (X) الحقيقي موقعه x.com. التوثيق بيتم من خلال الموقع الرسمي مش من لينكات خارجية.", + isSecure: false, + }, + "tiktok-monetization": { + title: "تيك توك - صفحة الربح", + url: "http://tiktok-egypt-money.net/earn", + scenario: "شوفت فيديو بيقولك إزاي تكسب فلوس من تيك توك، دخلت على اللينك اللي في الوصف ولقيت الصفحة دي", + isPhishing: true, + explanation: + "العرض ده مزيف! TikTok الحقيقي موقعه tiktok.com. برامج الربح الحقيقية بتتم من خلال التطبيق الرسمي مش مواقع خارجية.", + isSecure: false, + }, + "youtube-monetization": { + title: "يوتيوب - صفحة تفعيل الربح", + url: "http://youtube-egypt-partner.com/monetize", + scenario: "عايز تفعل الربح من قناتك على يوتيوب، دورت على النت ولقيت الموقع ده بيقولك هيساعدك", + isPhishing: true, + explanation: "الموقع ده مزيف! YouTube الحقيقي موقعه youtube.com. تفعيل الربح بيتم من خلال YouTube Studio الرسمي.", + isSecure: false, + }, + "google-homepage": { + title: "جوجل - الصفحة الرئيسية", + url: "https://www.google.com", + scenario: "فتحت المتصفح عشان تدور على حاجة، دخلت على جوجل ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع Google الحقيقي. النطاق صحيح (google.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "facebook-homepage": { + title: "فيسبوك - الصفحة الرئيسية", + url: "https://www.facebook.com", + scenario: "عايز تشوف آخر الأخبار من أصحابك، دخلت على فيسبوك ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع Facebook الحقيقي. النطاق صحيح (facebook.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "instagram-homepage": { + title: "انستجرام - الصفحة الرئيسية", + url: "https://www.instagram.com", + scenario: "عايز تشوف الصور الجديدة، دخلت على انستجرام ولقيت الصفحة دي", + isPhishing: false, + explanation: "ده موقع Instagram الحقيقي. النطاق صحيح (instagram.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, + "whatsapp-home": { + title: "واتساب - الصفحة الرئيسية", + url: "https://www.whatsapp.com", + scenario: "عايز تحمل واتساب على الكمبيوتر، دخلت على الموقع الرسمي ولقيت الص��حة دي", + isPhishing: false, + explanation: "ده موقع WhatsApp الحقيقي. النطاق صحيح (whatsapp.com) وفيه HTTPS. الموقع آمن للاستخدام.", + isSecure: true, + }, +} + +let currentLanguage = localStorage.getItem("language") || "ar" +let currentTheme = localStorage.getItem("theme") || "light" + +// Initialize theme on load +document.addEventListener("DOMContentLoaded", () => { + initializeTheme() + initializeLanguage() + setupThemeToggle() + setupLanguageToggle() +}) + +function initializeTheme() { + if (currentTheme === "dark") { + document.body.classList.add("dark-mode") + document.getElementById("themeToggle")?.setAttribute("checked", "checked") + document.getElementById("themeToggleMobile")?.setAttribute("checked", "checked") + } +} + +function initializeLanguage() { + if (currentLanguage === "en") { + switchToEnglish() + } +} + +function setupThemeToggle() { + const themeToggle = document.getElementById("themeToggle") + const themeToggleMobile = document.getElementById("themeToggleMobile") + + themeToggle?.addEventListener("change", () => { + toggleTheme() + }) + + themeToggleMobile?.addEventListener("change", () => { + toggleTheme() + }) +} + +function setupLanguageToggle() { + const langButtons = document.querySelectorAll(".lang-btn") + + langButtons.forEach((btn) => { + btn.addEventListener("click", (e) => { + e.preventDefault() + const lang = btn.getAttribute("data-lang") + if (lang === "en") { + switchToEnglish() + } else { + switchToArabic() + } + }) + }) +} + +function toggleTheme() { + currentTheme = currentTheme === "light" ? "dark" : "light" + localStorage.setItem("theme", currentTheme) + + if (currentTheme === "dark") { + document.body.classList.add("dark-mode") + } else { + document.body.classList.remove("dark-mode") + } + + // Sync both toggles + const themeToggle = document.getElementById("themeToggle") + const themeToggleMobile = document.getElementById("themeToggleMobile") + if (themeToggle) { + themeToggle.checked = currentTheme === "dark" + } + if (themeToggleMobile) { + themeToggleMobile.checked = currentTheme === "dark" + } +} + +function switchToEnglish() { + currentLanguage = "en" + localStorage.setItem("language", "en") + document.documentElement.setAttribute("lang", "en") + document.documentElement.setAttribute("dir", "ltr") + updatePageContent("en") + updateLanguageButtons("en") +} + +function switchToArabic() { + currentLanguage = "ar" + localStorage.setItem("language", "ar") + document.documentElement.setAttribute("lang", "ar") + document.documentElement.setAttribute("dir", "rtl") + updatePageContent("ar") + updateLanguageButtons("ar") +} + +function updatePageContent(lang) { + const elements = document.querySelectorAll("[data-ar][data-en]") + + elements.forEach((el) => { + if (lang === "en") { + el.textContent = el.getAttribute("data-en") + } else { + el.textContent = el.getAttribute("data-ar") + } + }) + + // Special handling for html/body attributes + if (lang === "en") { + document.body.style.direction = "ltr" + } else { + document.body.style.direction = "rtl" + } +} + +function updateLanguageButtons(lang) { + const buttons = document.querySelectorAll(".lang-btn") + buttons.forEach((btn) => { + btn.classList.remove("active") + if (btn.getAttribute("data-lang") === lang) { + btn.classList.add("active") + } + }) +} + +const toggle = document.getElementById("nav-toggle"); +const menu = document.getElementById("nav-menu"); + +toggle.addEventListener("click", () => { + toggle.classList.toggle("active"); + menu.classList.toggle("active"); +}); +document.addEventListener("DOMContentLoaded", () => { + const toggle = document.getElementById("nav-toggle"); + const menu = document.getElementById("nav-menu"); + + toggle.addEventListener("click", (e) => { + e.stopPropagation(); + toggle.classList.toggle("active"); + menu.classList.toggle("active"); + }); + + // Close the mobile menu when clicking outside it + document.addEventListener("click", (e) => { + if ( + menu.classList.contains("active") && + !menu.contains(e.target) && + !toggle.contains(e.target) + ) { + menu.classList.remove("active"); + toggle.classList.remove("active"); + } + }); +}); + +let currentQuizQuestions = [] +let currentIndex = 0 +let score = 0 +const answered = new Array(20).fill(false) +const corrects = new Array(20).fill(false) + +const btnStart = document.getElementById("btnStart") +const btnShowRules = document.getElementById("btnShowRules") +const rulesDiv = document.getElementById("rules") + +const qCard = document.getElementById("question-card") +const intro = document.getElementById("intro") +const qIndexText = document.getElementById("qIndex") +const scoreBadge = document.getElementById("scoreBadge") +const scoreShort = document.getElementById("scoreShort") +const qCount = document.getElementById("qCount") +const screenshot = document.getElementById("screenshot") +const siteTitle = document.getElementById("siteTitle") +const scenarioText = document.getElementById("scenario") +const urlDisplay = document.getElementById("url-display") +const securityIcon = document.getElementById("security-icon") +const btnPhish = document.getElementById("btnPhish") +const btnLegit = document.getElementById("btnLegit") +const btnExplain = document.getElementById("btnExplain") +const feedback = document.getElementById("feedback") +const noteArea = document.getElementById("noteArea") + +const btnPrev = document.getElementById("btnPrev") +const btnNext = document.getElementById("btnNext") +const btnSkip = document.getElementById("btnSkip") +const btnRestart = document.getElementById("btnRestart") + +const finalCard = document.getElementById("final-card") +const finalScore = document.getElementById("finalScore") +const finalText = document.getElementById("finalText") + +const navToggle = document.getElementById("nav-toggle") +const navMenu = document.getElementById("nav-menu") + +if (navToggle && navMenu) { + navToggle.addEventListener("click", () => { + navMenu.classList.toggle("active") + navToggle.classList.toggle("active") + }) + + document.querySelectorAll(".nav-link, .dropdown-item").forEach((link) => { + link.addEventListener("click", () => { + navMenu.classList.remove("active") + navToggle.classList.remove("active") + }) + }) +} + +function selectRandomQuestions() { + const templateKeys = Object.keys(phishingTemplates) + const shuffled = templateKeys.sort(() => 0.5 - Math.random()) + const selected = shuffled.slice(0, 20) + + currentQuizQuestions = selected.map((key) => ({ + templateName: key, + ...phishingTemplates[key], + })) +} + +function updateOverview() { + if (qCount) qCount.innerText = currentIndex + 1 + " / 20" + if (scoreShort) scoreShort.innerText = score + if (scoreBadge) scoreBadge.innerText = (currentLanguage === "en" ? "Score: " : "النتيجة: ") + score +} + +function updateUrlBar(item) { + if (urlDisplay) urlDisplay.innerText = item.url + + if (securityIcon) { + if (item.isSecure) { + securityIcon.innerText = "🔒" + } else { + securityIcon.innerText = "⚠️" + } + } +} + +function showQuestion(index) { + if (index < 0) index = 0 + if (index >= 20) index = 19 + currentIndex = index + const item = currentQuizQuestions[index] + + if (intro) intro.style.display = "none" + if (finalCard) finalCard.style.display = "none" + if (qCard) qCard.style.display = "block" + + if (screenshot) { + screenshot.innerHTML = ` + +` + } + + if (siteTitle) siteTitle.innerText = item.title + if (scenarioText) scenarioText.innerText = item.scenario + updateUrlBar(item) + if (qIndexText) qIndexText.innerText = currentLanguage === "en" ? `Question ${index + 1}` : `السؤال ${index + 1}` + if (feedback) feedback.style.display = "none" + if (noteArea) noteArea.innerHTML = "" + + resetButtonStates() + updateOverview() + + if (btnPrev) btnPrev.disabled = index === 0 + if (btnNext) { + btnNext.disabled = index === 19 + if (index < 19) { + btnNext.disabled = !answered[index] + } + } +} + + const headers = document.querySelectorAll(".accordion-header"); + + headers.forEach(header => { + header.addEventListener("click", () => { + const content = header.nextElementSibling; + + headers.forEach(h => { + if (h !== header) { + h.nextElementSibling.style.maxHeight = null; + } + }); + + if (content.style.maxHeight) { + content.style.maxHeight = null; + } else { + content.style.maxHeight = content.scrollHeight + "px"; + } + }); + }); +function resetButtonStates() { + if (btnPhish) { + btnPhish.disabled = false + btnPhish.className = "btn btn-danger btn-quiz" + } + if (btnLegit) { + btnLegit.disabled = false + btnLegit.className = "btn btn-outline-primary btn-quiz" + } +} + +function showFinal() { + if (qCard) qCard.style.display = "none" + if (finalCard) finalCard.style.display = "block" + + const scoreText = currentLanguage === "en" ? `Your Score: ${score} out of 20` : `نتيجتك: ${score} من 20` + if (finalScore) finalScore.innerText = scoreText + + const percent = Math.round((score / 20) * 100) + let message = "" + let alertClass = "" + + if (percent >= 80) { + message = + currentLanguage === "en" + ? "🎉 Excellent! You have a great understanding of phishing signs. Keep applying this knowledge." + : "🎉 ممتاز! لديك فهم ممتاز لعلامات التصيّد الإلكتروني. استمر في تطبيق هذه المعرفة." + alertClass = "alert-success" + } else if (percent >= 60) { + message = + currentLanguage === "en" + ? "⚠️ Good! You have a good understanding but can improve more. Review the tips below." + : "⚠️ جيد! لديك فهم جيد ولكن يمكنك التحسن أكثر. راجع النصائح أدناه." + alertClass = "alert-warning" + } else { + message = + currentLanguage === "en" + ? "❌ Needs Improvement! Review warning signs carefully and try again." + : "❌ بحاجة لتحسين! راجع إشارات التحذير بعناية وأعد المحاولة." + alertClass = "alert-danger" + } + + if (finalText) { + finalText.innerHTML = `
${message}
` + } + updateOverview() +} + +function giveFeedback(isCorrect, explanation) { + if (feedback) { + feedback.style.display = "block" + const alertClass = isCorrect ? "alert-success" : "alert-danger" + const icon = isCorrect ? "✅" : "❌" + const title = + currentLanguage === "en" + ? isCorrect + ? "Correct Answer!" + : "Wrong Answer!" + : isCorrect + ? "إجابة صحيحة!" + : "إجابة خاطئة!" + + feedback.innerHTML = ` +
+
+${icon} +${title} +
+
${explanation}
+
+` + } + + if (noteArea) { + const alertClass = isCorrect ? "alert-success" : "alert-danger" + const label = currentLanguage === "en" ? (isCorrect ? "Correct" : "Wrong") : isCorrect ? "صحيح" : "خطأ" + noteArea.innerHTML = ` +
+${label}: ${explanation} +
+` + } +} + +function answer(selectedPhishing) { + const item = currentQuizQuestions[currentIndex] + if (answered[currentIndex]) { + return + } + answered[currentIndex] = true + const correct = selectedPhishing === item.isPhishing + corrects[currentIndex] = correct + if (correct) { + score += 1 + } + + if (btnPhish) btnPhish.disabled = true + if (btnLegit) btnLegit.disabled = true + + if (selectedPhishing) { + if (btnPhish) { + btnPhish.className = correct ? "btn btn-success btn-quiz" : "btn btn-danger btn-quiz" + } + } else { + if (btnLegit) { + btnLegit.className = correct ? "btn btn-success btn-quiz" : "btn btn-danger btn-quiz" + } + } + + giveFeedback(correct, item.explanation) + updateOverview() + + if (currentIndex === 19) { + setTimeout(() => { + showFinal() + }, 3000) + } + + if (btnNext && currentIndex < 19) { + btnNext.disabled = false + } +} + +if (btnStart) { + btnStart.addEventListener("click", () => { + selectRandomQuestions() + currentIndex = 0 + score = 0 + answered.fill(false) + corrects.fill(false) + updateOverview() + showQuestion(0) + }) +} + +if (btnShowRules) { + btnShowRules.addEventListener("click", () => { + if (rulesDiv) { + rulesDiv.style.display = rulesDiv.style.display === "none" ? "block" : "none" + } + }) +} + +if (btnPhish) btnPhish.addEventListener("click", () => answer(true)) +if (btnLegit) btnLegit.addEventListener("click", () => answer(false)) + +if (btnExplain) { + btnExplain.addEventListener("click", () => { + const item = currentQuizQuestions[currentIndex] + alert(currentLanguage === "en" ? "Explanation:\n\n" + item.explanation : "شرح:\n\n" + item.explanation) + }) +} + +if (btnPrev) { + btnPrev.addEventListener("click", () => { + if (currentIndex > 0) showQuestion(currentIndex - 1) + }) +} + +if (btnNext) { + btnNext.addEventListener("click", () => { + if (!answered[currentIndex]) { + const msg = + currentLanguage === "en" + ? "You must answer the question first or press 'Skip' to move to the next question" + : "يجب الإجابة على السؤال أولاً أو اضغط 'تخطي' للانتقال للسؤال التالي" + alert(msg) + return + } + + if (currentIndex < 19) { + showQuestion(currentIndex + 1) + } else { + showFinal() + } + }) +} + +if (btnSkip) { + btnSkip.addEventListener("click", () => { + answered[currentIndex] = true + if (currentIndex < 19) { + showQuestion(currentIndex + 1) + } else { + showFinal() + } + }) +} + +if (btnRestart) { + btnRestart.addEventListener("click", () => { + currentIndex = 0 + score = 0 + answered.fill(false) + corrects.fill(false) + updateOverview() + if (intro) intro.style.display = "block" + if (finalCard) finalCard.style.display = "none" + if (qCard) qCard.style.display = "none" + }) +} + +document.addEventListener("DOMContentLoaded", () => { + document.querySelectorAll('a[href^="#"]').forEach((anchor) => { + anchor.addEventListener("click", function (e) { + e.preventDefault() + const target = document.querySelector(this.getAttribute("href")) + if (target) { + target.scrollIntoView({ + behavior: "smooth", + block: "start", + }) + } + }) + }) + + const observerOptions = { + threshold: 0.1, + rootMargin: "0px 0px -50px 0px", + } + + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.style.opacity = "1" + entry.target.style.transform = "translateY(0)" + } + }) + }, observerOptions) + + document.querySelectorAll(".tip-card").forEach((card) => { + card.style.opacity = "0" + card.style.transform = "translateY(20px)" + card.style.transition = "opacity 0.6s ease, transform 0.6s ease" + observer.observe(card) + }) + + updateOverview() +}) + +document.addEventListener("keydown", (e) => { + if (qCard && qCard.style.display !== "none") { + if (e.key === "1" || e.key === "ArrowLeft") { + if (btnPhish && !btnPhish.disabled) answer(true) + } else if (e.key === "2" || e.key === "ArrowRight") { + if (btnLegit && !btnLegit.disabled) answer(false) + } else if (e.key === "Enter" || e.key === " ") { + if (btnNext && !btnNext.disabled) { + if (currentIndex < 19) { + showQuestion(currentIndex + 1) + } else { + showFinal() + } + } + } + } +}) + +document.addEventListener("DOMContentLoaded", () => { + const cards = Array.from(document.querySelectorAll(".tips-grid .tip-card")) + if (!cards.length) return + cards.forEach((card, i) => { + card.classList.remove("in-from-right", "in-from-left", "fade-in", "offset-right", "offset-left", "offset-scale") + card.classList.add("offset-bottom") + card.classList.add(`stagger-${i % 6}`) + }) + const observerOptions = { + root: null, + rootMargin: "0px 0px -10% 0px", + threshold: 0.15, + } + const io = new IntersectionObserver((entries, obs) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) return + const card = entry.target + card.classList.remove("fade-in") + void card.offsetWidth + card.classList.add("fade-in") + obs.unobserve(card) + }) + }, observerOptions) + cards.forEach((c) => io.observe(c)) +}) + + +// نختار كل العناصر اللي عليها كلاس scroll-element +const scrollElements = document.querySelectorAll(".scroll-element"); + +// دالة تتحقق إذا العنصر ظهر على الشاشة +const elementInView = (el, offset = 0) => { + const elementTop = el.getBoundingClientRect().top; + return elementTop <= (window.innerHeight || document.documentElement.clientHeight) - offset; +}; + +// دالة تضيف الكلاس show +const displayScrollElement = (el) => { + el.classList.add("show"); +}; + +// دالة تزيل الكلاس show (اختياري لو عايز تقدر تعمل scroll up) +const hideScrollElement = (el) => { + el.classList.remove("show"); +}; + +// الدالة الرئيسية اللي هتشتغل عند كل Scroll +const handleScrollAnimation = () => { + scrollElements.forEach((el) => { + if (elementInView(el, 100)) { // يظهر قبل ما يوصل نص العنصر بمقدار 100px + displayScrollElement(el); + } else { + hideScrollElement(el); + } + }); +}; + + + + +// نضيف Event Listener للـ Scroll +window.addEventListener("scroll", handleScrollAnimation); + +// اختياري: نفّذ أول مرة عشان العناصر اللي ظاهر أول الصفحة تظهر مباشرة +handleScrollAnimation(); + + +// Counter Animation +const counters = document.querySelectorAll('.stat-number'); +let started = false; +function animateCounter(el) { + const originalText = el.textContent.trim(); + + // Extract number only + const target = parseInt(originalText.replace(/\D/g, ''), 10); + + // Extract prefix & suffix (like "+", "%", "minutes") + const prefix = originalText.match(/^\D+/)?.[0] || ""; + const suffix = originalText.match(/\D+$/)?.[0] || ""; + + let current = 0; + const speed = target / 60; + + const update = () => { + current += speed; + + if (current < target) { + el.textContent = prefix + Math.floor(current).toLocaleString() + suffix; + requestAnimationFrame(update); + } else { + el.textContent = prefix + target.toLocaleString() + suffix; + } + }; + + el.style.opacity = 1; + update(); +} +const observer = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting && !started) { + counters.forEach(c => animateCounter(c)); + started = true; + } +}); +const statsSection = document.querySelector('.hero-stats'); +observer.observe(statsSection); \ No newline at end of file diff --git a/pages/assistant.html b/pages/assistant.html new file mode 100644 index 0000000..a7d5ba8 --- /dev/null +++ b/pages/assistant.html @@ -0,0 +1,336 @@ + + + + + + المساعد الذكي - EoH Security + + + + + + + + + + + + + + + + +
+
+
+
+

+ + + المساعد حورس للأمان الرقمي + +

+ +

+ + تحدث مع المساعد حورس وأرسل له المحتوى المشبوه للحصول على تحليل فوري + +

+ + +
+
+
+ +
+
+
+
+
+
+
+ + + نصائح سريعة + +
+ +
    +
  • تحقق من عنوان المرسل في الرسائل الإلكترونية
  • +
  • انتبه للأخطاء الإملائية والنحوية
  • +
  • لا تضغط على الروابط المشبوهة
  • +
  • تأكد من وجود HTTPS في المواقع المهمة
  • +
+
+
+
+ +
+
+
+
+ + + كيف يعمل المساعد؟ + +
+

+ يستخدم المساعد حورس خوارزميات متقدمة لتحليل المحتوى والبحث عن علامات التصيد الإلكتروني مثل الروابط المشبوهة والنصوص المضللة. +

+
+
+
+ +
+
+
+
+ + + التحليلات الأخيرة + +
+
+

لا توجد تحليلات سابقة

+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
المساعد حورس
+ متصل 24/7 +
+
+ +
+
+ +
+
+
+ +
+
+ مرحباً! أنا المساعد الذكي للأمان الرقمي. يمكنني مساعدتك في تحليل المحتوى المشبوه. أرسل لي أي رابط أو رسالة أو صورة تشك في أنها قد تكون محاولة تصيد إلكتروني. +
+
+ +
+ + + + + + + +
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+ +
+
+ +
+
+
+
+
+
+ + + + + + + + + + + diff --git a/pages/blog.html b/pages/blog.html new file mode 100644 index 0000000..88fb992 --- /dev/null +++ b/pages/blog.html @@ -0,0 +1,356 @@ + + + + + + EoH Security - المدونة + + + + + + + + + + + + + + + +
+
+
+
+

+ + + مدونة الأمان الرقمي + +

+

+ شارك تجاربك مع التصيد الإلكتروني وحذر الآخرين من التهديدات الجديدة +

+
+
+
+ + +
+
+
+
+
+
+
+ شارك تجربتك +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
سيتم عرضه بشكل آمن للتحذير
+
+ +
+ +
+
+
+
+
+ +
+
+

آخر التحذيرات والتجارب

+
+ + + + + +
+
+ +
+
+
+
+
+
+ +
+
+
أحمد محمد
+ منذ ساعتين +
+
+ رسائل إيميل مزيفة +
+ +
تحذير: رسائل مزيفة باسم البنك الأهلي المصري
+

+ وصلتني رسالة إيميل تدعي أنها من البنك الأهلي تطلب تحديث بيانات الحساب. + الرسالة تحتوي على أخطاء إملائية واضحة والرابط يؤدي إلى موقع مشبوه. + انتبهوا من هذا النوع من الرسائل! +

+ +
+ + الرابط المشبوه: nbe-update-account[.]net +
+ +
+
+ + +
+ + 156 مشاهدة + +
+
+
+ +
+
+
+
+
+ +
+
+
فاطمة علي
+ منذ 4 ساعات +
+
+ رسائل نصية احتيالية +
+ +
رسائل مزيفة باسم فودافون تطلب تحديث البيانات
+

+ وصلتني رسالة نصية تدعي أنها من فودافون تقول أن خطي سيتم إيقافه إذا لم أضغط على الرابط لتحديث البيانات. + اتصلت بخدمة العملاء وأكدوا أنها رسالة احتيالية. +

+ +
+ نص الرسالة المشبوهة: +

"عزيزي العميل، خطك سيتم إيقافه خلال 24 ساعة. اضغط على الرابط لتحديث بياناتك: [رابط مشبوه]"

+
+ +
+
+ + +
+ + 89 مشاهدة + +
+
+
+ +
+
+
+
+
+ +
+
+
محمد حسن
+ منذ يوم واحد +
+
+ منشورات مواقع التواصل +
+ +
مسابقة مزيفة على فيسبوك تطلب معلومات شخصية
+

+ شاهدت منشور على فيسبوك يدعي أنه مسابقة من شركة سامسونج لربح هاتف جديد. + المنشور يطلب ملء استمارة بالمعلومات الشخصية ورقم البطاقة الائتمانية "للشحن". + هذا نصب واضح! +

+ +
+ + تحذير: الشركات الحقيقية لا تطلب معلومات بنكية في المسابقات +
+ +
+
+ + +
+ + 203 مشاهدة + +
+
+
+
+ + +
+
+
+
+ + + + + + + + + + diff --git a/pages/extension.html b/pages/extension.html new file mode 100644 index 0000000..3baac74 --- /dev/null +++ b/pages/extension.html @@ -0,0 +1,366 @@ + + + + + + تحميل إضافة EoH-Guard + + + + + + + + + + + + + + + +
+ +
+
+
+

+ + إضافة EoH-Guard - حماية ذكية +

+

+ اكتشف كيفية تحميل وتثبيت إضافة EoH-Guard على متصفحك للحماية من التصيد والتتبع أثناء التصفح. +

+
+
+
+ + +
+
+

مميزات EoH-Guard

+
+
+ +

حماية من التتبع

+

توقف تتبع أنشطتك الإلكترونية والحفاظ على خصوصيتك

+
+
+ +

كشف التصيد

+

تحديد ومنع المواقع المزيفة قبل أن تؤذيك

+
+
+ +

تحديثات فورية

+

تلقي تحديثات حول التهديدات وهي تحدث

+
+
+ +

سهل الاستخدام

+

واجهة بسيطة حتى للمستخدمين المبتدئين

+
+
+
+
+ + +
+
+

خطوات التحميل والتثبيت

+ + +
+
+
1
+

اضغط على زر التحميل

+
+

+ ابدأ بالضغط على زر 'تحميل الآن' الموجود أدناه. سيتم تحميل ملف إضافة EoH-Guard على جهازك. +

+ +
+
+
+ ملاحظة: +

تأكد من أن متصفحك مدعوم: Chrome، Firefox أو Edge

+
+
+ + +
+
+
2
+

اختر متصفحك

+
+

+ اختر المتصفح الذي تستخدمه وتابع التعليمات الخاصة به: +

+
+
+ + Chrome +
+
+ + Firefox +
+
+ + Edge +
+
+
+
+
+ + +
+
+
3
+

تثبيت على Chrome

+
+

+ اتبع الخطوات التالية لتثبيت الإضافة على Chrome: +

+
    +
  • اذهب إلى chrome://extensions في شريط العناوين
  • +
  • فعّل 'وضع المطورين' من الزاوية العلوية اليمنى
  • +
  • انقر على 'تحميل الإضافة المفكوكة'
  • +
  • اختر مجلد الإضافة المحملة
  • +
  • تم! ستجد الإضافة الآن في قائمة الإضافات
  • +
+
+
+
+ + يجب أن تكون ملفات الإضافة مفك ضغطها لتتمكن من تحميلها +
+
+ + +
+
+
4
+

تثبيت على Firefox

+
+

+ اتبع الخطوات التالية لتثبيت الإضافة على Firefox: +

+
    +
  • اذهب إلى about:addons في شريط العناوين
  • +
  • انقر على أيقونة الترس وحدد 'تثبيت إضافة من ملف'
  • +
  • اختر ملف الإضافة المحمل (.xpi أو .zip)
  • +
  • انقر 'فتح' وسيبدأ التثبيت تلقائياً
  • +
  • تم! ستظهر الإضافة في قائمة إضافاتك
  • +
+
+
+
+ + +
+
+
5
+

تثبيت على Edge

+
+

+ اتبع الخطوات التالية لتثبيت الإضافة على Edge: +

+
    +
  • اذهب إلى edge://extensions في شريط العناوين
  • +
  • فعّل 'وضع المطورين' من الزاوية العلوية اليسرى
  • +
  • اسحب وأفلت ملف الإضافة المحمل إلى النافذة
  • +
  • سيطلب منك تأكيد التثبيت - انقر 'إضافة الإضافة'
  • +
  • تم! الإضافة جاهزة للاستخدام الآن
  • +
+
+
+
+ + +
+
+
6
+

ضبط الإعدادات

+
+

+ بعد التثبيت، قم بضبط إعدادات الإضافة حسب احتياجاتك: +

+
    +
  • انقر على أيقونة EoH-Guard في شريط الأدوات
  • +
  • اختر 'الإعدادات' من القائمة المنسدلة
  • +
  • فعّل 'حماية التتبع' و'كشف التصيد'
  • +
  • يمكنك تخصيص مستوى الحماية (منخفض/متوسط/عالي)
  • +
  • احفظ الإعدادات وتصفح بآمان!
  • +
+
+
+
+ نصيحة: +

ننصح بتفعيل جميع خيارات الحماية للحصول على أفضل الأمان

+
+
+ + +
+
+
7
+

كيفية الاستخدام

+
+

+ بعد التثبيت والتكوين، إليك كيفية استخدام الإضافة: +

+
    +
  • ستعمل الإضافة تلقائياً في الخلفية أثناء تصفحك
  • +
  • إذا اكتشفت موقع تصيد أو متتبع، ستصدر تحذيراً
  • +
  • انقر على أيقونة الإضافة للاطلاع على تقرير النشاط اليومي
  • +
  • إذا واجهت موقع مريب، بلّغ عنه من خلال الإضافة
  • +
  • راقب قائمة المواقع المحظورة والمتتبعات التي تم حجبها
  • +
+
+
+
+ + +
+
+
8
+

حل المشاكل

+
+

+ إذا واجهت أي مشاكل، جرب الحلول التالية: +

+
    +
  • تحقق من توافقية المتصفح الخاص بك
  • +
  • أعد تشغيل المتصفح بعد التثبيت
  • +
  • تأكد من أن الإضافة مُفعّلة في إعدادات المتصفح
  • +
  • حاول إلغاء تثبيت الإضافة وإعادة تثبيتها
  • +
  • تحقق من أن ملفات الإضافة لم تتضرر أثناء التحميل
  • +
+
+
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/pages/report.html b/pages/report.html new file mode 100644 index 0000000..3305f9e --- /dev/null +++ b/pages/report.html @@ -0,0 +1,389 @@ + + + + + + EoH Security - الإبلاغ عن موقع + + + + + + + + + + + + + + + +
+
+
+
+

+ + الإبلاغ عن محتوى مشبوه +

+

+ ساعدنا في حماية المجتمع من التصيد الإلكتروني بالإبلاغ عن المحتوى المشبوه +

+
+
+
+ +
+
+
+
+
+
+
+ + إرشادات الإبلاغ +
+
    +
  • كن دقيقاً في وصف التهديد
  • +
  • أرفق لقطات شاشة إن أمكن
  • +
  • لا تضغط على الروابط المشبوهة
  • +
  • احتفظ بنسخة من الرسالة الأصلية
  • +
  • أبلغ فوراً عن أي محاولة تصيد
  • +
+
+
+ +
+
+
+ + لماذا الإبلاغ مهم؟ +
+
    +
  • يساعد في حماية المستخدمين الآخرين
  • +
  • يساهم في تطوير أنظمة الحماية
  • +
  • يساعد الجهات المختصة في التتبع
  • +
  • يقلل من انتشار التهديدات
  • +
+
+
+ +
+
+
+ + إحصائيات التقارير +
+
+
+
+

1,247

+ تقرير هذا الشهر +
+
+
+

89%

+ تم حلها +
+
+
+
+ +
+
+
+ + أحدث التهديدات المبلغ عنها +
+
+
+ موقع تصيد +
تقليد موقع البنك الأهلي
+ منذ ساعة +
+
+ رسالة مزيفة +
ادعاء الفوز بجائزة
+ منذ 3 ساعات +
+
+ تطبيق مزيف +
تقليد تطبيق بنكي
+ منذ 5 ساعات +
+
+
+
+ +
+
+
+ + خصوصيتك محمية +
+

+ جميع البلاغات تتم معالجتها بسرية تامة. يمكنك الإبلاغ بشكل مجهول إذا كنت تفضل ذلك. +

+
+
+ +
+
+
+ + معلومات الاتصال +
+
+

الخط الساخن: 19777

+

البريد الإلكتروني: report@eohsecurity.com

+

ساعات العمل: 24/7

+

+ للحالات العاجلة، يمكنك الاتصال بالخط الساخن مباشرة +

+
+
+
+
+
+
+
+
+ + نموذج الإبلاغ +
+

+ املأ النموذج أدناه للإبلاغ عن أي محتوى مشبوه واجهته. سيتم مراجعة تقريرك من قبل فريق الأمان لدينا. +

+ +
+
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
إذا كان التهديد يحتوي على رابط
+
+ +
+ + +
+ +
+ + +
يمكنك إرفاق حتى 5 ملفات (الحد الأقصى 10 ميجا لكل ملف)
+
+ +
+ + +
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/pages/simulator.html b/pages/simulator.html new file mode 100644 index 0000000..132ee0e --- /dev/null +++ b/pages/simulator.html @@ -0,0 +1,353 @@ + + + + + + Eye Of Horus Security + + + + + + + + + + + + + + + +
+
+
+
+

+ + + اختبار محاكاة التصيد الإلكتروني + +

+

+ تعلم كيفية حماية نفسك من محاولات التصيد الإلكتروني والاحتيال الرقمي. + هذا الاختبار سيساعدك على التعرف على التهديدات الشائعة وكيفية تجنبها. +

+ +
+
+
+
+
+

+ + + ملاحظات هامة للحماية + +

+ + +
+
+
+ +
+

تحقق من الروابط

+

+ لا تضغط على الروابط المشبوهة في الرسائل الإلكترونية أو الرسائل النصية. + تحقق من عنوان الرابط قبل النقر عليه. +

+
+ +
+
+ +
+

تأكد من عنوان الموقع

+

+ تحقق من عنوان الموقع في شريط العناوين وتأكد من وجود رمز القفل (HTTPS) + قبل إدخال أي بيانات شخصية. +

+
+ +
+
+ +
+

المصادقة الثنائية

+

+ استخدم المصادقة الثنائية (2FA) في جميع حساباتك المهمة لإضافة طبقة + حماية إضافية ضد المتسللين. +

+
+ +
+
+ +
+

كن حذراً من المعلومات الشخصية

+

+ لا تشارك معلوماتك الشخصية أو المالية عبر البريد الإلكتروني أو + المواقع غير الموثوقة. +

+
+ +
+
+ +
+

تحديث البرامج

+

+ حافظ على تحديث نظام التشغيل والبرامج باستمرار للحصول على + أحدث تصحيحات الأمان. +

+
+ +
+
+ +
+

الإبلاغ عن المحتوى المشبوه

+

+ إذا واجهت محتوى مشبوهاً أو محاولة تصيد، قم بالإبلاغ عنها + للجهات المختصة فوراً. +

+
+
+
+
+
+
+

+ + اختبر معرفتك بالأمان الرقمي +

+
+
+
+
+
نتائج سريعة
+

السؤال الحالي: 0 / 20

+

النقاط: 0

+
+
ملاحظات بعد كل سؤال
+
+
+
+ +
+
+
معلومات مساعدة
+
    +
  • ابحث عن اختلافات في النطاق (domain) أو أحرف غريبة.
  • +
  • تحقق من وجود قفل الأمان في المتصفح لكن لا تعتمد عليه وحده.
  • +
  • لا تُدخل بيانات حساسة إن لم تكن متأكداً من المصدر.
  • +
+
+
+
+
+
+
+
ابدأ الاختبار
+

+ سيعرض لك الموقع 20 مثال عشوائي من مجموعة كبيرة من مواقع التصيد باللغة العربية والإنجليزية. عليك أن تختار إن كانت هذه الصفحة تصيّداً أم حقيقية. + الهدف هو تدريب عينك على إشارات التحذير. الاختبار تعليمي فقط. +

+ +
+
+

اضغط على ابدأ لبدء الاختبار. لكل إجابة صحيحة تحصل على نقطة.

+
+ + +
+
+ + + + + + +
+
+
+ +
+
+
تحميل إضافة المتصفح
+

قم بتحميل اداة EoH Guard, وتصفح بلا قلق!

+ +
+
+
+
+
+
+
+ + + + + + + + + + From 37e18a407287f01a7283c812d9f56fc0c9f9ed2e Mon Sep 17 00:00:00 2001 From: "Kareem M." <87204079+scarecrow-47@users.noreply.github.com> Date: Mon, 19 Jan 2026 03:24:44 +0200 Subject: [PATCH 5/8] Add files via upload --- css/style.css | 283 ++++---------------- css/styles.css | 28 +- index.html | 39 +-- pages/assistant.html | 16 -- pages/blog.html | 621 +++++++++++++++++++++++-------------------- pages/extension.html | 135 ++-------- pages/privacy.html | 16 -- pages/report.html | 18 +- pages/simulator.html | 16 -- pages/terms.html | 16 -- 10 files changed, 424 insertions(+), 764 deletions(-) diff --git a/css/style.css b/css/style.css index 4305f0e..147e82e 100644 --- a/css/style.css +++ b/css/style.css @@ -13,7 +13,8 @@ --navbar-bg: #003fd3d0; --accent-color: #3b82f6; } -body.dark-mode { +body { + font-family: "Cairo", sans-serif; --background: #000000; --bg-primary: #000000; --bg-secondary: #000000; @@ -21,28 +22,20 @@ body.dark-mode { --text-secondary: #cbd5e1; --border-color: #334155; --navbar-bg: #000a2291; - background-color: var(--background); - background-image: radial-gradient(circle at 50% 10%, rgba(17, 0, 255, 0.308) 0%, transparent 20%), - linear-gradient(to right, rgba(255, 255, 255, 0.089) 1px, transparent 1px), - linear-gradient(to bottom, rgba(255, 255, 255, 0.089) 1px, transparent 1px); - background-size: 100% 100%, 40px 40px, 40px 40px; -} -body { - font-family: "Cairo", sans-serif; - line-height: 1.6; - background-color: var(--bg-primary); direction: rtl; transition: background-color 0.3s ease, color 0.3s ease; color: var(--text-secondary); + background-color: var(--bg-primary); background-color: var(--background); - background-image: radial-gradient(circle at 50% 50%, rgba(77, 217, 255, 0.1) 0%, transparent 50%), - linear-gradient(to right, rgba(255, 255, 255, 0.055) 1px, transparent 1px), - linear-gradient(to bottom, rgba(255, 255, 255, 0.055) 1px, transparent 1px); + background-image: radial-gradient(circle at 50% 10%, rgba(17, 0, 255, 0.308) 0%, transparent 20%), + linear-gradient(to right, rgba(255, 255, 255, 0.089) 1px, transparent 1px), + linear-gradient(to bottom, rgba(255, 255, 255, 0.089) 1px, transparent 1px); background-size: 100% 100%, 40px 40px, 40px 40px; line-height: 1.6; overflow-x: hidden; } + .container { max-width: 1200px !important; margin: 0 auto !important; @@ -499,15 +492,11 @@ body { .product-title { font-size: 1.5rem !important; - color: #1e3a8a !important; + color: #e0f2fe !important; margin-bottom: 15px !important; font-weight: 700 !important; } -body.dark-mode .product-title { - color: #e0f2fe !important; -} - .product-description { color: var(--text-secondary) !important; margin-bottom: 20px !important; @@ -538,15 +527,11 @@ body.dark-mode .product-title { .values-title { text-align: center !important; font-size: 2rem !important; - color: #1e3a8a !important; + color: #e0f2fe !important; margin-bottom: 40px !important; font-weight: 700 !important; } -body.dark-mode .values-title { - color: #e0f2fe !important; -} - .values-grid { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)) !important; @@ -572,15 +557,11 @@ body.dark-mode .values-title { } .value-item h4 { - color: #1e3a8a !important; + color: #e0f2fe !important; margin-bottom: 10px !important; font-weight: 600 !important; } -body.dark-mode .value-item h4 { - color: #e0f2fe !important; -} - .value-item p { color: var(--text-secondary) !important; font-size: 0.95rem !important; @@ -611,16 +592,12 @@ body.dark-mode .value-item h4 { .section-title { text-align: center; font-size: 32px; - color: #1e3a8a !important; + color: #e0f2fe !important; margin-bottom: 80px; font-weight: 700 !important; transition: color 0.3s ease !important; } -body.dark-mode .section-title { - color: #e0f2fe !important; -} - .section-title i { margin-left: 15px !important; color: #3b82f6 !important; @@ -677,7 +654,7 @@ body.dark-mode .section-title { } .dropdown-menu { - background-color: #1e3a8a !important; + background-color: #1e293b !important; border: none !important; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2) !important; border-radius: 12px !important; @@ -813,7 +790,7 @@ main{ } .card-title { - color: #1e3a8a !important; + color: #e0f2fe !important; font-weight: 700 !important; font-size: 1.5rem !important; margin-bottom: 15px !important; @@ -821,10 +798,6 @@ main{ margin-right: 10px; } -body.dark-mode .card-title { - color: #e0f2fe !important; -} - .btn { font-weight: 600 !important; border-radius: 8px !important; @@ -957,7 +930,7 @@ body.dark-mode .card-title { .browser-lines span:nth-child(3) { width: 60%; } -.simulator.btn.container{ +.simulator-btn-container{ display: flex; flex-direction: row; width: 100%; @@ -967,7 +940,7 @@ body.dark-mode .card-title { .simulatorbtn{ height: 10px; - text-align: center; + justify-content: center; font-size: 14px; width: 40%; } @@ -1282,16 +1255,12 @@ body.dark-mode .card-title { .tip-title { font-size: 1.3rem !important; - color: #1e3a8a !important; + color: #e0f2fe !important; margin-bottom: 15px !important; font-weight: 600 !important; transition: color 0.3s ease !important; } -body.dark-mode .tip-title { - color: #e0f2fe !important; -} - .tip-card:hover .tip-title { color: #3b82f6 !important; } @@ -1304,10 +1273,6 @@ body.dark-mode .tip-title { } .tip-card:hover .tip-description { - color: #1e3a8a !important; -} - -body.dark-mode .tip-card:hover .tip-description { color: #e0f2fe !important; } @@ -1348,18 +1313,6 @@ body.dark-mode .tip-card:hover .tip-description { } -/* .footer { - background: linear-gradient(135deg, #000000 0%, #006aff 100%) !important; - color: white !important; - padding: 50px 0 20px !important; - margin-top: 20px; - transition: background 0.3s ease !important; -} - -body.dark-mode .footer { - background: linear-gradient(135deg, #000000 0%, #02143a 100%) !important; -} */ - .footer-content { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)) !important; @@ -1377,11 +1330,6 @@ body.dark-mode .footer { } .footer-description { - color: #000000 !important; - line-height: 1.6 !important; -} - -body.dark-mode .footer-description { color: #dadadabb !important; line-height: 1.6 !important; } @@ -1402,14 +1350,7 @@ body.dark-mode .footer-description { } .footer-links a { - color: #000000 !important; - text-decoration: none !important; - display: inline-block; - transition: all 0.3s ease; -} - -body.dark-mode .footer-links a { - color: #dadadabb !important; + color: #ffffffd7 !important; text-decoration: none !important; display: inline-block; transition: all 0.3s ease; @@ -1550,16 +1491,12 @@ body.dark-mode .footer-links a { } #final-card h3 { - color: #1e3a8a !important; + color: #e0f2fe !important; font-size: 2rem !important; margin-bottom: 20px !important; font-weight: 700 !important; } -body.dark-mode #final-card h3 { - color: #e0f2fe !important; -} - #final-card p { font-size: 1.1rem !important; line-height: 1.6 !important; @@ -1619,10 +1556,6 @@ ul { margin-left: 5px; } -body.dark-mode .dropdown-menu { - background-color: #1e293b !important; -} - #contentType option[value="url"] { background: var(--accent-color); color: #fff; @@ -1683,16 +1616,16 @@ body.dark-mode .dropdown-menu { /* Chat Style */ .chat-container { height: 500px; - border: 1px solid #000000; + border: 1px solid #dee2e6; border-radius: 12px; display: flex; flex-direction: column; - background: white; + background: rgb(0, 0, 0); } .chat-header { - background: linear-gradient(135deg, #3b82f6, #1e3a8a); - color: white; + background: linear-gradient(135deg, #353535, #000d30); + color: rgb(255, 255, 255); padding: 15px 20px; border-radius: 12px 12px 0 0; display: flex; @@ -1704,14 +1637,13 @@ body.dark-mode .dropdown-menu { flex: 1; overflow-y: auto; padding: 20px; - background: #cccccc; + background: #000000; } .message { margin-bottom: 15px; display: flex; align-items: flex-start; - gap: 10px; } @@ -1729,9 +1661,7 @@ body.dark-mode .dropdown-menu { font-size: 18px; flex-shrink: 0; } -.message-avatar:first-child{ - background: linear-gradient(135deg, #3b82f6, #1e3a8a); -} + .message.bot .message-avatar { background: linear-gradient(135deg, #3b82f6, #1e3a8a); color: white; @@ -1750,7 +1680,7 @@ body.dark-mode .dropdown-menu { } .message.bot .message-content { - background: white; + background: rgb(201, 201, 201); border: 1px solid #e5e7eb; color: black; box-shadow: 0 2px 4px rgba(0,0,0,0.1); @@ -1760,123 +1690,29 @@ body.dark-mode .dropdown-menu { background: linear-gradient(135deg, #3b82f6, #1e3a8a); color: white; } -#typingIndicator { - display: none; -} .chat-input-area { padding: 20px; border-top: 1px solid #e5e7eb; - background: white; - border-radius: 0 0 12px 12px; -} - -.input-group-custom { - display: flex; - gap: 10px; - align-items: flex-end; -} - -.message-input { - flex: 1; - border: 1px solid #dee2e6; - border-radius: 20px; - padding: 12px 16px; - resize: none; - max-height: 100px; -} - -body.dark-mode .chat-container { - height: 500px; - border: 1px solid #dee2e6; - border-radius: 12px; - display: flex; - flex-direction: column; - background: rgb(0, 0, 0); -} - -body.dark-mode .chat-header { background: linear-gradient(135deg, #353535, #000d30); - color: rgb(255, 255, 255); - padding: 15px 20px; - border-radius: 12px 12px 0 0; - display: flex; - align-items: center; - gap: 10px; -} - -body.dark-mode .chat-messages { - flex: 1; - overflow-y: auto; - padding: 20px; - background: #000000; -} - -body.dark-mode .message { - margin-bottom: 15px; - display: flex; - align-items: flex-start; - gap: 10px; -} - -body.dark-mode .message.user { - flex-direction: row-reverse; -} - -body.dark-mode .message-avatar { - width: 40px; - height: 40px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - flex-shrink: 0; -} - -body.dark-mode .message.bot .message-avatar { - background: linear-gradient(135deg, #3b82f6, #1e3a8a); - color: white; -} - -body.dark-mode .message.user .message-avatar { - background: linear-gradient(135deg, #16a34a, #15803d); - color: white; -} - -body.dark-mode .message-content { - max-width: 70%; - padding: 12px 16px; - border-radius: 18px; - line-height: 1.4; -} - -body.dark-mode .message.bot .message-content { - background: rgb(201, 201, 201); - border: 1px solid #e5e7eb; - color: black; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + border-radius: 0 0 12px 12px; } -body.dark-mode .message.user .message-content { +.message-avatar:first-child{ background: linear-gradient(135deg, #3b82f6, #1e3a8a); - color: white; } -body.dark-mode .chat-input-area { - padding: 20px; - border-top: 1px solid #e5e7eb; - background: linear-gradient(135deg, #353535, #000d30); - border-radius: 0 0 12px 12px; +#typingIndicator { + display: none; } -body.dark-mode .input-group-custom { +.input-group-custom { display: flex; gap: 10px; align-items: flex-end; } -body.dark-mode .message-input { +.message-input { flex: 1; border: 1px solid #000000; color: black; @@ -2136,6 +1972,7 @@ body.dark-mode .message-input { align-items: center !important; justify-content: center !important; text-align: center; + cursor: pointer; gap: 10px !important; padding: 15px !important; border-radius: 10px !important; @@ -2146,6 +1983,7 @@ body.dark-mode .message-input { .browser-icon:hover { transform: translateY(-5px) !important; box-shadow: 0 10px 20px rgba(59, 130, 246, 0.2) !important; + text-decoration: none !important; } .browser-icon i { font-size: 32px !important; @@ -2156,7 +1994,7 @@ body.dark-mode .message-input { font-weight: 600 !important; color: var(--text-primary) !important; } -@media (max-width: 768px) { +@media (max-width: 768px) { /* Phones (Except Folded)*/ .step-container { flex-direction: column !important; gap: 30px !important; @@ -2180,6 +2018,13 @@ body.dark-mode .message-input { justify-content: center !important; align-content: center !important; } + + .simulator-btn-container{ + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + } } .features-grid { @@ -2298,23 +2143,18 @@ html[lang="en"] .footer-logo span { /* ITEM */ .accordion-item { - background: #fff; border-radius: 12px; - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08); - margin-bottom: 10px; - overflow: hidden; -} - -body.dark-mode .accordion-item { background: #1e1e1e; box-shadow: 0 10px 25px rgba(255, 255, 255, 0.1); + margin-bottom: 10px; + overflow: hidden; } /* HEADER */ .accordion-header { width: 100%; padding: 18px 20px; - background: #2659ff; + background: #003cff; color: white; border: none !important; outline: none !important; @@ -2325,10 +2165,6 @@ body.dark-mode .accordion-item { text-align: inherit; /* key */ } -body.dark-mode .accordion-header { - background: #003cff; -} - .accordion-header:focus-visible { outline: none; } @@ -2343,18 +2179,13 @@ body.dark-mode .accordion-header { } .accordion-content p { - color: #000000; + color: #ffffff; padding: 15px 0; font-size: 18px; line-height: 1.6; margin: 0; } -body.dark-mode .accordion-content p { - color: #ffffff; -} - - .tips-grid-timeline { display: grid; grid-template-columns: 1fr 1fr; @@ -2388,17 +2219,16 @@ body.dark-mode .accordion-content p { } .tip-timeline { - background-color: white; + background-color: #000000; + color: #f0f0f0; padding: 20px 30px; border-radius: 12px; - border-width: 2px; - border-color: #001f83; - border-style: solid; + border: solid 1px var(--border-color); position: relative; width: 100%; font-size: 18px; line-height: 1.5; - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.25); + box-shadow: 0 10px 25px rgba(255, 255, 255, 0.1); z-index: 2; transition: all 0.6s ease-out; opacity: 0; @@ -2498,21 +2328,6 @@ body.dark-mode .accordion-content p { right: 60px; } -body.dark-mode .tip-timeline { - background-color: #000000; - color: #f0f0f0; - border: solid 1px var(--border-color); - box-shadow: 0 10px 25px rgba(255, 255, 255, 0.1); -} - -body.dark-mode .tip-timeline:hover { - box-shadow: none; -} - -body.dark-mode .tip-timeline i { - color: white; -} - @media (prefers-reduced-motion: reduce) { .stat-number, .stat-label, diff --git a/css/styles.css b/css/styles.css index 21f8d20..c6a3589 100644 --- a/css/styles.css +++ b/css/styles.css @@ -10,7 +10,7 @@ --radius: 10px; } -body.dark-mode { +body { --text-muted: #ffffff; } @@ -152,13 +152,6 @@ body.dark-mode { } .project-title { - color: rgb(25, 0, 255); - font-size: 1.875rem; - font-weight: 700; - letter-spacing: -0.01em; -} - -body.dark-mode .project-title { color: rgb(0, 174, 255); font-size: 1.875rem; font-weight: 700; @@ -246,9 +239,6 @@ body.dark-mode .project-title { padding: 16px; border: 1px solid var(--border-color); border-radius: 8px; -} - -body.dark-mode .feature-box { background: rgb(0, 0, 0); } @@ -697,10 +687,6 @@ body.dark-mode .feature-box { font-size: 4rem; font-weight: 700; margin-bottom: 20px; - color: var(--text-secondary); -} - -body.dark-mode .terms-hero .hero-title { color: #ffffff; } @@ -831,12 +817,8 @@ body.dark-mode .terms-hero .hero-title { .section-header h2 { font-size: 1.625rem; font-weight: 700; - color: var(--text-secondary); - margin: 0; -} - -body.dark-mode .section-header h2 { color: #ffffff; + margin: 0; } .section-content { @@ -851,16 +833,12 @@ body.dark-mode .section-header h2 { .section-content h4 { font-weight: 700; - color: var(--text-secondary); + color: #ffffff; margin-top: 24px; margin-bottom: 12px; font-size: 1.125rem; } -body.dark-mode .section-content h4 { - color: #ffffff; -} - .feature-list { list-style: none; margin-bottom: 24px; diff --git a/index.html b/index.html index f42469f..5ba0ee3 100644 --- a/index.html +++ b/index.html @@ -11,8 +11,7 @@ - + @@ -63,14 +62,6 @@ -

+

حلل رموز QR على الفور لتحديد التصيد الاحتيالي والاحتيال أو النشاط الضار.

@@ -434,7 +417,7 @@

تحليل فوري

-

تقييم المخاطر المفصل لكل رمز تم مسحه.

@@ -447,7 +430,7 @@

منع الاحتيال

-

يحجب عمليات إعادة التوجيه الضارة وسرقة البيانات المحتملة.

diff --git a/pages/assistant.html b/pages/assistant.html index 9778ed3..022960e 100644 --- a/pages/assistant.html +++ b/pages/assistant.html @@ -50,14 +50,6 @@