| | <!DOCTYPE html> |
| | <html lang="ar" dir="rtl"> |
| | <head> |
| | <meta charset="UTF-8"> |
| | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | <title>إنستا | الشبكة الاجتماعية</title> |
| | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| | <style> |
| | :root { |
| | --primary-color: #0095f6; |
| | --primary-light: #b3dffd; |
| | --text-dark: #262626; |
| | --text-gray: #8e8e8e; |
| | --border-color: #dbdbdb; |
| | --bg-white: #ffffff; |
| | --bg-light: #fafafa; |
| | --error-color: #ed4956; |
| | --success-color: #4BB543; |
| | --notification-badge: #ff3040; |
| | } |
| | |
| | * { |
| | margin: 0; |
| | padding: 0; |
| | box-sizing: border-box; |
| | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; |
| | -webkit-tap-highlight-color: transparent; |
| | } |
| | |
| | body { |
| | background-color: var(--bg-light); |
| | color: var(--text-dark); |
| | padding-bottom: 60px; |
| | } |
| | |
| | |
| | .header { |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | height: 54px; |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | padding: 0 16px; |
| | background-color: var(--bg-white); |
| | border-bottom: 1px solid var(--border-color); |
| | z-index: 100; |
| | } |
| | |
| | .header-logo { |
| | font-family: 'Billabong', cursive; |
| | font-size: 24px; |
| | font-weight: 600; |
| | margin-top: 5px; |
| | } |
| | |
| | .header-icons { |
| | display: flex; |
| | gap: 20px; |
| | position: relative; |
| | } |
| | |
| | .header-icons i { |
| | font-size: 24px; |
| | cursor: pointer; |
| | color: var(--text-dark); |
| | position: relative; |
| | } |
| | |
| | .notification-badge { |
| | position: absolute; |
| | top: -5px; |
| | right: -5px; |
| | background-color: var(--notification-badge); |
| | color: white; |
| | border-radius: 50%; |
| | width: 18px; |
| | height: 18px; |
| | display: flex; |
| | align-items: center; |
| | justify-content: center; |
| | font-size: 10px; |
| | font-weight: bold; |
| | } |
| | |
| | |
| | .main-content { |
| | margin-top: 54px; |
| | } |
| | |
| | |
| | .tabs-navigation { |
| | display: flex; |
| | background-color: var(--bg-white); |
| | border-bottom: 1px solid var(--border-color); |
| | } |
| | |
| | .tab-btn { |
| | flex: 1; |
| | text-align: center; |
| | padding: 15px 0; |
| | font-weight: 600; |
| | cursor: pointer; |
| | position: relative; |
| | color: var(--text-gray); |
| | } |
| | |
| | .tab-btn.active { |
| | color: var(--text-dark); |
| | } |
| | |
| | .tab-btn.active::after { |
| | content: ''; |
| | position: absolute; |
| | bottom: 0; |
| | left: 0; |
| | right: 0; |
| | height: 2px; |
| | background-color: var(--text-dark); |
| | } |
| | |
| | |
| | .tab-content { |
| | display: none; |
| | padding: 15px; |
| | } |
| | |
| | .tab-content.active { |
| | display: block; |
| | } |
| | |
| | |
| | .section-title { |
| | font-size: 16px; |
| | font-weight: 600; |
| | margin-bottom: 15px; |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | } |
| | |
| | .section-title a { |
| | color: var(--text-gray); |
| | font-size: 14px; |
| | font-weight: normal; |
| | text-decoration: none; |
| | } |
| | |
| | .friend-request-item, .suggested-friend-item, .notification-item { |
| | display: flex; |
| | align-items: center; |
| | padding: 10px 0; |
| | border-bottom: 1px solid var(--border-color); |
| | } |
| | |
| | .friend-avatar, .notification-avatar { |
| | width: 50px; |
| | height: 50px; |
| | border-radius: 50%; |
| | object-fit: cover; |
| | margin-left: 15px; |
| | } |
| | |
| | .friend-info, .notification-info { |
| | flex: 1; |
| | } |
| | |
| | .friend-name, .notification-text { |
| | font-weight: 600; |
| | font-size: 14px; |
| | margin-bottom: 3px; |
| | } |
| | |
| | .friend-meta, .notification-time { |
| | color: var(--text-gray); |
| | font-size: 12px; |
| | } |
| | |
| | .friend-actions, .notification-actions { |
| | display: flex; |
| | gap: 8px; |
| | } |
| | |
| | .btn { |
| | padding: 7px 12px; |
| | border-radius: 8px; |
| | font-size: 12px; |
| | font-weight: 600; |
| | cursor: pointer; |
| | border: none; |
| | } |
| | |
| | .btn-primary { |
| | background-color: var(--primary-color); |
| | color: white; |
| | } |
| | |
| | .btn-outline { |
| | background-color: transparent; |
| | border: 1px solid var(--border-color); |
| | color: var(--text-dark); |
| | } |
| | |
| | .btn-danger { |
| | background-color: var(--error-color); |
| | color: white; |
| | } |
| | |
| | |
| | .message-item { |
| | display: flex; |
| | align-items: center; |
| | padding: 12px 0; |
| | border-bottom: 1px solid var(--border-color); |
| | cursor: pointer; |
| | } |
| | |
| | .message-avatar { |
| | width: 60px; |
| | height: 60px; |
| | border-radius: 50%; |
| | object-fit: cover; |
| | margin-left: 10px; |
| | } |
| | |
| | .message-content { |
| | flex: 1; |
| | } |
| | |
| | .message-header { |
| | display: flex; |
| | justify-content: space-between; |
| | margin-bottom: 5px; |
| | } |
| | |
| | .message-sender { |
| | font-weight: 600; |
| | font-size: 14px; |
| | } |
| | |
| | .message-time { |
| | color: var(--text-gray); |
| | font-size: 12px; |
| | } |
| | |
| | .message-preview { |
| | display: flex; |
| | align-items: center; |
| | } |
| | |
| | .message-text { |
| | font-size: 13px; |
| | color: var(--text-gray); |
| | max-width: 80%; |
| | white-space: nowrap; |
| | overflow: hidden; |
| | text-overflow: ellipsis; |
| | } |
| | |
| | .message-unread { |
| | background-color: var(--primary-color); |
| | width: 8px; |
| | height: 8px; |
| | border-radius: 50%; |
| | margin-right: 5px; |
| | } |
| | |
| | |
| | .chat-modal { |
| | position: fixed; |
| | top: 0; |
| | left: 0; |
| | right: 0; |
| | bottom: 0; |
| | background-color: rgba(0, 0, 0, 0.8); |
| | z-index: 200; |
| | display: none; |
| | flex-direction: column; |
| | } |
| | |
| | .chat-header { |
| | background-color: var(--bg-white); |
| | padding: 15px; |
| | display: flex; |
| | align-items: center; |
| | border-bottom: 1px solid var(--border-color); |
| | } |
| | |
| | .chat-back-btn { |
| | margin-left: 10px; |
| | font-size: 20px; |
| | cursor: pointer; |
| | } |
| | |
| | .chat-title { |
| | flex: 1; |
| | font-weight: 600; |
| | text-align: center; |
| | } |
| | |
| | .chat-body { |
| | flex: 1; |
| | background-color: var(--bg-white); |
| | padding: 15px; |
| | overflow-y: auto; |
| | } |
| | |
| | .message-bubble { |
| | max-width: 70%; |
| | padding: 10px 15px; |
| | border-radius: 18px; |
| | margin-bottom: 10px; |
| | font-size: 14px; |
| | position: relative; |
| | } |
| | |
| | .message-in { |
| | background-color: var(--bg-light); |
| | margin-right: auto; |
| | border-bottom-right-radius: 0; |
| | } |
| | |
| | .message-out { |
| | background-color: var(--primary-light); |
| | margin-left: auto; |
| | border-bottom-left-radius: 0; |
| | } |
| | |
| | .message-time { |
| | font-size: 10px; |
| | color: var(--text-gray); |
| | margin-top: 5px; |
| | text-align: right; |
| | } |
| | |
| | .chat-footer { |
| | background-color: var(--bg-white); |
| | padding: 15px; |
| | border-top: 1px solid var(--border-color); |
| | display: flex; |
| | align-items: center; |
| | } |
| | |
| | .message-input { |
| | flex: 1; |
| | padding: 12px 15px; |
| | border-radius: 22px; |
| | border: 1px solid var(--border-color); |
| | font-size: 14px; |
| | background-color: var(--bg-light); |
| | } |
| | |
| | .send-btn { |
| | margin-right: 10px; |
| | font-size: 20px; |
| | color: var(--primary-color); |
| | cursor: pointer; |
| | } |
| | |
| | |
| | .bottom-nav { |
| | position: fixed; |
| | bottom: 0; |
| | left: 0; |
| | right: 0; |
| | background-color: var(--bg-white); |
| | display: flex; |
| | justify-content: space-around; |
| | padding: 12px 0; |
| | border-top: 1px solid var(--border-color); |
| | } |
| | |
| | .bottom-nav i { |
| | font-size: 24px; |
| | cursor: pointer; |
| | color: var(--text-dark); |
| | } |
| | |
| | .bottom-nav i.active { |
| | color: var(--primary-color); |
| | } |
| | |
| | |
| | .notifications-modal { |
| | position: fixed; |
| | top: 54px; |
| | right: 10px; |
| | width: 350px; |
| | max-height: 500px; |
| | overflow-y: auto; |
| | background-color: var(--bg-white); |
| | border-radius: 10px; |
| | box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); |
| | z-index: 150; |
| | display: none; |
| | } |
| | |
| | .notifications-header { |
| | padding: 15px; |
| | border-bottom: 1px solid var(--border-color); |
| | font-weight: 600; |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | } |
| | |
| | .notifications-close { |
| | cursor: pointer; |
| | } |
| | |
| | .notifications-list { |
| | padding: 0; |
| | } |
| | |
| | .notification-item { |
| | padding: 12px 15px; |
| | cursor: pointer; |
| | } |
| | |
| | .notification-item.unread { |
| | background-color: rgba(0, 149, 246, 0.05); |
| | } |
| | |
| | .notification-item:hover { |
| | background-color: var(--bg-light); |
| | } |
| | |
| | |
| | .search-container { |
| | padding: 15px; |
| | } |
| | |
| | .search-input { |
| | width: 100%; |
| | padding: 12px 15px; |
| | border-radius: 8px; |
| | border: 1px solid var(--border-color); |
| | font-size: 14px; |
| | margin-bottom: 15px; |
| | background-color: var(--bg-light); |
| | } |
| | |
| | .search-tabs { |
| | display: flex; |
| | border-bottom: 1px solid var(--border-color); |
| | margin-bottom: 15px; |
| | } |
| | |
| | .search-tab { |
| | padding: 10px 15px; |
| | cursor: pointer; |
| | font-weight: 600; |
| | color: var(--text-gray); |
| | } |
| | |
| | .search-tab.active { |
| | color: var(--text-dark); |
| | border-bottom: 2px solid var(--text-dark); |
| | } |
| | |
| | .posts-grid { |
| | display: grid; |
| | grid-template-columns: repeat(3, 1fr); |
| | gap: 2px; |
| | } |
| | |
| | .post-thumbnail { |
| | width: 100%; |
| | aspect-ratio: 1/1; |
| | object-fit: cover; |
| | cursor: pointer; |
| | } |
| | |
| | |
| | @font-face { |
| | font-family: 'Billabong'; |
| | src: url('https://fonts.cdnfonts.com/s/13949/Billabong.woff') format('woff'); |
| | } |
| | |
| | |
| | .push-notification { |
| | position: fixed; |
| | top: 20px; |
| | left: 50%; |
| | transform: translateX(-50%); |
| | background-color: var(--bg-white); |
| | padding: 12px 20px; |
| | border-radius: 8px; |
| | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); |
| | z-index: 300; |
| | display: flex; |
| | align-items: center; |
| | opacity: 0; |
| | transition: opacity 0.3s, top 0.3s; |
| | } |
| | |
| | .push-notification.show { |
| | opacity: 1; |
| | top: 30px; |
| | } |
| | |
| | .push-notification-avatar { |
| | width: 40px; |
| | height: 40px; |
| | border-radius: 50%; |
| | object-fit: cover; |
| | margin-left: 10px; |
| | } |
| | |
| | .push-notification-text { |
| | flex: 1; |
| | font-size: 14px; |
| | } |
| | |
| | .push-notification-close { |
| | color: var(--text-gray); |
| | cursor: pointer; |
| | } |
| | |
| | |
| | @media (max-width: 450px) { |
| | .friend-avatar, .message-avatar, .notification-avatar { |
| | width: 45px; |
| | height: 45px; |
| | } |
| | |
| | .btn { |
| | padding: 5px 8px; |
| | font-size: 11px; |
| | } |
| | |
| | .notifications-modal { |
| | width: 300px; |
| | right: 5px; |
| | } |
| | } |
| | </style> |
| | </head> |
| | <body> |
| | |
| | <div class="header"> |
| | <div class="header-logo">إنستا</div> |
| | <div class="header-icons"> |
| | <i class="far fa-heart" id="notificationsBtn"> |
| | <span class="notification-badge" id="notificationBadge" style="display: none;">0</span> |
| | </i> |
| | <i class="far fa-paper-plane" id="messagesBtn"></i> |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="main-content"> |
| | |
| | <div class="tabs-navigation"> |
| | <div class="tab-btn active" data-tab="friends">طلبات الصداقة</div> |
| | <div class="tab-btn" data-tab="suggestions">اقتراحات</div> |
| | <div class="tab-btn" data-tab="messages">المراسلة</div> |
| | <div class="tab-btn" data-tab="search">بحث</div> |
| | </div> |
| | |
| | |
| | <div class="tab-content active" id="friends-tab"> |
| | <div class="section-title"> |
| | <span>طلبات الصداقة</span> |
| | <a href="#" id="seeAllRequests">عرض الكل</a> |
| | </div> |
| | |
| | <div id="friendRequestsList"> |
| | |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="tab-content" id="suggestions-tab"> |
| | <div class="section-title"> |
| | <span>أشخاص قد تعرفهم</span> |
| | <a href="#" id="refreshSuggestions">تحديث</a> |
| | </div> |
| | |
| | <div id="suggestionsList"> |
| | |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="tab-content" id="messages-tab"> |
| | <div class="section-title"> |
| | <span>المراسلة</span> |
| | <a href="#" id="newMessageBtn">رسالة جديدة</a> |
| | </div> |
| | |
| | <div id="messagesList"> |
| | |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="tab-content" id="search-tab"> |
| | <div class="search-container"> |
| | <input type="text" class="search-input" placeholder="ابحث عن أشخاص أو منشورات..." id="searchInput"> |
| | |
| | <div class="search-tabs"> |
| | <div class="search-tab active" data-search-tab="posts">منشورات</div> |
| | <div class="search-tab" data-search-tab="people">أشخاص</div> |
| | </div> |
| | |
| | <div id="searchResults"> |
| | <div class="posts-grid" id="postsGrid"> |
| | |
| | </div> |
| | |
| | <div id="peopleResults" style="display: none;"> |
| | |
| | </div> |
| | </div> |
| | </div> |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="bottom-nav"> |
| | <i class="fas fa-home active"></i> |
| | <i class="fas fa-search" id="searchBtn"></i> |
| | <i class="far fa-plus-square"></i> |
| | <i class="far fa-heart" id="notificationsBtnMobile"></i> |
| | <i class="fas fa-user"></i> |
| | </div> |
| | |
| | |
| | <div class="chat-modal" id="chatModal"> |
| | <div class="chat-header"> |
| | <div class="chat-back-btn" id="chatBackBtn"> |
| | <i class="fas fa-arrow-left"></i> |
| | </div> |
| | <div class="chat-title" id="chatTitle">محادثة</div> |
| | </div> |
| | <div class="chat-body" id="chatBody"> |
| | |
| | </div> |
| | <div class="chat-footer"> |
| | <input type="text" class="message-input" id="messageInput" placeholder="اكتب رسالة..."> |
| | <div class="send-btn" id="sendMessageBtn"> |
| | <i class="far fa-paper-plane"></i> |
| | </div> |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="notifications-modal" id="notificationsModal"> |
| | <div class="notifications-header"> |
| | <span>الإشعارات</span> |
| | <i class="fas fa-times notifications-close" id="notificationsClose"></i> |
| | </div> |
| | <div class="notifications-list" id="notificationsList"> |
| | |
| | </div> |
| | </div> |
| | |
| | |
| | <div class="push-notification" id="pushNotification"> |
| | <img src="" class="push-notification-avatar" id="pushNotificationAvatar"> |
| | <div class="push-notification-text" id="pushNotificationText"></div> |
| | <i class="fas fa-times push-notification-close" id="pushNotificationClose"></i> |
| | </div> |
| | |
| | <script> |
| | |
| | const appData = { |
| | currentUser: { |
| | id: 1, |
| | name: "سارة أحمد", |
| | username: "@sara_ahmed", |
| | avatar: "https://randomuser.me/api/portraits/women/44.jpg" |
| | }, |
| | friendRequests: [ |
| | { |
| | id: 2, |
| | name: "أحمد محمد", |
| | username: "@ahmed_mohamed", |
| | avatar: "https://randomuser.me/api/portraits/men/32.jpg", |
| | mutualFriends: 4, |
| | date: "منذ ساعتين" |
| | }, |
| | { |
| | id: 3, |
| | name: "ليلى خالد", |
| | username: "@laila_khalid", |
| | avatar: "https://randomuser.me/api/portraits/women/63.jpg", |
| | mutualFriends: 2, |
| | date: "منذ يوم" |
| | }, |
| | { |
| | id: 4, |
| | name: "محمد علي", |
| | username: "@mohamed_ali", |
| | avatar: "https://randomuser.me/api/portraits/men/45.jpg", |
| | mutualFriends: 7, |
| | date: "منذ 3 أيام" |
| | } |
| | ], |
| | suggestedFriends: [ |
| | { |
| | id: 5, |
| | name: "نورا سعيد", |
| | username: "@nora_saeed", |
| | avatar: "https://randomuser.me/api/portraits/women/22.jpg", |
| | mutualFriends: 3 |
| | }, |
| | { |
| | id: 6, |
| | name: "خالد عمر", |
| | username: "@khaled_omar", |
| | avatar: "https://randomuser.me/api/portraits/men/12.jpg", |
| | mutualFriends: 5 |
| | }, |
| | { |
| | id: 7, |
| | name: "هناء وليد", |
| | username: "@hanna_waleed", |
| | avatar: "https://randomuser.me/api/portraits/women/33.jpg", |
| | mutualFriends: 1 |
| | }, |
| | { |
| | id: 8, |
| | name: "ياسر ناصر", |
| | username: "@yasser_nasser", |
| | avatar: "https://randomuser.me/api/portraits/men/67.jpg", |
| | mutualFriends: 2 |
| | } |
| | ], |
| | messages: [ |
| | { |
| | id: 2, |
| | user: { |
| | id: 2, |
| | name: "أحمد محمد", |
| | username: "@ahmed_mohamed", |
| | avatar: "https://randomuser.me/api/portraits/men/32.jpg" |
| | }, |
| | lastMessage: "مرحبًا، كيف حالك؟", |
| | time: "10:30 ص", |
| | unread: true, |
| | chat: [ |
| | { |
| | id: 1, |
| | sender: 2, |
| | text: "مرحبًا سارة!", |
| | time: "10:20 ص" |
| | }, |
| | { |
| | id: 2, |
| | sender: 2, |
| | text: "كيف حالك؟", |
| | time: "10:21 ص" |
| | }, |
| | { |
| | id: 3, |
| | sender: 1, |
| | text: "أهلاً أحمد، أنا بخير الحمد لله", |
| | time: "10:25 ص" |
| | }, |
| | { |
| | id: 4, |
| | sender: 2, |
| | text: "هل أنتِ متاحة للقاء غدًا؟", |
| | time: "10:30 ص" |
| | } |
| | ] |
| | }, |
| | { |
| | id: 3, |
| | user: { |
| | id: 3, |
| | name: "ليلى خالد", |
| | username: "@laila_khalid", |
| | avatar: "https://randomuser.me/api/portraits/women/63.jpg" |
| | }, |
| | lastMessage: "شكرًا لكِ!", |
| | time: "أمس", |
| | unread: false, |
| | chat: [ |
| | { |
| | id: 1, |
| | sender: 3, |
| | text: "مرحبًا سارة، شكرًا على المساعدة", |
| | time: "9:00 م" |
| | }, |
| | { |
| | id: 2, |
| | sender: 1, |
| | text: "لا شكر على واجب ليلى", |
| | time: "9:05 م" |
| | }, |
| | { |
| | id: 3, |
| | sender: 3, |
| | text: "حقًا ساعدتيني كثيرًا", |
| | time: "9:10 م" |
| | }, |
| | { |
| | id: 4, |
| | sender: 3, |
| | text: "شكرًا لكِ!", |
| | time: "9:12 م" |
| | } |
| | ] |
| | } |
| | ], |
| | friends: [], |
| | notifications: [ |
| | { |
| | id: 1, |
| | type: "like", |
| | user: { |
| | id: 2, |
| | name: "أحمد محمد", |
| | avatar: "https://randomuser.me/api/portraits/men/32.jpg" |
| | }, |
| | post: { |
| | id: 101, |
| | thumbnail: "https://picsum.photos/id/101/300/300" |
| | }, |
| | time: "منذ دقائق", |
| | read: false |
| | }, |
| | { |
| | id: 2, |
| | type: "comment", |
| | user: { |
| | id: 3, |
| | name: "ليلى خالد", |
| | avatar: "https://randomuser.me/api/portraits/women/63.jpg" |
| | }, |
| | post: { |
| | id: 102, |
| | thumbnail: "https://picsum.photos/id/102/300/300" |
| | }, |
| | text: "هذه الصورة رائعة!", |
| | time: "منذ ساعة", |
| | read: false |
| | }, |
| | { |
| | id: 3, |
| | type: "friend_request", |
| | user: { |
| | id: 4, |
| | name: "محمد علي", |
| | avatar: "https://randomuser.me/api/portraits/men/45.jpg" |
| | }, |
| | time: "منذ يوم", |
| | read: true |
| | }, |
| | { |
| | id: 4, |
| | type: "follow", |
| | user: { |
| | id: 5, |
| | name: "نورا سعيد", |
| | avatar: "https://randomuser.me/api/portraits/women/22.jpg" |
| | }, |
| | time: "منذ يومين", |
| | read: true |
| | } |
| | ], |
| | posts: [ |
| | { |
| | id: 101, |
| | image: "https://picsum.photos/id/101/800/800", |
| | thumbnail: "https://picsum.photos/id/101/300/300", |
| | likes: 124, |
| | comments: 23, |
| | caption: "يوم جميل في الطبيعة 🌿", |
| | time: "منذ 3 ساعات" |
| | }, |
| | { |
| | id: 102, |
| | image: "https://picsum.photos/id/102/800/800", |
| | thumbnail: "https://picsum.photos/id/102/300/300", |
| | likes: 89, |
| | comments: 12, |
| | caption: "وجبة غداء لذيذة 🍽️", |
| | time: "منذ يوم" |
| | }, |
| | { |
| | id: 103, |
| | image: "https://picsum.photos/id/103/800/800", |
| | thumbnail: "https://picsum.photos/id/103/300/300", |
| | likes: 215, |
| | comments: 45, |
| | caption: "رحلتي إلى الجبل ⛰️", |
| | time: "منذ 3 أيام" |
| | }, |
| | { |
| | id: 104, |
| | image: "https://picsum.photos/id/104/800/800", |
| | thumbnail: "https://picsum.photos/id/104/300/300", |
| | likes: 56, |
| | comments: 8, |
| | caption: "قراءة كتاب جديد 📖", |
| | time: "منذ أسبوع" |
| | }, |
| | { |
| | id: 105, |
| | image: "https://picsum.photos/id/105/800/800", |
| | thumbnail: "https://picsum.photos/id/105/300/300", |
| | likes: 312, |
| | comments: 67, |
| | caption: "حفل موسيقي رائع 🎵", |
| | time: "منذ أسبوعين" |
| | }, |
| | { |
| | id: 106, |
| | image: "https://picsum.photos/id/106/800/800", |
| | thumbnail: "https://picsum.photos/id/106/300/300", |
| | likes: 78, |
| | comments: 15, |
| | caption: "وقت ممتع مع الأصدقاء 👫", |
| | time: "منذ شهر" |
| | } |
| | ] |
| | }; |
| | |
| | |
| | const tabBtns = document.querySelectorAll('.tab-btn'); |
| | const tabContents = document.querySelectorAll('.tab-content'); |
| | const friendRequestsList = document.getElementById('friendRequestsList'); |
| | const suggestionsList = document.getElementById('suggestionsList'); |
| | const messagesList = document.getElementById('messagesList'); |
| | const chatModal = document.getElementById('chatModal'); |
| | const chatBody = document.getElementById('chatBody'); |
| | const messageInput = document.getElementById('messageInput'); |
| | const sendMessageBtn = document.getElementById('sendMessageBtn'); |
| | const chatBackBtn = document.getElementById('chatBackBtn'); |
| | const chatTitle = document.getElementById('chatTitle'); |
| | const messagesBtn = document.getElementById('messagesBtn'); |
| | const notificationsBtn = document.getElementById('notificationsBtn'); |
| | const notificationsBtnMobile = document.getElementById('notificationsBtnMobile'); |
| | const seeAllRequests = document.getElementById('seeAllRequests'); |
| | const refreshSuggestions = document.getElementById('refreshSuggestions'); |
| | const newMessageBtn = document.getElementById('newMessageBtn'); |
| | const searchBtn = document.getElementById('searchBtn'); |
| | const searchInput = document.getElementById('searchInput'); |
| | const searchTabs = document.querySelectorAll('.search-tab'); |
| | const postsGrid = document.getElementById('postsGrid'); |
| | const peopleResults = document.getElementById('peopleResults'); |
| | const notificationsModal = document.getElementById('notificationsModal'); |
| | const notificationsList = document.getElementById('notificationsList'); |
| | const notificationsClose = document.getElementById('notificationsClose'); |
| | const notificationBadge = document.getElementById('notificationBadge'); |
| | const pushNotification = document.getElementById('pushNotification'); |
| | const pushNotificationAvatar = document.getElementById('pushNotificationAvatar'); |
| | const pushNotificationText = document.getElementById('pushNotificationText'); |
| | const pushNotificationClose = document.getElementById('pushNotificationClose'); |
| | |
| | |
| | function initPage() { |
| | renderFriendRequests(); |
| | renderSuggestedFriends(); |
| | renderMessages(); |
| | renderPosts(); |
| | renderNotifications(); |
| | setupEventListeners(); |
| | updateNotificationBadge(); |
| | |
| | |
| | window.addEventListener('blur', () => { |
| | setTimeout(() => { |
| | if (document.hidden) { |
| | showRandomPushNotification(); |
| | } |
| | }, 3000); |
| | }); |
| | } |
| | |
| | |
| | function setupEventListeners() { |
| | |
| | tabBtns.forEach(btn => { |
| | btn.addEventListener('click', () => { |
| | tabBtns.forEach(b => b.classList.remove('active')); |
| | btn.classList.add('active'); |
| | |
| | tabContents.forEach(content => content.classList.remove('active')); |
| | document.getElementById(`${btn.dataset.tab}-tab`).classList.add('active'); |
| | }); |
| | }); |
| | |
| | |
| | messagesBtn.addEventListener('click', () => { |
| | tabBtns.forEach(b => b.classList.remove('active')); |
| | document.querySelector('.tab-btn[data-tab="messages"]').classList.add('active'); |
| | |
| | tabContents.forEach(content => content.classList.remove('active')); |
| | document.getElementById('messages-tab').classList.add('active'); |
| | }); |
| | |
| | notificationsBtn.addEventListener('click', toggleNotificationsModal); |
| | notificationsBtnMobile.addEventListener('click', toggleNotificationsModal); |
| | |
| | notificationsClose.addEventListener('click', toggleNotificationsModal); |
| | |
| | chatBackBtn.addEventListener('click', closeChat); |
| | |
| | |
| | sendMessageBtn.addEventListener('click', sendMessage); |
| | messageInput.addEventListener('keypress', (e) => { |
| | if (e.key === 'Enter') { |
| | sendMessage(); |
| | } |
| | }); |
| | |
| | |
| | seeAllRequests.addEventListener('click', (e) => { |
| | e.preventDefault(); |
| | alert('عرض جميع طلبات الصداقة'); |
| | }); |
| | |
| | |
| | refreshSuggestions.addEventListener('click', (e) => { |
| | e.preventDefault(); |
| | refreshFriendSuggestions(); |
| | }); |
| | |
| | |
| | newMessageBtn.addEventListener('click', (e) => { |
| | e.preventDefault(); |
| | startNewMessage(); |
| | }); |
| | |
| | |
| | searchBtn.addEventListener('click', () => { |
| | tabBtns.forEach(b => b.classList.remove('active')); |
| | document.querySelector('.tab-btn[data-tab="search"]').classList.add('active'); |
| | |
| | tabContents.forEach(content => content.classList.remove('active')); |
| | document.getElementById('search-tab').classList.add('active'); |
| | }); |
| | |
| | |
| | searchTabs.forEach(tab => { |
| | tab.addEventListener('click', () => { |
| | searchTabs.forEach(t => t.classList.remove('active')); |
| | tab.classList.add('active'); |
| | |
| | if (tab.dataset.searchTab === 'posts') { |
| | postsGrid.style.display = 'grid'; |
| | peopleResults.style.display = 'none'; |
| | } else { |
| | postsGrid.style.display = 'none'; |
| | peopleResults.style.display = 'block'; |
| | renderPeopleSearchResults(); |
| | } |
| | }); |
| | }); |
| | |
| | |
| | searchInput.addEventListener('input', (e) => { |
| | const query = e.target.value.trim(); |
| | if (query.length > 0) { |
| | |
| | console.log('بحث عن:', query); |
| | } |
| | }); |
| | |
| | |
| | pushNotificationClose.addEventListener('click', () => { |
| | pushNotification.classList.remove('show'); |
| | }); |
| | } |
| | |
| | |
| | function renderFriendRequests() { |
| | friendRequestsList.innerHTML = ''; |
| | |
| | if (appData.friendRequests.length === 0) { |
| | friendRequestsList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد طلبات صداقة جديدة</p>'; |
| | return; |
| | } |
| | |
| | appData.friendRequests.forEach(request => { |
| | const requestElement = document.createElement('div'); |
| | requestElement.className = 'friend-request-item'; |
| | requestElement.innerHTML = ` |
| | <img src="${request.avatar}" class="friend-avatar" alt="${request.name}"> |
| | <div class="friend-info"> |
| | <div class="friend-name">${request.name}</div> |
| | <div class="friend-meta">${request.mutualFriends} أصدقاء مشتركين • ${request.date}</div> |
| | </div> |
| | <div class="friend-actions"> |
| | <button class="btn btn-primary" onclick="acceptFriendRequest(${request.id})">قبول</button> |
| | <button class="btn btn-outline" onclick="declineFriendRequest(${request.id})">حذف</button> |
| | </div> |
| | `; |
| | |
| | friendRequestsList.appendChild(requestElement); |
| | }); |
| | } |
| | |
| | |
| | function renderSuggestedFriends() { |
| | suggestionsList.innerHTML = ''; |
| | |
| | appData.suggestedFriends.forEach(friend => { |
| | const friendElement = document.createElement('div'); |
| | friendElement.className = 'suggested-friend-item'; |
| | friendElement.innerHTML = ` |
| | <img src="${friend.avatar}" class="friend-avatar" alt="${friend.name}"> |
| | <div class="friend-info"> |
| | <div class="friend-name">${friend.name}</div> |
| | <div class="friend-meta">${friend.mutualFriends} أصدقاء مشتركين</div> |
| | </div> |
| | <div class="friend-actions"> |
| | <button class="btn btn-primary" onclick="sendFriendRequest(${friend.id})">إرسال طلب</button> |
| | <button class="btn btn-outline" onclick="removeSuggestion(${friend.id})">إزالة</button> |
| | </div> |
| | `; |
| | |
| | suggestionsList.appendChild(friendElement); |
| | }); |
| | } |
| | |
| | |
| | function renderMessages() { |
| | messagesList.innerHTML = ''; |
| | |
| | if (appData.messages.length === 0) { |
| | messagesList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد رسائل</p>'; |
| | return; |
| | } |
| | |
| | appData.messages.forEach(message => { |
| | const messageElement = document.createElement('div'); |
| | messageElement.className = 'message-item'; |
| | messageElement.innerHTML = ` |
| | <img src="${message.user.avatar}" class="message-avatar" alt="${message.user.name}"> |
| | <div class="message-content"> |
| | <div class="message-header"> |
| | <div class="message-sender">${message.user.name}</div> |
| | <div class="message-time">${message.time}</div> |
| | </div> |
| | <div class="message-preview"> |
| | ${message.unread ? '<div class="message-unread"></div>' : ''} |
| | <div class="message-text">${message.lastMessage}</div> |
| | </div> |
| | </div> |
| | `; |
| | |
| | messageElement.addEventListener('click', () => openChat(message.user.id)); |
| | messagesList.appendChild(messageElement); |
| | }); |
| | } |
| | |
| | |
| | function renderPosts() { |
| | postsGrid.innerHTML = ''; |
| | |
| | appData.posts.forEach(post => { |
| | const postElement = document.createElement('div'); |
| | postElement.innerHTML = ` |
| | <img src="${post.thumbnail}" class="post-thumbnail" alt="منشور ${post.id}"> |
| | `; |
| | |
| | postElement.addEventListener('click', () => viewPost(post.id)); |
| | postsGrid.appendChild(postElement); |
| | }); |
| | } |
| | |
| | |
| | function renderPeopleSearchResults() { |
| | peopleResults.innerHTML = ''; |
| | |
| | |
| | appData.suggestedFriends.forEach(friend => { |
| | const friendElement = document.createElement('div'); |
| | friendElement.className = 'suggested-friend-item'; |
| | friendElement.innerHTML = ` |
| | <img src="${friend.avatar}" class="friend-avatar" alt="${friend.name}"> |
| | <div class="friend-info"> |
| | <div class="friend-name">${friend.name}</div> |
| | <div class="friend-meta">${friend.mutualFriends} أصدقاء مشتركين</div> |
| | </div> |
| | <div class="friend-actions"> |
| | <button class="btn btn-primary" onclick="sendFriendRequest(${friend.id})">إرسال طلب</button> |
| | </div> |
| | `; |
| | |
| | peopleResults.appendChild(friendElement); |
| | }); |
| | } |
| | |
| | |
| | function renderNotifications() { |
| | notificationsList.innerHTML = ''; |
| | |
| | if (appData.notifications.length === 0) { |
| | notificationsList.innerHTML = '<p style="text-align: center; color: var(--text-gray); padding: 20px;">لا توجد إشعارات جديدة</p>'; |
| | return; |
| | } |
| | |
| | appData.notifications.forEach(notification => { |
| | const notificationElement = document.createElement('div'); |
| | notificationElement.className = `notification-item ${notification.read ? '' : 'unread'}`; |
| | |
| | let notificationContent = ''; |
| | |
| | if (notification.type === "like") { |
| | notificationContent = ` |
| | <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| | <div class="notification-info"> |
| | <div class="notification-text"> |
| | <span>${notification.user.name}</span> أعجب بمنشورك |
| | </div> |
| | <div class="notification-time">${notification.time}</div> |
| | </div> |
| | <img src="${notification.post.thumbnail}" class="notification-avatar" alt="منشور"> |
| | `; |
| | } else if (notification.type === "comment") { |
| | notificationContent = ` |
| | <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| | <div class="notification-info"> |
| | <div class="notification-text"> |
| | <span>${notification.user.name}</span> علق على منشورك: ${notification.text} |
| | </div> |
| | <div class="notification-time">${notification.time}</div> |
| | </div> |
| | <img src="${notification.post.thumbnail}" class="notification-avatar" alt="منشور"> |
| | `; |
| | } else if (notification.type === "friend_request") { |
| | notificationContent = ` |
| | <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| | <div class="notification-info"> |
| | <div class="notification-text"> |
| | <span>${notification.user.name}</span> أرسل لك طلب صداقة |
| | </div> |
| | <div class="notification-time">${notification.time}</div> |
| | </div> |
| | <div class="notification-actions"> |
| | <button class="btn btn-primary" onclick="acceptFriendRequest(${notification.user.id})">قبول</button> |
| | <button class="btn btn-outline" onclick="declineFriendRequest(${notification.user.id})">حذف</button> |
| | </div> |
| | `; |
| | } else if (notification.type === "follow") { |
| | notificationContent = ` |
| | <img src="${notification.user.avatar}" class="notification-avatar" alt="${notification.user.name}"> |
| | <div class="notification-info"> |
| | <div class="notification-text"> |
| | <span>${notification.user.name}</span> بدأ متابعتك |
| | </div> |
| | <div class="notification-time">${notification.time}</div> |
| | </div> |
| | <div class="notification-actions"> |
| | <button class="btn btn-outline">متابعة</button> |
| | </div> |
| | `; |
| | } |
| | |
| | notificationElement.innerHTML = notificationContent; |
| | notificationElement.addEventListener('click', () => markNotificationAsRead(notification.id)); |
| | notificationsList.appendChild(notificationElement); |
| | }); |
| | } |
| | |
| | |
| | function updateNotificationBadge() { |
| | const unreadCount = appData.notifications.filter(n => !n.read).length; |
| | if (unreadCount > 0) { |
| | notificationBadge.style.display = 'flex'; |
| | notificationBadge.textContent = unreadCount; |
| | } else { |
| | notificationBadge.style.display = 'none'; |
| | } |
| | } |
| | |
| | |
| | function acceptFriendRequest(userId) { |
| | const requestIndex = appData.friendRequests.findIndex(req => req.id === userId); |
| | if (requestIndex !== -1) { |
| | const acceptedUser = appData.friendRequests[requestIndex]; |
| | |
| | |
| | appData.friends.push({ |
| | id: acceptedUser.id, |
| | name: acceptedUser.name, |
| | username: acceptedUser.username, |
| | avatar: acceptedUser.avatar |
| | }); |
| | |
| | |
| | appData.friendRequests.splice(requestIndex, 1); |
| | |
| | |
| | addNotification({ |
| | type: "friend_accepted", |
| | user: acceptedUser, |
| | time: "الآن" |
| | }); |
| | |
| | |
| | showAlert('تم قبول طلب الصداقة بنجاح', 'success'); |
| | |
| | |
| | renderFriendRequests(); |
| | renderNotifications(); |
| | updateNotificationBadge(); |
| | } |
| | } |
| | |
| | |
| | function declineFriendRequest(userId) { |
| | const requestIndex = appData.friendRequests.findIndex(req => req.id === userId); |
| | if (requestIndex !== -1) { |
| | appData.friendRequests.splice(requestIndex, 1); |
| | showAlert('تم حذف طلب الصداقة', 'info'); |
| | renderFriendRequests(); |
| | } |
| | } |
| | |
| | |
| | function sendFriendRequest(userId) { |
| | const friendIndex = appData.suggestedFriends.findIndex(f => f.id === userId); |
| | if (friendIndex !== -1) { |
| | const friend = appData.suggestedFriends[friendIndex]; |
| | showAlert(`تم إرسال طلب صداقة إلى ${friend.name}`, 'success'); |
| | |
| | |
| | addNotification({ |
| | type: "friend_request", |
| | user: appData.currentUser, |
| | time: "الآن" |
| | }); |
| | |
| | |
| | setTimeout(() => { |
| | removeSuggestion(userId); |
| | }, 1000); |
| | } |
| | } |
| | |
| | |
| | function removeSuggestion(userId) { |
| | const friendIndex = appData.suggestedFriends.findIndex(f => f.id === userId); |
| | if (friendIndex !== -1) { |
| | appData.suggestedFriends.splice(friendIndex, 1); |
| | renderSuggestedFriends(); |
| | |
| | |
| | if (peopleResults.style.display !== 'none') { |
| | renderPeopleSearchResults(); |
| | } |
| | } |
| | } |
| | |
| | |
| | function refreshFriendSuggestions() { |
| | |
| | showAlert('تم تحديث اقتراحات الأصدقاء', 'info'); |
| | } |
| | |
| | |
| | function openChat(userId) { |
| | const message = appData.messages.find(m => m.user.id === userId); |
| | if (message) { |
| | |
| | message.unread = false; |
| | |
| | |
| | chatTitle.textContent = message.user.name; |
| | chatBody.innerHTML = ''; |
| | |
| | message.chat.forEach(msg => { |
| | const messageClass = msg.sender === appData.currentUser.id ? 'message-out' : 'message-in'; |
| | const messageElement = document.createElement('div'); |
| | messageElement.className = `message-bubble ${messageClass}`; |
| | messageElement.innerHTML = ` |
| | <div>${msg.text}</div> |
| | <div class="message-time">${msg.time}</div> |
| | `; |
| | chatBody.appendChild(messageElement); |
| | }); |
| | |
| | |
| | chatBody.scrollTop = chatBody.scrollHeight; |
| | |
| | |
| | chatModal.style.display = 'flex'; |
| | document.body.style.overflow = 'hidden'; |
| | |
| | |
| | sendMessageBtn.dataset.userId = userId; |
| | } |
| | } |
| | |
| | |
| | function closeChat() { |
| | chatModal.style.display = 'none'; |
| | document.body.style.overflow = 'auto'; |
| | |
| | |
| | renderMessages(); |
| | } |
| | |
| | |
| | function sendMessage() { |
| | const text = messageInput.value.trim(); |
| | if (text && sendMessageBtn.dataset.userId) { |
| | const userId = parseInt(sendMessageBtn.dataset.userId); |
| | const message = appData.messages.find(m => m.user.id === userId); |
| | |
| | if (message) { |
| | |
| | const newMessage = { |
| | id: message.chat.length + 1, |
| | sender: appData.currentUser.id, |
| | text: text, |
| | time: getCurrentTime() |
| | }; |
| | |
| | |
| | message.chat.push(newMessage); |
| | |
| | |
| | message.lastMessage = text; |
| | message.time = 'الآن'; |
| | message.unread = false; |
| | |
| | |
| | const messageElement = document.createElement('div'); |
| | messageElement.className = 'message-bubble message-out'; |
| | messageElement.innerHTML = ` |
| | <div>${text}</div> |
| | <div class="message-time">${newMessage.time}</div> |
| | `; |
| | chatBody.appendChild(messageElement); |
| | |
| | |
| | messageInput.value = ''; |
| | |
| | |
| | chatBody.scrollTop = chatBody.scrollHeight; |
| | |
| | |
| | |
| | setTimeout(() => { |
| | const replyMessage = { |
| | id: message.chat.length + 1, |
| | sender: userId, |
| | text: getRandomReply(), |
| | time: getCurrentTime() |
| | }; |
| | |
| | message.chat.push(replyMessage); |
| | message.lastMessage = replyMessage.text; |
| | |
| | if (!chatModal.style.display || chatModal.style.display === 'none') { |
| | message.unread = true; |
| | |
| | |
| | addNotification({ |
| | type: "message", |
| | user: message.user, |
| | time: "الآن" |
| | }); |
| | } else { |
| | const replyElement = document.createElement('div'); |
| | replyElement.className = 'message-bubble message-in'; |
| | replyElement.innerHTML = ` |
| | <div>${replyMessage.text}</div> |
| | <div class="message-time">${replyMessage.time}</div> |
| | `; |
| | chatBody.appendChild(replyElement); |
| | chatBody.scrollTop = chatBody.scrollHeight; |
| | } |
| | |
| | renderMessages(); |
| | updateNotificationBadge(); |
| | }, 2000); |
| | } |
| | } |
| | } |
| | |
| | |
| | function startNewMessage() { |
| | |
| | const randomFriend = appData.suggestedFriends[Math.floor(Math.random() * appData.suggestedFriends.length)]; |
| | |
| | if (randomFriend) { |
| | |
| | const newChat = { |
| | id: randomFriend.id, |
| | user: { |
| | id: randomFriend.id, |
| | name: randomFriend.name, |
| | username: randomFriend.username, |
| | avatar: randomFriend.avatar |
| | }, |
| | lastMessage: "بدأت محادثة جديدة", |
| | time: "الآن", |
| | unread: false, |
| | chat: [] |
| | }; |
| | |
| | appData.messages.unshift(newChat); |
| | renderMessages(); |
| | openChat(randomFriend.id); |
| | } else { |
| | showAlert('لا يوجد أصدقاء متاحين لبدء محادثة جديدة', 'error'); |
| | } |
| | } |
| | |
| | |
| | function viewPost(postId) { |
| | const post = appData.posts.find(p => p.id === postId); |
| | if (post) { |
| | alert(`عرض المنشور ${postId}: ${post.caption}\nالإعجابات: ${post.likes} | التعليقات: ${post.comments}`); |
| | } |
| | } |
| | |
| | |
| | function toggleNotificationsModal() { |
| | if (notificationsModal.style.display === 'block') { |
| | notificationsModal.style.display = 'none'; |
| | } else { |
| | notificationsModal.style.display = 'block'; |
| | |
| | |
| | appData.notifications.forEach(notification => { |
| | notification.read = true; |
| | }); |
| | |
| | updateNotificationBadge(); |
| | renderNotifications(); |
| | } |
| | } |
| | |
| | |
| | function markNotificationAsRead(notificationId) { |
| | const notification = appData.notifications.find(n => n.id === notificationId); |
| | if (notification && !notification.read) { |
| | notification.read = true; |
| | updateNotificationBadge(); |
| | renderNotifications(); |
| | } |
| | } |
| | |
| | |
| | function addNotification(notificationData) { |
| | const newNotification = { |
| | id: appData.notifications.length + 1, |
| | read: false, |
| | ...notificationData |
| | }; |
| | |
| | appData.notifications.unshift(newNotification); |
| | |
| | |
| | if (notificationsModal.style.display !== 'block') { |
| | showPushNotification(newNotification); |
| | } |
| | |
| | updateNotificationBadge(); |
| | } |
| | |
| | |
| | function showPushNotification(notification) { |
| | pushNotificationAvatar.src = notification.user.avatar; |
| | |
| | let notificationText = ''; |
| | if (notification.type === "like") { |
| | notificationText = `${notification.user.name} أعجب بمنشورك`; |
| | } else if (notification.type === "comment") { |
| | notificationText = `${notification.user.name} علق على منشورك`; |
| | } else if (notification.type === "friend_request") { |
| | notificationText = `${notification.user.name} أرسل لك طلب صداقة`; |
| | } else if (notification.type === "friend_accepted") { |
| | notificationText = `${notification.user.name} قبل طلب صداقتك`; |
| | } else if (notification.type === "message") { |
| | notificationText = `${notification.user.name} أرسل لك رسالة`; |
| | } else if (notification.type === "follow") { |
| | notificationText = `${notification.user.name} بدأ متابعتك`; |
| | } |
| | |
| | pushNotificationText.textContent = notificationText; |
| | pushNotification.classList.add('show'); |
| | |
| | |
| | setTimeout(() => { |
| | pushNotification.classList.remove('show'); |
| | }, 5000); |
| | } |
| | |
| | |
| | function showRandomPushNotification() { |
| | const types = ["like", "comment", "friend_request", "message", "follow"]; |
| | const randomType = types[Math.floor(Math.random() * types.length)]; |
| | const randomUser = appData.suggestedFriends[Math.floor(Math.random() * appData.suggestedFriends.length)]; |
| | |
| | if (randomUser) { |
| | const notification = { |
| | id: appData.notifications.length + 1, |
| | type: randomType, |
| | user: randomUser, |
| | time: "الآن", |
| | read: false |
| | }; |
| | |
| | if (randomType === "like" || randomType === "comment") { |
| | notification.post = { |
| | id: Math.floor(Math.random() * 1000), |
| | thumbnail: `https://picsum.photos/id/${Math.floor(Math.random() * 1000)}/300/300` |
| | }; |
| | } |
| | |
| | addNotification(notification); |
| | } |
| | } |
| | |
| | |
| | </html> |