+
+ مشاريعنا الرئيسية
+
+
+
+
+
+
+
+
+
+
+
+
+
+ التعليم هو أفضل دفاع. يوفر محاكينا الشامل سيناريوهات واقعية لمساعدة المستخدمين على
+ تحديد التهديدات
+ الرقمية قبل وقوعها.
+
+
+
+
+
+
+
+
+ 20+ سيناريو
+
+
+ تهديدات واقعية متنوعة
+
+
+
+
+
+
+
+
+ إضافة متصفح
+
+
+ تنبيهات في الوقت الفعلي
+
+
+
+
+
+
+
+
+ نصائح تعليمية
+
+
+ إرشادات أمان الخبراء
+
+
+
+
+
+
+
+
+ مساعد حورس
+
+
+ دعم أمان الذكاء الاصطناعي 24/7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ تعزيز سلامة الأطفال من خلال المراقبة المتصلة. يسمح لك حورس الوالد بتوجيه ومراقبة
+ النشاط الرقمي في
+ الوقت الفعلي وبناء الثقة دون قيود كاملة.
+
+
+
+
+
+
+ نظام المراقبة المتصل في الوقت الفعلي
+
+
+
+
+
+ الكشف المبكر عن المخاطر والإرشادات السلوكية
+
+
+
+
+
+ يعزز السلوك الرقمي المسؤول
+
+
+
+
+
+
+ اعرف أكثر
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ حلل رموز QR على الفور لتحديد التصيد الاحتيالي والاحتيال أو النشاط الضار.
+
+
+
+
+
+
+
+
+ تحليل فوري
+
+
+
+ تقييم المخاطر المفصل لكل رمز تم مسحه.
+
+
+
+
+
+
+
+ منع الاحتيال
+
+
+
+ يحجب عمليات إعادة التوجيه الضارة وسرقة البيانات المحتملة.
+
+
+
+
+
+
+
+ ابدأ الآن
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ قيمنا
+ الأساسية
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ملاحظات هامة للحماية
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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://', '')}
+
+ ` : ''}
+
+
+
+
+ مفيد (0)
+
+
+ مشاركة
+
+
+
+ 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 = `
+
+`
+ }
+
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
EoH Security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ المساعد حورس للأمان الرقمي
+
+
+
+
+
+ تحدث مع المساعد حورس وأرسل له المحتوى المشبوه للحصول على تحليل فوري
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 - المدونة
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
EoH Security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ مدونة الأمان الرقمي
+
+
+
+ شارك تجاربك مع التصيد الإلكتروني وحذر الآخرين من التهديدات الجديدة
+
+
+
+
+
+
+
+
+
+
+
+
+
+
آخر التحذيرات والتجارب
+
+ الكل
+ إيميل
+ SMS
+ اجتماعي
+ مواقع
+
+
+
+
+
+
+
+
+
+
+
+
+
أحمد محمد
+ منذ ساعتين
+
+
+
رسائل إيميل مزيفة
+
+
+
تحذير: رسائل مزيفة باسم البنك الأهلي المصري
+
+ وصلتني رسالة إيميل تدعي أنها من البنك الأهلي تطلب تحديث بيانات الحساب.
+ الرسالة تحتوي على أخطاء إملائية واضحة والرابط يؤدي إلى موقع مشبوه.
+ انتبهوا من هذا النوع من الرسائل!
+
+
+
+
+ الرابط المشبوه: nbe-update-account[.]net
+
+
+
+
+
+ مفيد (12)
+
+
+ مشاركة
+
+
+
+ 156 مشاهدة
+
+
+
+
+
+
+
+
+
+
+
+
+
+
فاطمة علي
+ منذ 4 ساعات
+
+
+
رسائل نصية احتيالية
+
+
+
رسائل مزيفة باسم فودافون تطلب تحديث البيانات
+
+ وصلتني رسالة نصية تدعي أنها من فودافون تقول أن خطي سيتم إيقافه إذا لم أضغط على الرابط لتحديث البيانات.
+ اتصلت بخدمة العملاء وأكدوا أنها رسالة احتيالية.
+
+
+
+
نص الرسالة المشبوهة:
+
"عزيزي العميل، خطك سيتم إيقافه خلال 24 ساعة. اضغط على الرابط لتحديث بياناتك: [رابط مشبوه]"
+
+
+
+
+
+ مفيد (8)
+
+
+ مشاركة
+
+
+
+ 89 مشاهدة
+
+
+
+
+
+
+
+
+
+
+
+
+
+
محمد حسن
+ منذ يوم واحد
+
+
+
منشورات مواقع التواصل
+
+
+
مسابقة مزيفة على فيسبوك تطلب معلومات شخصية
+
+ شاهدت منشور على فيسبوك يدعي أنه مسابقة من شركة سامسونج لربح هاتف جديد.
+ المنشور يطلب ملء استمارة بالمعلومات الشخصية ورقم البطاقة الائتمانية "للشحن".
+ هذا نصب واضح!
+
+
+
+
+ تحذير: الشركات الحقيقية لا تطلب معلومات بنكية في المسابقات
+
+
+
+
+
+ مفيد (15)
+
+
+ مشاركة
+
+
+
+ 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 Security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ إضافة EoH-Guard - حماية ذكية
+
+
+ اكتشف كيفية تحميل وتثبيت إضافة EoH-Guard على متصفحك للحماية من التصيد والتتبع أثناء التصفح.
+
+
+
+
+
+
+
+
+
+
+
+
خطوات التحميل والتثبيت
+
+
+
+
+
+
+
+
+
+
+
+
+ يجب أن تكون ملفات الإضافة مفك ضغطها لتتمكن من تحميلها
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 - الإبلاغ عن موقع
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
EoH Security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ الإبلاغ عن محتوى مشبوه
+
+
+ ساعدنا في حماية المجتمع من التصيد الإلكتروني بالإبلاغ عن المحتوى المشبوه
+
+
+
+
+
+
+
+
+
+
+
+
+
+ إرشادات الإبلاغ
+
+
+ كن دقيقاً في وصف التهديد
+ أرفق لقطات شاشة إن أمكن
+ لا تضغط على الروابط المشبوهة
+ احتفظ بنسخة من الرسالة الأصلية
+ أبلغ فوراً عن أي محاولة تصيد
+
+
+
+
+
+
+
+
+ لماذا الإبلاغ مهم؟
+
+
+ يساعد في حماية المستخدمين الآخرين
+ يساهم في تطوير أنظمة الحماية
+ يساعد الجهات المختصة في التتبع
+ يقلل من انتشار التهديدات
+
+
+
+
+
+
+
+
+ إحصائيات التقارير
+
+
+
+
+
1,247
+ تقرير هذا الشهر
+
+
+
+
89%
+ تم حلها
+
+
+
+
+
+
+
+
+
+ أحدث التهديدات المبلغ عنها
+
+
+
+
موقع تصيد
+
تقليد موقع البنك الأهلي
+
منذ ساعة
+
+
+
رسالة مزيفة
+
ادعاء الفوز بجائزة
+
منذ 3 ساعات
+
+
+
تطبيق مزيف
+
تقليد تطبيق بنكي
+
منذ 5 ساعات
+
+
+
+
+
+
+
+
+
+ خصوصيتك محمية
+
+
+ جميع البلاغات تتم معالجتها بسرية تامة. يمكنك الإبلاغ بشكل مجهول إذا كنت تفضل ذلك.
+
+
+
+
+
+
+
+
+ معلومات الاتصال
+
+
+
الخط الساخن: 19777
+
البريد الإلكتروني: report@eohsecurity.com
+
ساعات العمل: 24/7
+
+ للحالات العاجلة، يمكنك الاتصال بالخط الساخن مباشرة
+
+
+
+
+
+
+
+
+
+
+ نموذج الإبلاغ
+
+
+ املأ النموذج أدناه للإبلاغ عن أي محتوى مشبوه واجهته. سيتم مراجعة تقريرك من قبل فريق الأمان لدينا.
+
+
+
+
+
+
+ نوع التهديد: *
+
+ اختر نوع التهديد
+ موقع تصيد إلكتروني
+ بريد إلكتروني مزيف
+ رسالة نصية مشبوهة
+ احتيال على وسائل التواصل
+ تطبيق مزيف
+ مكالمة احتيالية
+ برمجيات خبيثة
+ أخرى
+
+
+
+
+
الرابط المشبوه:
+
+
إذا كان التهديد يحتوي على رابط
+
+
+
+ وصف التهديد: *
+
+
+
+
+
إرفاق أدلة (صور، لقطات شاشة):
+
+
يمكنك إرفاق حتى 5 ملفات (الحد الأقصى 10 ميجا لكل ملف)
+
+
+
+ تاريخ الحادثة:
+
+
+
+
+
+
+ ملاحظات إضافية:
+
+
+
+
+
+
+
+
+ إرسال التقرير
+
+
+
+ مسح النموذج
+
+
+
+
+
+
+
+ تم إرسال التقرير بنجاح!
+
+
+ شكراً لك على المساهمة في حماية المجتمع. سيتم مراجعة تقريرك من قبل فريق الأمان لدينا خلال 24-48 ساعة.
+ رقم التقرير:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
EoH Security
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ اختبار محاكاة التصيد الإلكتروني
+
+
+
+ تعلم كيفية حماية نفسك من محاولات التصيد الإلكتروني والاحتيال الرقمي.
+ هذا الاختبار سيساعدك على التعرف على التهديدات الشائعة وكيفية تجنبها.
+
+
+
+
+
+
+
+
+
+
+ ملاحظات هامة للحماية
+
+
+
+
+
+
+
+
+
+
تحقق من الروابط
+
+ لا تضغط على الروابط المشبوهة في الرسائل الإلكترونية أو الرسائل النصية.
+ تحقق من عنوان الرابط قبل النقر عليه.
+
+
+
+
+
+
+
+
تأكد من عنوان الموقع
+
+ تحقق من عنوان الموقع في شريط العناوين وتأكد من وجود رمز القفل (HTTPS)
+ قبل إدخال أي بيانات شخصية.
+
+
+
+
+
+
+
+
المصادقة الثنائية
+
+ استخدم المصادقة الثنائية (2FA) في جميع حساباتك المهمة لإضافة طبقة
+ حماية إضافية ضد المتسللين.
+
+
+
+
+
+
+
+
كن حذراً من المعلومات الشخصية
+
+ لا تشارك معلوماتك الشخصية أو المالية عبر البريد الإلكتروني أو
+ المواقع غير الموثوقة.
+
+
+
+
+
+
+
+
تحديث البرامج
+
+ حافظ على تحديث نظام التشغيل والبرامج باستمرار للحصول على
+ أحدث تصحيحات الأمان.
+
+
+
+
+
+
+
+
الإبلاغ عن المحتوى المشبوه
+
+ إذا واجهت محتوى مشبوهاً أو محاولة تصيد، قم بالإبلاغ عنها
+ للجهات المختصة فوراً.
+
+
+
+
+
+
+
+
+
+ اختبر معرفتك بالأمان الرقمي
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@