/* Aljaweea — footer "Cookie Preferences" link opens the Complianz banner.
* Original by Digency (19 Aug 2026); amended 8 Sep 2026, runbook 5.14:
* - e.preventDefault() so the href="#" no longer scrolls the page to the top;
* - calls Complianz's own cmplz_set_banner_status('show') and falls back to
* clicking the (hidden) Manage-consent button if that function is absent.
* Rollback: restore the original 12-line version recorded in the runbook. */
document.addEventListener('click', function (e) {
var link = e.target.closest('.cmplz-show-banner');
if (!link) { return; }
e.preventDefault();
if (typeof cmplz_set_banner_status === 'function') {
cmplz_set_banner_status('show');
} else {
document.querySelectorAll('.cmplz-manage-consent').forEach(function (btn) { btn.click(); });
}
});
يعد تطبيق إير لوم Air Loom إضافة جديدة مبتكرة في عالم تطبيقات تتبع الرحلات الجوية المجانية في الوقت الفعلي، حيث يقدم لعشاق الطيران تجربة أكثر تطورًا وجاذبية من أي وقت مضى. إنه الجيل القادم من تتبع الرحلات الجوية ثلاثي الأبعاد، حيث أنه يستعد لمنافسة المتتبعين التقليديين مثل FlightRadar24 و FlightAware.
وبدأ هذا المشروع كهواية قبل عدة أشهر عندما قرر الطيار الأمريكي الخاص وعاشق الطيران بن ليمْنِر بناء تطبيق مجاني لتتبع الرحلات الجوية.
وبعد أن أدرك أن تطبيقات الطيران الحالية لا تستطيع حقًا التقاط “سحر” المسار ثلاثي الأبعاد للطائرة، أعلن بن عن التطبيق في منشور على منصة رديت Reddit (وهي منصة أمريكية لجمع الأخبار الاجتماعية وتقييم المحتوى حيث يمكن للمستخدمين المسجلين نشر الروابط والنصوص والصور والفيديوهات)، وقد ناقشه الكثير في مجتمعات Reddit مثل r/flying و r/ADSB.
وكتب بن عند الاعلان على التطبيق في المنصة “كنت أرغب في رؤية كل حركة المرور الجوية من حولي بشكل ثلاثي الأبعاد. كنت فضوليًا جدًا لمعرفة كيف يبدو النمط المحلي لدي، ومدى ازدحام المجال الجوي، لذلك ذهبت بعيدًا وصنعت هذه اللعبة التي أسميتها اير لوم Air Loom”.
وأشار بن إلى أنه من خلال هذا التطبيق، يمكن للمستخدمين مشاهدة حركة المرور الجوية الحية عبر تصورات تفاعلية ثلاثية الأبعاد ديناميكية، مضيفا أن تراكم الأنماط مع مرور الوقت يجعل مشاهد المدن تبدو مذهلة بشكل خاص. كما يمكن للمستخدمين تصفية العرض لتتبع تحركات أساطيلهم المفضلة عبر القارات.
وأوضح أن جميع البيانات تأتي من مصادر ADS-B مجانية، داعيا المستخدمين إلى المساهمة والمساعدة في إثراء التجربة للجميع. ووفقًا لحسابه على منصة اكس ( x.com/benlimner) ، فقد جذب التطبيق 117,000 مستخدم خلال 90 يوما.
وفي رسالة موجهة إلى منصة “Aljaweea”، قال بن “عندما بدأت هذا المشروع كهواية، لم أتخيل أبدًا أن يكون الرد بهذا الحجم”، مضيفًا “كان حجم الاهتمام مذهلًا”، معبرا عن شكره لموقع Airplanes.live لتوفيره البيانات الأولية التي شغلت هذه المنصة. قائلا إن القائمين عليه “يقدمون خدمة رائعة لعشاق الطيران”. وكشف أنه يعمل على تأمين مزود بيانات تجاري موثوق لهذا المشروع.
يشار إلى أن هناك العديد من تطبيقات تتبع الرحلات الجوية التي توفر تحديثات أسرع وأكثر دقة من القنوات الرسمية بشأن تحركات ومواقع الطائرات، وهو ما يمكن أن يكون ذا قيمة في جهود الإنقاذ في حال وقوع حادث. فما الذي يجعل هذه الأداة الجديدة مميزة؟
Sharm El Sheikh International Airport – Air Loom 3D Flight Tracking / Credit: Ben Limner – Objective Unclear / Licence: Copyrighted (Fair Use) (Modified)
نماذج قابلة للدوران وتضاريس ديناميكية
يوفر تطبيق اير لوم تجربة ثلاثي الأبعاد شاملة لحركة المرور الجوية العالمية، ويعرض رؤى تتجاوز الخرائط ثنائية الأبعاد التقليدية التي اعتدنا رؤيتها. وتتيح هذه الخدمة استكشاف تضاريس ثلاثية الأبعاد يمكن عرضها كشبكة أو صور أقمار صناعية مع نماذج طائرات ثلاثية الأبعاد كاملة وقابلة للدوران والإمالة، وبالتالي يمكن للمستخدمين مراقبة معايير الرحلة في الوقت الفعلي مثل الارتفاع والاتجاه وأنماط الانتظار من أي زاوية.
تبسيط المجال الجوي المعقد
بشكل فريد، تدمج خدمة “إير لوم” ميزة عرض المجال الجوي لمطارات الولايات المتحدة، حيث تُصوَّر مجالات بي وسي ودي الخاضعة للرقابة على شكل أسطوانات شفافة، لتجسد الشكل الهيكلي لبعض أنواع المجالات الجوية المعقدة المعروفة بـ”كعكة الزفاف المقلوبة” أو الهيكل الطبقي المتدرج أو الهيكل المتدرج للمجال الجوي (أي تصميم المجال الجوي للفئة بي وأحيانا سي بالولايات المتحدة الذي يتوسع كلما ارتفعنا)، ويتيح هذا العرض الثلاثي الأبعاد في الوقت الفعلي للمستخدمين فهم تعقيدات الملاحة الجوية وتفاعل الطائرات داخل هذه المناطق المنظمة بدقة، وهو ما يصعب فهمه عادةً من خلال الخرائط الملاحية التقليدية المسطحة.
كيف تؤثر اير لوم على التدريب الجوي؟
لا تقتصر منصة اير لوم على التصورات البصرية المتقدمة، بل تمثل أيضًا أداة تعليمية استثنائية، خاصة لتدريب الطيارين ومراقبي الحركة الجوية، حيث تتيح قاعدة بياناتها، التي تضم أكثر من 60,000 مطار حول العالم، للمتدربين إمكانية تصور العمليات في أي مدرج تقريبًا. وتُعد ميزة تسجيل وتشغيل المسارات أداة لا غنى عنها لإجراء مراجعات دقيقة بعد الرحلات ودراسة تدفق الحركة الجوية المعقدة. وقد لاقت المنصة ترحيبًا واسعًا من المراقبين الدوليين، الذين وصفوها بأنها “ثورة في تعليم المجال الجوي”، لما توفره من قدرة على توضيح الممرات غير المرئية والمناطق المحظورة، وايضاح منطق تنظيم المسارات والارتفاعات.
Reno-Tahoe International Airport – Air Loom 3D Flight Tracking / Credit: Ben Limner – Objective Unclear / Licence: Copyrighted (Fair Use) (Modified)
من الرؤية إلى أداة حيوية: الخطوات القادمة
تُعد هذه القدرات المتقدمة في التصور ضرورية لمناطق مثل الشرق الأوسط، التي تُعد مركزًا عالميًا للطيران يتطلب أعلى مستويات التدريب والتطوير التقني. ومع ذلك، يجدر التنويه إلى أن المشروع لا يزال حديث العهد، إذ أُطلق عبر الإنترنت في سبتمبر 2025، وأي استخدام جاد له في التعليم أو صناعة الطيران يتطلب المزيد من التطوير مستقبلا.
بيانات الشرق الأوسط وشمال إفريقيا: دعوة للمساهمة
يرحب بن ليمْنِر (اسم المستخدم على اكس ورديت Reddit u/NoCompetition2044) (x.com/benlimner) على الدوام باقتراحات المستخدمين لتحسين الموقع، وتطوير المشروع، ومشاركة التحديثات المتكررة، حيث أنه يطلب باستمرار آراء مجتمع الطيران فيه. وبينما تم تضمين جميع المطارات العالمية الكبرى، لا تتوفر حاليًا بيانات المجال الجوي لمطارات الشرق الأوسط، ولكنها ستُضاف عند توفرها. ويمكن للمهنيين والهواة في الشرق الأوسط المساهمة في تطوير الموقع من خلال التواصل مع مؤسسه على رديت مباشرة.
ابقوا على اطلاع دائم. احصلوا على أحدث أخبار الطيران والفضاء في العالم العربي لحظة نشرها عبر واتساب وتيليغرام، أو اشتركوا بنشرتنا البريدية لتصلكم نشرة أسبوعية. كما يمكنكم إضافتنا إلى مصادركم المفضلة لتظهر لكم أخبارنا بشكل أوسع في بحث Google.
نستخدم ملفات تعريف الارتباط لتشغيل هذا الموقع، وقياس القراءة، وعرض الإعلانات التي تموّل عملنا الصحافي. في منطقتكم تبقى ملفات تعريف الارتباط غير الضرورية معطّلة حتى تقبلوها. يمكنكم قبولها كلها أو رفضها كلها أو الاختيار بحسب الفئة، وتغيير خياركم في أي وقت عبر رابط “تفضيلات ملفات تعريف الارتباط” في أسفل كل صفحة.
وظيفية دائما مفعلة
ضرورية لعمل الموقع: لغة التصفح، وخياركم بشأن ملفات تعريف الارتباط، وحماية النماذج، وجلسة ووردبريس. مفعّلة دائماً.
تفضيلات
تحفظ الإعدادات التي اخترتموها حتى لا تحتاجوا إلى ضبطها مجدداً في زيارتكم التالية.
إحصائيات
Google Analytics لمعرفة المقالات الأكثر قراءة، ومن أي بلد، وعلى أي أجهزة. تُختصر عناوين IP قبل تخزينها.التخزين أو الوصول الفني الذي يُستخدم حصرياً لأغراض إحصائية مجهولة المصدر. وبدون أمر استدعاء أو امتثال طوعي من جانب مزود خدمة الإنترنت الخاص بك أو سجلات إضافية من طرف ثالث، لا يمكن عادةً استخدام المعلومات المخزنة أو المستردة لهذا الغرض وحده لتحديد هويتك.
تسويق
الإعلانات التي تعرضها Google AdSense، ومقاطع الفيديو المضمّنة وأزرار وسائل التواصل الاجتماعي، وبكسلات القياس لمنشوراتنا على المنصات الاجتماعية.
نستخدم ملفات تعريف الارتباط لتشغيل هذا الموقع، وقياس القراءة، وعرض الإعلانات التي تموّل عملنا الصحافي. وهي مفعّلة ما لم ترفضوها هنا. يمكنكم تغيير خياركم في أي وقت عبر رابط “تفضيلات ملفات تعريف الارتباط” في أسفل كل صفحة.
وظيفية دائما مفعلة
ضرورية لعمل الموقع: لغة التصفح، وخياركم بشأن ملفات تعريف الارتباط، وحماية النماذج، وجلسة ووردبريس. مفعّلة دائماً.
تفضيلات
تحفظ الإعدادات التي اخترتموها حتى لا تحتاجوا إلى ضبطها مجدداً في زيارتكم التالية.
إحصائيات
Google Analytics لمعرفة المقالات الأكثر قراءة، ومن أي بلد، وعلى أي أجهزة. تُختصر عناوين IP قبل تخزينها.التخزين أو الوصول الفني الذي يُستخدم حصرياً لأغراض إحصائية مجهولة المصدر. وبدون أمر استدعاء أو امتثال طوعي من جانب مزود خدمة الإنترنت الخاص بك أو سجلات إضافية من طرف ثالث، لا يمكن عادةً استخدام المعلومات المخزنة أو المستردة لهذا الغرض وحده لتحديد هويتك.
تسويق
الإعلانات التي تعرضها Google AdSense، ومقاطع الفيديو المضمّنة وأزرار وسائل التواصل الاجتماعي، وبكسلات القياس لمنشوراتنا على المنصات الاجتماعية.
var molongui_authorship_byline_params = {"byline_modifiers_enabled":"","byline_prefix":"","byline_suffix":"","byline_separator":",\u00a0","byline_last_separator":"\u00a0and\u00a0","byline_link_title":"View all posts by","byline_link_class":"","byline_dom_tree":"","byline_dom_prepend":"","byline_dom_append":"","byline_decoder":"v3","byline_data_url":"https://aljaweea.com/ar/wp-json/molongui-authorship/v1/bylines","byline_rest_nonce":""};
//# sourceURL=molongui-authorship-byline-js-extra
let cmplzBlockedContent = document.querySelector('.cmplz-blocked-content-notice');
if ( cmplzBlockedContent) {
cmplzBlockedContent.addEventListener('click', function(event) {
event.stopPropagation();
});
}
//# sourceURL=cmplz-cookiebanner-js-after
/* Accessibility quick fixes (WCAG 2.2 AA test, 27 Oct 2026). Safe to switch off.
1 skip link · 2 form autofill · 3 language switcher name · 4 dark-mode button name and state
5 mobile menu state and focus · 6 heading levels for screen readers · 7 author photos
8 form errors linked to fields · 9 "opens in a new tab" for screen readers · 10 main content area */
(function () {
var isAr = (document.documentElement.lang || '').toLowerCase().indexOf('ar') === 0;
var T = isAr
? { skip: 'تخطَّ إلى المحتوى الرئيسي', dark: 'الوضع المظلم', newTab: ' (يُفتح في علامة تبويب جديدة)' }
: { skip: 'Skip to main content', dark: 'Dark mode', newTab: ' (opens in a new tab)' };function visible(el) {
if (!el) { return false; }
var r = el.getBoundingClientRect(), s = getComputedStyle(el);
return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && s.display !== 'none' && r.right > 0 && r.left < window.innerWidth;
}function run() {
/* 1. Skip link (WCAG 2.4.1): jumps to the first block after the site header */
var header = document.getElementById('theme-header');
var target = header ? header.nextElementSibling : null;
while (target && (target.tagName === 'SCRIPT' || target.tagName === 'STYLE')) { target = target.nextElementSibling; }
if (target && !document.querySelector('.aj-skip-link')) {
if (!target.id) { target.id = 'aj-main'; }
if (!target.hasAttribute('tabindex')) { target.setAttribute('tabindex', '-1'); }
var a = document.createElement('a');
a.className = 'aj-skip-link';
a.href = '#' + target.id;
a.textContent = T.skip;
a.addEventListener('click', function () { setTimeout(function () { target.focus({ preventScroll: true }); }, 0); });
document.body.insertBefore(a, document.body.firstChild);
}/* 10. Main content area (WCAG 1.3.1): pages with none (the home pages) get one */
if (target && !document.querySelector('main, [role="main"]') && !target.querySelector('footer, #footer')) {
target.setAttribute('role', 'main');
}/* 2. Form autofill (WCAG 1.3.5) */
var inputs = document.querySelectorAll('form input');
for (var i = 0; i < inputs.length; i++) {
var el = inputs[i];
if (el.getAttribute('autocomplete')) { continue; }
var n = (el.name || '').toLowerCase();
var l = ((el.labels && el.labels[0] && el.labels[0].textContent) || el.getAttribute('aria-label') || el.placeholder || '').toLowerCase().trim();
var v = null;
if (el.type === 'email') { v = 'email'; }
else if (el.type === 'tel' || (/phone|هاتف|جوال/.test(l) && !/mail|بريد/.test(l))) { v = 'tel'; }
else if (/first_name/.test(n)) { v = 'given-name'; }
else if (/last_name/.test(n)) { v = 'family-name'; }
else if (el.type === 'text' && /^(name|full name|الاسم|الإسم)\b/.test(l)) { v = 'name'; }
else if (el.type === 'url') { v = 'url'; }
if (v) { el.setAttribute('autocomplete', v); }
}/* 3. Language switcher (WCAG 2.4.4, 3.1.2): name the target language in that language */
var sw = document.querySelectorAll('a.lang-toggle');
for (var s = 0; s < sw.length; s++) {
var toAr = /\/ar(\/|$)/.test(sw[s].getAttribute('href') || '');
var name = toAr ? 'العربية' : 'English';
sw[s].setAttribute('aria-label', name);
sw[s].setAttribute('title', name);
sw[s].setAttribute('lang', toAr ? 'ar' : 'en');
sw[s].setAttribute('hreflang', toAr ? 'ar' : 'en');
var ims = sw[s].querySelectorAll('img');
for (var k = 0; k < ims.length; k++) { ims[k].setAttribute('alt', ''); }
}/* 4. Dark-mode button (WCAG 4.1.2): clear name, behaves as a toggle button that reports on/off */
var skins = document.querySelectorAll('a.change-skin');
function isDark() { return document.documentElement.classList.contains('dark-skin'); }
function syncSkin() { for (var q = 0; q < skins.length; q++) { skins[q].setAttribute('aria-pressed', isDark() ? 'true' : 'false'); } }
for (var d = 0; d < skins.length; d++) {
skins[d].setAttribute('role', 'button');
skins[d].setAttribute('aria-label', T.dark);
skins[d].setAttribute('title', T.dark);
skins[d].addEventListener('click', function () { setTimeout(syncSkin, 300); });
skins[d].addEventListener('keydown', function (e) { if (e.key === ' ') { e.preventDefault(); this.click(); } });
}
syncSkin();/* 5. Mobile menu (WCAG 4.1.2, 2.4.3): report open/closed, move focus in on open and back on close */
var btn = document.getElementById('mobile-menu-icon');
var panel = document.querySelector('.side-aside');
if (btn && panel) {
btn.setAttribute('role', 'button');
btn.setAttribute('aria-expanded', 'false');
if (!panel.id) { panel.id = 'aj-mobile-menu'; }
btn.setAttribute('aria-controls', panel.id);
var check = function (moveFocus) {
setTimeout(function () {
var open = visible(panel);
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
if (open && moveFocus) {
var first = panel.querySelector('a[href]:not(.close-side-aside), button');
if (first) { first.focus(); }
}
if (!open && moveFocus === 'back') { btn.focus(); }
}, 450);
};
btn.addEventListener('click', function () { check(true); });
var closers = panel.querySelectorAll('.close-side-aside');
for (var c = 0; c < closers.length; c++) { closers[c].addEventListener('click', function () { check('back'); }); }
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && btn.getAttribute('aria-expanded') === 'true') {
setTimeout(function () {
/* the theme closes the menu on Escape in English but not in Arabic */
var x = panel.querySelector('.close-side-aside');
if (visible(panel) && x) { x.click(); }
check('back');
}, 150);
}
});
}/* 6. Heading levels (WCAG 1.3.1): no jumps for screen readers; looks unchanged */
var hs = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
var prev = 0, hasH1 = !!document.querySelector('h1');
for (var h = 0; h < hs.length; h++) {
if (!visible(hs[h]) && !hs[h].closest('.side-aside')) { continue; }
var lvl = parseInt(hs[h].tagName.charAt(1), 10);
var eff = lvl;
if (!hasH1 && prev === 0) { eff = 1; }
else if (prev && lvl > prev + 1) { eff = prev + 1; }
if (eff !== lvl) { hs[h].setAttribute('aria-level', String(eff)); }
prev = eff;
}/* 7. Author photos: describe a linked photo by the author's name (it is the link's name); otherwise decorative */
var boxes = document.querySelectorAll('.about-author, .author-box, .m-a-box, .molongui-author-box');
for (var b = 0; b < boxes.length; b++) {
var pics = boxes[b].querySelectorAll('img');
for (var p = 0; p < pics.length; p++) {
var lk = pics[p].closest('a[href]');
var who = '';
if (lk) {
var byline = document.querySelector('a.author-name[href="' + lk.getAttribute('href') + '"]');
var strong = boxes[b].querySelector('.m-a-box-bio strong, [itemprop="name"]');
who = ((byline && byline.textContent) || (strong && strong.textContent) || '').trim();
}
if (lk && !who) { continue; } /* name not found: keep the existing description so the link keeps a name */
pics[p].setAttribute('alt', who);
}
}/* 9. "Opens in a new tab" for screen-reader users (W3C technique G201) */
var blanks = document.querySelectorAll('a[target="_blank"]');
for (var t = 0; t < blanks.length; t++) {
if (blanks[t].querySelector('.aj-newtab')) { continue; }
var sr = document.createElement('span');
sr.className = 'screen-reader-text aj-newtab';
sr.textContent = T.newTab;
blanks[t].appendChild(sr);
if (blanks[t].hasAttribute('aria-label')) { blanks[t].setAttribute('aria-label', blanks[t].getAttribute('aria-label') + T.newTab); }
}
}/* 8. Form errors (WCAG 3.3.1): link each error message to its field when it appears */
function linkErrors(root) {
var errs = (root || document).querySelectorAll('.ff-el-group .error, .ff-el-group .text-danger');
for (var e = 0; e < errs.length; e++) {
var grp = errs[e].closest('.ff-el-group');
var field = grp ? grp.querySelector('input:not([type=hidden]), select, textarea') : null;
if (!field) { continue; }
if (!errs[e].id) { errs[e].id = 'aj-err-' + Math.random().toString(36).slice(2, 9); }
var ids = (field.getAttribute('aria-describedby') || '').split(' ').filter(Boolean);
if (ids.indexOf(errs[e].id) === -1) { ids.push(errs[e].id); field.setAttribute('aria-describedby', ids.join(' ')); }
}
}
function watchForms() {
var forms = document.querySelectorAll('form.frm-fluent-form');
if (!window.MutationObserver) { return; }
for (var f = 0; f < forms.length; f++) {
new MutationObserver(function () { linkErrors(); }).observe(forms[f], { childList: true, subtree: true });
}
}function start() { run(); watchForms(); }
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start); } else { start(); }
})();
/* Aljaweea newsletter form (form 10): on Arabic pages, pre-select the Arabic edition.
2 Nov 2026 (Claude, runbook 8.82). Decision D-05 asks for the page language to be pre-selected through
the WPML translation of the field's default value; WPML does not offer that value for translation,
so this is the flagged fallback. The stored values stay "English" / "العربية" for the FluentCRM tag routing.
Rollback: set this snippet to Draft (the Arabic page then pre-selects English). */
(function () {
function run() {
if (!/^ar/i.test(document.documentElement.lang || '')) { return; }
var radios = document.querySelectorAll('form.fluent_form_10 input[type="radio"][name="dropdown"]');
for (var i = 0; i < radios.length; i++) {
if (radios[i].value === 'العربية') { radios[i].checked = true; radios[i].dispatchEvent(new Event('change', { bubbles: true })); }
}
}
/* Runs whether or not the page has finished loading (Breeze may delay scripts). */
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', run); } else { run(); }
})();
/* Aljaweea forms: let Fluent Forms show its own error messages.
2 Nov 2026 (Claude, runbook 8.86; finding V-1 of the 8.85 test). Without this, the browser's own email check
stops the form when an address has no "@" and shows the browser's pop-up in the browser's language (English on
Arabic pages for most visitors), so our message from the forms standard (1.4) never appears.
"novalidate" switches off only the browser's own check: Fluent Forms still checks every field in the browser
and again on the server, so a badly formed address is still refused - now with our wording, in the page language.
Rollback: set this snippet to Draft. */
(function () {
function run() {
var forms = document.querySelectorAll('form.frm-fluent-form');
for (var i = 0; i < forms.length; i++) { forms[i].setAttribute('novalidate', 'novalidate'); }
}
/* Runs whether or not the page has finished loading (Breeze may delay scripts). */
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', run); } else { run(); }
})();
ai_front = {"insertion_before":"BEFORE","insertion_after":"AFTER","insertion_prepend":"PREPEND CONTENT","insertion_append":"APPEND CONTENT","insertion_replace_content":"REPLACE CONTENT","insertion_replace_element":"REPLACE ELEMENT","visible":"VISIBLE","hidden":"HIDDEN","fallback":"FALLBACK","automatically_placed":"Automatically placed by AdSense Auto ads code","cancel":"Cancel","use":"Use","add":"Add","parent":"Parent","cancel_element_selection":"Cancel element selection","select_parent_element":"Select parent element","css_selector":"CSS selector","use_current_selector":"Use current selector","element":"ELEMENT","path":"PATH","selector":"SELECTOR"};