PageSourceSearch

https://www.webydo.com/webydo-a11y.js

js webydo.com collected 2026-10-02 03:06:18 UTC 202,886 bytes, 2,244 lines download raw bytes

1(function() {
2      'use strict';
3
4      // Prevent double initialization
5      if (window.a11yToolbarInitialized) {
6        console.log('⚠️ Accessibility toolbar already initialized globally, skipping');
7        return;
8      }
9      window.a11yToolbarInitialized = true;
10      
11      console.log('🚀 Accessibility script starting execution...');
12
13      // Language Detection and Translations
14      function detectLanguage() {
15        // Languages baked for this site beyond en/he (see lib/accessibility/i18n.ts).
16        const extraLangs = ["ar","es","fr","de","pt","it","ru","zh","ja","hi","nl"];
17        const explicitExtra = document.documentElement.getAttribute('data-a11y-language');
18        if (explicitExtra && extraLangs.includes(explicitExtra)) return explicitExtra;
19        const htmlExtra = (document.documentElement.lang || '').toLowerCase().split('-')[0];
20        if (htmlExtra && extraLangs.includes(htmlExtra)) return htmlExtra;
21        // Priority 0: Explicit accessibility language setting from site settings
22        const explicitA11yLanguage = document.documentElement.getAttribute('data-a11y-language');
23        if (explicitA11yLanguage === 'he' || explicitA11yLanguage === 'en') {
24          console.log('🌐 Language detected from accessibility setting:', explicitA11yLanguage);
25          return explicitA11yLanguage;
26        }
27
28        // Priority 1: Check HTML lang attribute (HIGHEST priority - page-specific, always wins)
29        const htmlLang = document.documentElement.lang || document.documentElement.getAttribute('lang');
30        if (htmlLang) {
31          const langCode = htmlLang.toLowerCase().split('-')[0];
32          if (langCode === 'he') {
33            console.log('🌐 Language detected from HTML lang attribute: Hebrew');
34            return 'he';
35          } else if (langCode === 'en') {
36            // Explicitly return English if HTML lang is 'en' (don't check browser)
37            console.log('🌐 Language detected from HTML lang attribute: English');
38            return 'en';
39          }
40        }
41        
42        // Priority 2: Check meta tags
43        const metaLang = document.querySelector('meta[http-equiv="content-language"]');
44        if (metaLang) {
45          const langCode = metaLang.content.toLowerCase().split('-')[0];
46          if (langCode === 'he') {
47            console.log('🌐 Language detected from meta tag: Hebrew');
48            return 'he';
49          } else if (langCode === 'en') {
50            console.log('🌐 Language detected from meta tag: English');
51            return 'en';
52          }
53        }
54        
55        // Priority 3: Check browser/system language (only if HTML lang is not set)
56        if (typeof navigator !== 'undefined' && navigator.language) {
57          const browserLang = navigator.language.toLowerCase().split('-')[0];
58          if (browserLang === 'he') {
59            console.log('🌐 Language detected from browser/system: Hebrew');
60            return 'he';
61          }
62          
63          // Also check navigator.languages (array of preferred languages)
64          if (navigator.languages && Array.isArray(navigator.languages)) {
65            for (const lang of navigator.languages) {
66              const langCode = lang.toLowerCase().split('-')[0];
67              if (langCode === 'he') {
68                console.log('🌐 Language detected from browser languages array: Hebrew');
69                return 'he';
70              }
71            }
72          }
73        }
74        
75        // Default to English
76        console.log('🌐 Language defaulting to: English');
77        return 'en';
78      }
79
80      // Language will be detected after DOM is ready to ensure HTML lang attribute is accessible
81      let currentLang = 'en'; // Default, will be updated in initAccessibility
82
83      // Translation objects
84      const translations = {
85        en: {
86          skipToMain: 'Skip to main content',
87          accessibility: 'Accessibility',
88          closeToolbar: 'Close accessibility toolbar',
89          toggleToolbar: 'Toggle accessibility toolbar',
90          textSize: 'Text Size',
91          increaseText: 'Increase Text',
92          increaseTextAria: 'Increase text size',
93          decreaseText: 'Decrease Text',
94          decreaseTextAria: 'Decrease text size',
95          contrastColors: 'Contrast & Colors',
96          highContrast: 'High Contrast',
97          highContrastAria: 'Toggle high contrast mode',
98          negativeContrast: 'Negative Contrast',
99          negativeContrastAria: 'Toggle negative contrast',
100          grayscale: 'Grayscale',
101          grayscaleAria: 'Toggle grayscale mode',
102          readableFont: 'Readable Font',
103          readableFontAria: 'Use readable font',
104          highlighting: 'Highlighting',
105          highlightLinks: 'Highlight Links',
106          highlightLinksAria: 'Highlight links',
107          highlightTitles: 'Highlight Titles',
108          highlightTitlesAria: 'Highlight headings',
109          readingAids: 'Reading Aids',
110          readingGuide: 'Reading Guide',
111          readingGuideAria: 'Toggle reading guide',
112          readingMask: 'Reading Mask',
113          readingMaskAria: 'Toggle reading mask',
114          textSpacing: 'Text Spacing',
115          textSpacingAria: 'Increase text spacing',
116          navigationInteraction: 'Navigation & Interaction',
117          keyboardNav: 'Keyboard Nav',
118          keyboardNavAria: 'Enhanced keyboard navigation',
119          bigCursor: 'Big Cursor',
120          bigCursorAria: 'Big cursor',
121          stopAnimations: 'Stop Animations',
122          stopAnimationsAria: 'Stop animations',
123          resetAll: 'Reset All Settings',
124          resetAllAria: 'Reset all accessibility settings',
125          accessibilityStatement: 'Accessibility Statement',
126          viewStatementAria: 'View accessibility statement',
127          resetNotification: 'All accessibility settings have been reset.',
128          toolbarAvailable: 'Accessibility toolbar available. Press Alt+A to open.',
129          accessibilityControls: 'Accessibility controls',
130          statementTitle: 'Accessibility Statement',
131          closeStatement: 'Close accessibility statement',
132          statementCommitment: 'Accessibility Commitment',
133          statementCommitmentText: 'We strive to ensure that our website is accessible and usable for everyone, including individuals with disabilities. As part of this commitment, we have implemented an automated accessibility solution designed to enhance usability and align, as closely as possible, with Israeli Standard IS 5568 and the Web Content Accessibility Guidelines (WCAG) 2.1 Level AA.',
134          statementCommitmentText2: 'The accessibility features are provided through an automated tool and are made available "as is", in accordance with our Terms of Service. Automated tools support compliance, but full legal compliance may still require site-level content and code remediation.',
135          statementEnhancements: 'Accessibility Enhancements Available on This Website',
136          statementEnhancementsText: 'The accessibility system installed on this website provides a range of tools to improve navigation, readability, and interaction, including but not limited to:',
137          statementEnhancementsList: [
138            'Full keyboard navigation support across site functionality',
139            'Adjustable font size, alignment, and spacing',
140            'Contrast controls for light and dark background modes',
141            'Custom color adjustments for improved visibility',
142            'Color-blind friendly modes, including monochrome and contrast matching',
143            'Readability-optimized font options',
144            'Enlarged cursor with optional color changes',
145            'Text scaling up to 200% without loss of content or functionality',
146            'Visual emphasis on links and headings',
147            'Alternative text support for images',
148            'Tooltip explanations for selected content',
149            'Word definitions via text selection',
150            'Reading assistance tools, including reading guides and focus masks',
151            'Controls to reduce or stop blinking, flashing, or animated elements'
152          ],
153          statementEnhancementsText2: 'These features are intended to support users with visual, motor, and cognitive accessibility needs.',
154          statementBrowser: 'Browser and Assistive Technology Support',
155          statementBrowserText: 'We aim to support a broad range of modern browsers and assistive technologies. Our accessibility efforts include testing and optimization for commonly used platforms, including:',
156          statementBrowserList: [
157            'Chrome, Firefox, Edge, Safari, and Opera',
158            'Screen readers such as VoiceOver (macOS), JAWS, and NVDA (Windows & macOS)'
159          ],
160          statementBrowserText2: 'Please note that accessibility performance may vary depending on individual device configurations and assistive technology combinations.',
161          statementTechnical: 'Technical Framework',
162          statementTechnicalText: 'This website relies on the following technologies to deliver accessible functionality:',
163          statementTechnicalList: [
164            'HTML5',
165            'WAI-ARIA attributes',
166            'CSS3',
167            'JavaScript (ES6 and above)'
168          ],
169          statementTechnicalText2: 'These technologies are used to support compliance with recognized accessibility standards.',
170          statementThirdParty: 'Third-Party Content',
171          statementThirdPartyText: 'Some areas of this website may include third-party content or integrations (such as social media platforms, embedded videos, or external widgets) that are not owned or c
171ontrolled by us. As a result, we cannot guarantee the accessibility of these external components.',
172          statementThirdPartyText2: 'For reference, you may review accessibility policies from these third-party providers directly:',
173          statementThirdPartyLinks: [
174            { text: 'Facebook Accessibility', url: 'https://www.facebook.com/help/accessibility' },
175            { text: 'YouTube Accessibility', url: 'https://support.google.com/youtube/topic/9257096' },
176            { text: 'Instagram Accessibility', url: 'https://help.instagram.com/650202712454932' },
177            { text: 'Twitter Accessibility', url: 'https://help.twitter.com/en/using-twitter/accessibility-features' },
178            { text: 'LinkedIn Accessibility', url: 'https://www.linkedin.com/accessibility' }
179          ],
180          statementFeedback: 'Ongoing Improvements & Feedback',
181          statementFeedbackText: 'We continuously work to improve the accessibility of our website. While we make every effort to address accessibility concerns, some content or features may not yet be fully optimized.',
182          statementFeedbackText2: 'If you experience any difficulty accessing content, encounter an accessibility issue, or wish to suggest improvements, we encourage you to contact us via the "Send Feedback" option available on the website.',
183          statementFeedbackText3: 'Your feedback helps us improve the experience for everyone.',
184          statementLastUpdated: 'Last Updated:'
185        },
186        he: {
187          skipToMain: 'דלג לתוכן הראשי',
188          accessibility: 'נגישות',
189          closeToolbar: 'סגור סרגל נגישות',
190          toggleToolbar: 'הצג/הסתר סרגל נגישות',
191          textSize: 'גודל טקסט',
192          increaseText: 'הגדל טקסט',
193          increaseTextAria: 'הגדל גודל טקסט',
194          decreaseText: 'הקטן טקסט',
195          decreaseTextAria: 'הקטן גודל טקסט',
196          contrastColors: 'ניגודיות וצבעים',
197          highContrast: 'ניגודיות גבוהה',
198          highContrastAria: 'החלף מצב ניגודיות גבוהה',
199          negativeContrast: 'ניגודיות שלילית',
200          negativeContrastAria: 'החלף ניגודיות שלילית',
201          grayscale: 'גווני אפור',
202          grayscaleAria: 'החלף מצב גווני אפור',
203          readableFont: 'גופן קריא',
204          readableFontAria: 'השתמש בגופן קריא',
205          highlighting: 'הדגשה',
206          highlightLinks: 'הדגש קישורים',
207          highlightLinksAria: 'הדגש קישורים',
208          highlightTitles: 'הדגש כותרות',
209          highlightTitlesAria: 'הדגש כותרות',
210          readingAids: 'עזרי קריאה',
211          readingGuide: 'מדריך קריאה',
212          readingGuideAria: 'החלף מדריך קריאה',
213          readingMask: 'מסכת קריאה',
214          readingMaskAria: 'החלף מסכת קריאה',
215          textSpacing: 'מרווח טקסט',
216          textSpacingAria: 'הגדל מרווח טקסט',
217          navigationInteraction: 'ניווט ואינטראקציה',
218          keyboardNav: 'ניווט מקלדת',
219          keyboardNavAria: 'ניווט מקלדת משופר',
220          bigCursor: 'סמן גדול',
221          bigCursorAria: 'סמן גדול',
222          stopAnimations: 'עצור אנימציות',
223          stopAnimationsAria: 'עצור אנימציות',
224          resetAll: 'איפוס כל ההגדרות',
225          resetAllAria: 'איפוס כל הגדרות הנגישות',
226          accessibilityStatement: 'הצהרת נגישות',
227          viewStatementAria: 'הצג הצהרת נגישות',
228          resetNotification: 'כל הגדרות הנגישות אופסו.',
229          toolbarAvailable: 'סרגל נגישות זמין. לחץ Alt+A כדי לפתוח.',
230          accessibilityControls: 'בקרות נגישות',
231          statementTitle: 'הצהרת נגישות',
232          closeStatement: 'סגור הצהרת נגישות',
233          statementCommitment: 'מחויבות לנגישות',
234          statementCommitmentText: 'אנו שואפים להבטיח שהאתר שלנו נגיש ונוח לשימוש עבור כולם, כולל אנשים עם מוגבלויות. כחלק ממחויבות זו, יישמנו פתרון נגישות אוטומטי שנועד לשפר את השימושיות ולהתאים, ככל האפשר, לתקן הישראלי ת״י 5568 ולהנחיות נגישות תוכן האינטרנט (WCAG) 2.1 רמה AA.',
235          statementCommitmentText2: 'תכונות הנגישות מסופקות באמצעות כלי אוטומטי וזמינות "כפי שהן", בהתאם לתנאי השירות שלנו. כלים אוטומטיים מסייעים לנגישות, אך עמידה מלאה בדרישות החוק עשויה לדרוש גם תיקון תוכן וקוד ברמת האתר.',
236          statementEnhancements: 'שיפורי נגישות הזמינים באתר זה',
237          statementEnhancementsText: 'מערכת הנגישות המותקנת באתר זה מספקת מגוון כלים לשיפור הניווט, הקריאות והאינטראקציה, כולל אך לא רק:',
238          statementEnhancementsList: [
239            'תמיכה מלאה בניווט מקלדת בכל הפונקציונליות של האתר',
240            'גודל גופן, יישור ומרווח הניתנים להתאמה',
241            'בקרות ניגודיות למצבי רקע בהיר וכהה',
242            'התאמות צבע מותאמות אישית לשיפור הנראות',
243            'מצבים ידידותיים לעיוורי צבעים, כולל מונוכרום והתאמת ניגודיות',
244            'אפשרויות גופן מותאמות לקריאות',
245            'סמן מוגדל עם שינויי צבע אופציונליים',
246            'הגדלת טקסט עד 200% ללא אובדן תוכן או פונקציונליות',
247            'הדגשה ויזואלית של קישורים וכותרות',
248            'תמיכה בטקסט חלופי לתמונות',
249            'הסברים בטולטיפים לתוכן שנבחר',
250            'הגדרות מילים באמצעות בחירת טקסט',
251            'כלי עזר לקריאה, כולל מדריכי קריאה ומסכות מיקוד',
252            'בקרות להפחתה או עצירת אלמנטים מהבהבים, מנצנצים או מונפשים'
253          ],
254          statementEnhancementsText2: 'תכונות אלה נועדו לתמוך במשתמשים עם צרכי נגישות חזותיים, מוטוריים וקוגניטיביים.',
255          statementBrowser: 'תמיכה בדפדפנים וטכנולוגיות מסייעות',
256          statementBrowserText: 'אנו שואפים לתמוך במגוון רחב של דפדפנים מודרניים וטכנולוגיות מסייעות. מאמצי הנגישות שלנו כוללים בדיקה ואופטימיזציה לפלטפורמות נפוצות, כולל:',
257          statementBrowserList: [
258            'Chrome, Firefox, Edge, Safari ו-Opera',
259            'קוראי מסך כגון VoiceOver (macOS), JAWS ו-NVDA (Windows & macOS)'
260          ],
261          statementBrowserText2: 'שימו לב שביצועי הנגישות עשויים להשתנות בהתאם לתצורות מכשירים בודדים ושילובי טכנולוגיות מסייעות.',
262          statementTechnical: 'מסגרת טכנית',
263          statementTechnicalText: 'אתר זה מסתמך על הטכנולוגיות הבאות כדי לספק פונקציונליות נגישה:',
264          statementTechnicalList: [
265            'HTML5',
266            'תכונות WAI-ARIA',
267            'CSS3',
268            'JavaScript (ES6 ומעלה)'
269          ],
270          statementTechnicalText2: 'טכנולוגיות אלה משמשות לתמיכה בהתאמה לתקני נגישות מוכרים.',
271          statementThirdParty: 'תוכן צד שלישי',
272          statementThirdPartyText: 'כמה אזורים באתר זה עשויים לכלול תוכן או אינטגרציות של צד שלישי (כגון פלטפורמות מדיה חברתית, סרטונים מוטמעים או וידגטים חיצוניים) שאינם בבעלותנו או בשליטתנו. כתוצאה מכך, איננו יכולים להבטיח את הנגישות של רכיבים חיצוניים אלה.',
273          statementThirdPartyText2: 'לצורך התייחסות, תוכלו לבדוק מדיניות נגישות מספקי צד שלישי אלה ישירות:',
274          statementThirdPartyLinks: [
275            { text: 'נגישות Facebook', url: 'https://www.facebook.com/help/accessibility' },
276            { text: 'נגישות YouTube', url: 'https://support.google.com/youtube/topic/9257096' },
277            { text: 'נגישות Instagram', url: 'https://help.instagram.com/650202712454932' },
278            { text: 'נגישות Twitter', url: 'https://help.twitter.com/en/using-twitter/accessibility-features' },
279            { text: 'נגישות LinkedIn', url: 'https://www.linkedin.com/accessibility' }
280          ],
281          statementFeedback: 'שיפורים מתמשכים ומשוב',
282          statementFeedbackText: 'אנו עובדים ברציפות לשיפור הנגישות של האתר שלנו. בעוד שאנו עושים כל מאמץ לטפל בחששות נגישות, חלק מהתוכן או התכונות עשויים עדיין לא להיות מותאמים במלואם.',
283          statementFeedbackText2: 'אם אתם חווים קושי כלשהו בגישה לתוכן, נתקלים בבעיית נגישות, או רוצים להציע שיפורים, אנו מעודדים אתכם ליצור איתנו קשר באמצעות אפשרות "שלח משוב" הזמינה באתר.',
284          statementFeedbackText3: 'המשוב שלכם עוזר לנו לשפר את החוויה עבור כולם.',
285          statementLastUpdated: 'עודכן לאחרונה:'
286        },
287        ar: {"skipToMain":"تخطي إلى المحتوى الرئيسي","accessibility":"إمكانية الوصول","closeToolbar":"إغلاق شريط أدوات إمكانية الوصول","toggleToolbar":"تبديل شريط أدوات إمكانية الوصول","textSize":"حجم النص","increaseText":"تكبير النص","increaseTextAria":"زيادة حجم النص","decreaseText":"تصغير النص","decreaseTextAria":"تقليل حجم النص","contrastColors":"التباين والألوان","highContrast":"تباين عالٍ","highContrastAria":"تبديل وضع التباين العالي","negativeContrast":"التباين السلبي","negativeContrastAria":"تبديل التباين السلبي","grayscale":"تدرج الرمادي","grayscaleAria":"تبديل وضع تدرج الرمادي","readableFont":"خط سهل القراءة","readableFontAria":"استخدام خط سهل القراءة","highlighting":"التمييز","highlightLinks":"تمييز الروابط","highlightLinksAria":"تمييز الروابط","highlightTitles":"تمييز العناوين","highlightTitlesAria":"تمييز العناوين","readingAids":"أدوات القراءة","readingGuide":"دليل القراءة","readingGuideAria":"تبديل دليل القراءة","readingMask":"قناع القراءة","readingMaskAria":"تبديل قناع القراءة","textSpacing":"تباعد النص","textSpacingAria":"زيادة تباعد النص","navigationInteraction":"التنقل والتفاعل","keyboardNav":"تنقل بلوحة المفاتيح","keyboardNavAria":"تنقل محسّن بلوحة المفاتيح","bigCursor":"مؤشر كبير","bigCursorAria":"مؤشر كبير","stopAnimations":"إيقاف الحركات","stopAnimationsAria":"إيقاف الرسوم المتحركة","resetAll":"إعادة Ø
287¶Ø¨Ø· الكل","resetAllAria":"إعادة ضبط جميع إعدادات إمكانية الوصول","accessibilityStatement":"بيان إمكانية الوصول","viewStatementAria":"عرض بيان إمكانية الوصول","resetNotification":"تمت إعادة ضبط جميع إعدادات إمكانية الوصول.","toolbarAvailable":"شريط أدوات إمكانية الوصول متاح. اضغط Alt+A للفتح.","accessibilityControls":"أدوات التحكم في إمكانية الوصول","statementTitle":"بيان إمكانية الوصول","closeStatement":"إغلاق بيان إمكانية الوصول","statementCommitment":"التزامنا بإمكانية الوصول","statementCommitmentText":"نسعى جاهدين لضمان أن يكون موقعنا الإلكتروني متاحًا وسهل الاستخدام للجميع، بما في ذلك الأشخاص ذوو الإعاقة. وكجزء من هذا الالتزام، قمنا بتطبيق حل آلي لإمكانية الوصول مصمم لتحسين سهولة الاستخدام والتوافق قدر الإمكان مع Israeli Standard IS 5568 وإرشادات الوصول لمحتوى الويب (WCAG) 2.1 Level AA.","statementCommitmentText2":"تُقدَّم ميزات إمكانية الوصول من خلال أداة آلية، وتتوفر \"كما هي\"، وفقًا لشروط الخدمة الخاصة بنا. تدعم الأدوات الآلية الامتثال، لكن الامتثال القانوني الكامل قد يتطلب أيضًا معالجة المحتوى والكود على مستوى الموقع.","statementEnhancements":"تحسينات إمكانية الوصول المتوفرة على هذا الموقع","statementEnhancementsText":"يوفر نظام إمكانية الوصول المُثبَّت على هذا الموقع مجموعة من الأدوات لتحسين التنقل والقراءة والتفاعل، بما في ذلك على سبيل المثال لا الحصر:","statementEnhancementsList":["دعم كامل للتنقل بلوحة المفاتيح عبر وظائف الموقع","إمكانية تعديل حجم الخط والمحاذاة والتباعد","أدوات تحكم في التباين لوضعي الخلفية الفاتحة والداكنة","تعديلات لونية مخصصة لتحسين الرؤية","أوضاع مناسبة لعمى الألوان، بما في ذلك الأحادية اللون ومطابقة التباين","خيارات خطوط مُحسّنة لسهولة القراءة","مؤشر مكبّر مع إمكانية تغيير اللون اختياريًا","تكبير النص حتى 200% دون فقدان المحتوى أو الوظائف","تمييز بصري للروابط والعناوين","دعم النص البديل للصور","شروحات تلميحية لمحتوى مختار","تعريفات الكلمات عبر تحديد النص","أدوات مساعدة على القراءة، بما في ذلك أدلة القراءة وأقنعة التركيز","أدوات تحكم لتقليل أو إيقاف الوميض أو الإضاءة المتقطعة أو العناصر المتحركة"],"statementEnhancementsText2":"تهدف هذه الميزات إلى دعم المستخدمين ذوي الاحتياجات البصرية والحركية والإدراكية.","statementBrowser":"دعم المتصفحات والتقنيات المساعدة","statementBrowserText":"نهدف إلى دعم مجموعة واسعة من المتصفحات الحديثة والتقنيات المساعدة. تشمل جهودنا في مجال إمكانية الوصول الاختبار والتحسين للمنصات شائعة الاستخدام، بما في ذلك:","statementBrowserList":["Chrome وFirefox وEdge وSafari وOpera","قارئات الشاشة مثل VoiceOver (macOS)، وJAWS، وNVDA (Windows وmacOS)"],"statementBrowserText2":"يُرجى ملاحظة أن أداء إمكانية الوصول قد يختلف حسب إعدادات الجهاز الفردية ومجموعات التقنيات المساعدة المستخدمة.","statementTechnical":"الإطار التقني","statementTechnicalText":"يعتمد هذا الموقع على التقنيات التالية لتوفير وظائف إمكانية الوصول:","statementTechnicalList":["HTML5","سمات WAI-ARIA","CSS3","JavaScript (ES6 وما بعدها)"],"statementTechnicalText2":"تُستخدم هذه التقنيات لدعم الامتثال لمعايير إمكانية الوصول المعترف بها.","statementThirdParty":"محتوى الجهات الخارجية","statementThirdPartyText":"قد تتضمن بعض أجزاء هذا الموقع محتوى أو تكاملات من جهات خارجية (مثل منصات التواصل الاجتماعي أو مقاطع الفيديو المضمّنة أو الأدوات الخارجية) لا نملكها ولا نتحكم بها. ونتيجة لذلك، لا يمكننا ضمان إمكانية الوصول لهذه المكونات الخارجية.","statementThirdPartyText2":"للاطلاع، يمكنكم مراجعة سياسات إمكانية الوصول الخاصة بمزودي الخدمة هؤلاء مباشرةً:","statementThirdPartyLinks":[{"text":"إمكانية الوصول في Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"إمكانية الوصول في YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"إمكانية الوصول في Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"إمكانية الوصول في Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"إمكانية الوصول في LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"التحسينات المستمرة والملاحظات","statementFeedbackText":"نعمل باستمرار على تحسين إمكانية الوصول لموقعنا. وعلى الرغم من بذلنا قصارى جهدنا لمعالجة قضايا إمكانية الوصول، فقد لا يكون بعض المحتوى أو الميزات محسّنًا بالكامل بعد.","statementFeedbackText2":"إذا واجهتم أي صعوبة في الوصول إلى المحتوى، أو صادفتم مشكلة تتعلق بإمكانية الوصول، أو رغبتم في اقتراح تحسينات، فنحن نشجعكم على التواصل معنا عبر خيار \"إرØ
287³Ø§Ù„ ملاحظات\" المتاح على الموقع.","statementFeedbackText3":"تساعدنا ملاحظاتكم على تحسين التجربة للجميع.","statementLastUpdated":"آخر تحديث:"},
288        es: {"skipToMain":"Saltar al contenido principal","accessibility":"Accesibilidad","closeToolbar":"Cerrar barra de accesibilidad","toggleToolbar":"Alternar barra de accesibilidad","textSize":"Tamaño del Texto","increaseText":"Aumentar Texto","increaseTextAria":"Aumentar el tamaño del texto","decreaseText":"Reducir Texto","decreaseTextAria":"Reducir el tamaño del texto","contrastColors":"Contraste y Colores","highContrast":"Alto Contraste","highContrastAria":"Alternar modo de alto contraste","negativeContrast":"Contraste Negativo","negativeContrastAria":"Alternar contraste negativo","grayscale":"Escala de Grises","grayscaleAria":"Alternar modo de escala de grises","readableFont":"Fuente Legible","readableFontAria":"Usar fuente legible","highlighting":"Resaltado","highlightLinks":"Resaltar Enlaces","highlightLinksAria":"Resaltar enlaces","highlightTitles":"Resaltar Títulos","highlightTitlesAria":"Resaltar encabezados","readingAids":"Ayudas de Lectura","readingGuide":"Guía de Lectura","readingGuideAria":"Alternar guía de lectura","readingMask":"Máscara de Lectura","readingMaskAria":"Alternar máscara de lectura","textSpacing":"Espaciado del Texto","textSpacingAria":"Aumentar el espaciado del texto","navigationInteraction":"Navegación e Interacción","keyboardNav":"Navegación por Teclado","keyboardNavAria":"Navegación por teclado mejorada","bigCursor":"Cursor Grande","bigCursorAria":"Cursor grande","stopAnimations":"Detener Animaciones","stopAnimationsAria":"Detener animaciones","resetAll":"Restablecer Todo","resetAllAria":"Restablecer todos los ajustes de accesibilidad","accessibilityStatement":"Declaración de Accesibilidad","viewStatementAria":"Ver declaración de accesibilidad","resetNotification":"Todos los ajustes de accesibilidad se han restablecido.","toolbarAvailable":"Barra de accesibilidad disponible. Presione Alt+A para abrir.","accessibilityControls":"Controles de accesibilidad","statementTitle":"Declaración de Accesibilidad","closeStatement":"Cerrar declaración de accesibilidad","statementCommitment":"Compromiso con la Accesibilidad","statementCommitmentText":"Nos esforzamos por garantizar que nuestro sitio web sea accesible y utilizable para todas las personas, incluidas aquellas con discapacidades. Como parte de este compromiso, hemos implementado una solución de accesibilidad automatizada diseñada para mejorar la usabilidad y alinearse, en la medida de lo posible, con la Norma Israelí IS 5568 y las Pautas de Accesibilidad para el Contenido Web (WCAG) 2.1 Nivel AA.","statementCommitmentText2":"Las funciones de accesibilidad se proporcionan mediante una herramienta automatizada y se ofrecen \"tal cual\", de acuerdo con nuestros Términos de Servicio. Las herramientas automatizadas apoyan el cumplimiento, pero la conformidad legal total puede requerir también correcciones de contenido y código a nivel del sitio.","statementEnhancements":"Mejoras de Accesibilidad Disponibles en Este Sitio Web","statementEnhancementsText":"El sistema de accesibilidad instalado en este sitio web ofrece una variedad de herramientas para mejorar la navegación, la legibilidad y la interacción, incluyendo entre otras:","statementEnhancementsList":["Soporte completo de navegación por teclado en todas las funciones del sitio","Tamaño de fuente, alineación y espaciado ajustables","Controles de contraste para modos de fondo claro y oscuro","Ajustes de color personalizados para mejorar la visibilidad","Modos adaptados para personas con daltonismo, incluyendo monocromo y coincidencia de contraste","Opciones de fuente optimizadas para la legibilidad","Cursor ampliado con cambios de color opcionales","Escalado de texto hasta el 200% sin pérdida de contenido ni funcionalidad","Énfasis visual en enlaces y encabezados","Soporte de texto alternativo para imágenes","Explicaciones mediante información sobre herramientas para contenido seleccionado","Definiciones de palabras mediante selección de texto","Herramientas de asistencia de lectura, incluyendo guías de lectura y máscaras de enfoque","Controles para reducir o detener elementos parpadeantes o animados"],"statementEnhancementsText2":"Estas funciones están diseña
288das para apoyar a los usuarios con necesidades de accesibilidad visuales, motoras y cognitivas.","statementBrowser":"Compatibilidad con Navegadores y Tecnologías de Asistencia","statementBrowserText":"Nuestro objetivo es ser compatibles con una amplia gama de navegadores modernos y tecnologías de asistencia. Nuestros esfuerzos de accesibilidad incluyen pruebas y optimización para las plataformas más utilizadas, entre ellas:","statementBrowserList":["Chrome, Firefox, Edge, Safari y Opera","Lectores de pantalla como VoiceOver (macOS), JAWS y NVDA (Windows y macOS)"],"statementBrowserText2":"Tenga en cuenta que el rendimiento de accesibilidad puede variar según la configuración individual del dispositivo y las combinaciones de tecnologías de asistencia utilizadas.","statementTechnical":"Marco Técnico","statementTechnicalText":"Este sitio web se basa en las siguientes tecnologías para ofrecer funciones accesibles:","statementTechnicalList":["HTML5","Atributos WAI-ARIA","CSS3","JavaScript (ES6 y superior)"],"statementTechnicalText2":"Estas tecnologías se utilizan para apoyar el cumplimiento de las normas de accesibilidad reconocidas.","statementThirdParty":"Contenido de Terceros","statementThirdPartyText":"Algunas áreas de este sitio web pueden incluir contenido o integraciones de terceros (como plataformas de redes sociales, videos incrustados o widgets externos) que no son propiedad ni están controlados por nosotros. Como resultado, no podemos garantizar la accesibilidad de estos componentes externos.","statementThirdPartyText2":"Como referencia, puede consultar directamente las políticas de accesibilidad de estos proveedores externos:","statementThirdPartyLinks":[{"text":"Accesibilidad de Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Accesibilidad de YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Accesibilidad de Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Accesibilidad de Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Accesibilidad de LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Mejoras Continuas y Comentarios","statementFeedbackText":"Trabajamos continuamente para mejorar la accesibilidad de nuestro sitio web. Aunque hacemos todo lo posible por resolver los problemas de accesibilidad, es posible que algunos contenidos o funciones aún no estén completamente optimizados.","statementFeedbackText2":"Si tiene dificultades para acceder al contenido, encuentra algún problema de accesibilidad o desea sugerir mejoras, le invitamos a contactarnos a través de la opción \"Enviar Comentarios\" disponible en el sitio web.","statementFeedbackText3":"Sus comentarios nos ayudan a mejorar la experiencia para todos.","statementLastUpdated":"Última Actualización:"},
289        fr: {"skipToMain":"Passer au contenu principal","accessibility":"Accessibilité","closeToolbar":"Fermer la barre d'outils d'accessibilité","toggleToolbar":"Basculer la barre d'outils d'accessibilité","textSize":"Taille du texte","increaseText":"Augmenter le texte","increaseTextAria":"Augmenter la taille du texte","decreaseText":"Réduire le texte","decreaseTextAria":"Réduire la taille du texte","contrastColors":"Contraste et couleurs","highContrast":"Contraste élevé","highContrastAria":"Activer/désactiver le mode contraste élevé","negativeContrast":"Contraste négatif","negativeContrastAria":"Activer/désactiver le contraste négatif","grayscale":"Niveaux de gris","grayscaleAria":"Activer/désactiver le mode niveaux de gris","readableFont":"Police lisible","readableFontAria":"Utiliser une police lisible","highlighting":"Mise en évidence","highlightLinks":"Surligner les liens","highlightLinksAria":"Surligner les liens","highlightTitles":"Surligner les titres","highlightTitlesAria":"Surligner les titres","readingAids":"Aides à la lecture","readingGuide":"Guide de lecture","readingGuideAria":"Activer/désactiver le guide de lecture","readingMask":"Masque de lecture","readingMaskAria":"Activer/désactiver le masque de lecture","textSpacing":"Espacement du texte","textSpacingAria":"Augmenter l'espacement du texte","navigationInteraction":"Navigation et interaction","keyboardNav":"Navigation au clavier","keyboardNavAria":"Navigation au clavier améliorée","bigCursor":"Grand curseur","bigCursorAria":"Grand curseur","stopAnimations":"Arrêter les animations","stopAnimationsAria":"Arrêter les animations","resetAll":"Réinitialiser tous les réglages","resetAllAria":"Réinitialiser tous les réglages d'accessibilité","accessibilityStatement":"Déclaration d'accessibilité","viewStatementAria":"Consulter la déclaration d'accessibilité","resetNotification":"Tous les réglages d'accessibilité ont été réinitialisés.","toolbarAvailable":"Barre d'outils d'accessibilité disponible. Appuyez sur Alt+A pour l'ouvrir.","accessibilityControl
289s":"Commandes d'accessibilité","statementTitle":"Déclaration d'accessibilité","closeStatement":"Fermer la déclaration d'accessibilité","statementCommitment":"Engagement en matière d'accessibilité","statementCommitmentText":"Nous nous efforçons de rendre notre site web accessible et utilisable par tous, y compris les personnes en situation de handicap. Dans le cadre de cet engagement, nous avons mis en place une solution d'accessibilité automatisée conçue pour améliorer l'utilisabilité et s'aligner, autant que possible, sur la norme israélienne Israeli Standard IS 5568 et les Règles pour l'accessibilité des contenus Web (WCAG) 2.1 niveau AA (WCAG 2.1 Level AA).","statementCommitmentText2":"Les fonctionnalités d'accessibilité sont fournies via un outil automatisé et proposées « telles quelles », conformément à nos Conditions d'utilisation. Les outils automatisés facilitent la conformité, mais une conformité légale complète peut encore nécessiter des corrections du contenu et du code du site.","statementEnhancements":"Améliorations d'accessibilité disponibles sur ce site","statementEnhancementsText":"Le système d'accessibilité installé sur ce site propose une gamme d'outils pour améliorer la navigation, la lisibilité et l'interaction, incluant notamment :","statementEnhancementsList":["Prise en charge complète de la navigation au clavier sur l'ensemble des fonctionnalités du site","Taille, alignement et espacement du texte réglables","Contrôles de contraste pour les modes fond clair et fond sombre","Réglages de couleurs personnalisés pour une meilleure visibilité","Modes adaptés aux daltoniens, y compris le monochrome et la correspondance des contrastes","Options de police optimisées pour la lisibilité","Curseur agrandi avec changement de couleur optionnel","Agrandissement du texte jusqu'à 200 % sans perte de contenu ni de fonctionnalité","Mise en valeur visuelle des liens et des titres","Prise en charge du texte alternatif pour les images","Info-bulles explicatives pour certains contenus","Définitions de mots par sélection de texte","Outils d'aide à la lecture, y compris guides de lecture et masques de concentration","Commandes pour réduire ou arrêter les éléments clignotants ou animés"],"statementEnhancementsText2":"Ces fonctionnalités visent à répondre aux besoins des utilisateurs présentant des déficiences visuelles, motrices et cognitives.","statementBrowser":"Prise en charge des navigateurs et technologies d'assistance","statementBrowserText":"Nous visons à prendre en charge un large éventail de navigateurs modernes et de technologies d'assistance. Nos efforts d'accessibilité incluent des tests et des optimisations pour les plateformes couramment utilisées, notamment :","statementBrowserList":["Chrome, Firefox, Edge, Safari et Opera","Les lecteurs d'écran tels que VoiceOver (macOS), JAWS et NVDA (Windows et macOS)"],"statementBrowserText2":"Veuillez noter que les performances d'accessibilité peuvent varier selon les configurations d'appareils et les combinaisons de technologies d'assistance utilisées.","statementTechnical":"Cadre technique","statementTechnicalText":"Ce site web s'appuie sur les technologies suivantes pour offrir des fonctionnalités accessibles :","statementTechnicalList":["HTML5","Attributs WAI-ARIA","CSS3","JavaScript (ES6 et versions ultérieures)"],"statementTechnicalText2":"Ces technologies sont utilisées pour favoriser la conformité aux normes d'accessibilité reconnues.","statementThirdParty":"Contenu tiers","statementThirdPartyText":"Certaines parties de ce site web peuvent inclure du contenu ou des intégrations tiers (tels que des plateformes de réseaux sociaux, des vidéos intégrées ou des widgets externes) qui ne nous appartiennent pas et que nous ne contrôlons pas. Par conséquent, nous ne pouvons garantir l'accessibilité de ces composants externes.","statementThirdPartyText2":"À titre indicatif, vous pouvez consulter directement les politiques d'accessibilité de ces fournisseurs tiers :","statementThirdPartyLinks":[{"text":"Accessibilité Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Accessibilité YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Accessibilité Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Accessibilité Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Accessibilité LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Améliorations continues et retours","statementFeedbackText":"Nous travaillons en permanence à améliorer l'accessibilité de notre site web. Bien que nous fassions tous les efforts possibles pour résoudre les problèmes d'accessibilité, certains contenus ou fonctionnalités peuvent ne pas encore être pleinement optimisés.","statementFeedbackText2":"Si vous rencontrez des difficultés d'accès au contenu, un problème d'accessibilité, ou si vous souhaitez suggérer des améliorations, nous vous invitons à nous contacter via l'option « Envoyer un commentaire » disponible sur le site.","statementFeedbackText3":"Vos retours nous aident à améliorer l'expérience pour tous.","statementLastUpdated":"Dernière mise à jour :"},
290        de: {"skipToMain":"Zum Hauptinhalt springen","accessibility":"Barrierefreiheit","closeToolbar":"Symbolleiste für Barrierefreiheit schließen","toggleToolbar":"Symbolleiste für Barrierefreiheit ein-/ausblenden","textSize":"Textgröße","increaseText":"Text vergrößern","increaseTextAria":"Textgröße vergrößern","decreaseText":"Text verkleinern","decreaseTextAria":"Textgröße verkleinern","contrastColors":"Kontrast & Farben","highContrast":"Hoher Kontrast","highContrastAria":"Hohen Kontrastmodus umschalten","negativeContrast":"Negativkontrast","negativeContrastAria":"Negativkontrast umschalten","grayscale":"Graustufen","grayscaleAria":"Graustufenmodus umschalten","readableFont":"Lesbare Schrift","readableFontAria":"Lesbare Schrift verwenden","highlighting":"Hervorhebung","highlightLinks":"Links hervorheben","highlightLinksAria":"Links hervorheben","highlightTitles":"Überschriften hervorheben","highlightTitlesAria":"Überschriften hervorheben","readingAids":"Lesehilfen","readingGuide":"Leseführung","readingGuideAria":"Leseführung umschalten","readingMask":"Lesemaske","readingMaskAria":"Lesemaske umschalten","textSpacing":"Textabstand","textSpacingAria":"Textabstand vergrößern","navigationInteraction":"Navigation & Interaktion","keyboardNav":"Tastaturnavigation","keyboardNavAria":"Erweiterte Tastaturnavigation","bigCursor":"Großer Cursor","bigCursorAria":"Großer Cursor","stopAnimations":"Animationen stoppen","stopAnimationsAria":"Animationen stoppen","resetAll":"Alle Einstellungen zurücksetzen","resetAllAria":"Alle Barrierefreiheitseinstellungen zurücksetzen","accessibilityStatement":"Erklärung zur Barrierefreiheit","viewStatementAria":"Erklärung zur Barrierefreiheit anzeigen","resetNotification":"Alle Barrierefreiheitseinstellungen wurden zurückgesetzt.","toolbarAvailable":"Symbolleiste für Barrierefreiheit verfügbar. Drücken Sie Alt+A zum Öffnen.","accessibilityControl
290s":"Bedienelemente für Barrierefreiheit","statementTitle":"Erklärung zur Barrierefreiheit","closeStatement":"Erklärung zur Barrierefreiheit schließen","statementCommitment":"Unser Engagement für Barrierefreiheit","statementCommitmentText":"Wir bemühen uns sicherzustellen, dass unsere Website für alle zugänglich und nutzbar ist, einschließlich Menschen mit Behinderungen. Im Rahmen dieses Engagements haben wir eine automatisierte Lösung für Barrierefreiheit implementiert, die die Nutzbarkeit verbessern und sich so weit wie möglich am israelischen Standard IS 5568 und den Web Content Accessibility Guidelines (WCAG) 2.1 Level AA orientieren soll.","statementCommitmentText2":"Die Funktionen zur Barrierefreiheit werden über ein automatisiertes Tool bereitgestellt und \"wie besehen\" gemäß unseren Nutzungsbedingungen zur Verfügung gestellt. Automatisierte Tools unterstützen die Einhaltung der Vorgaben, eine vollständige rechtliche Konformität kann jedoch weiterhin Anpassungen von Inhalten und Code auf Website-Ebene erfordern.","statementEnhancements":"Auf dieser Website verfügbare Barrierefreiheitsfunktionen","statementEnhancementsText":"Das auf dieser Website installierte Barrierefreiheitssystem bietet eine Reihe von Tools zur Verbesserung von Navigation, Lesbarkeit und Interaktion, unter anderem:","statementEnhancementsList":["Vollständige Unterstützung der Tastaturnavigation für alle Funktionen der Website","Anpassbare Schriftgröße, Ausrichtung und Abstände","Kontrastregler für helle und dunkle Hintergrundmodi","Individuelle Farbanpassungen zur besseren Sichtbarkeit","Farbenblinden-freundliche Modi, einschließlich Monochrom und Kontrastanpassung","Lesbarkeitsoptimierte Schriftoptionen","Vergrößerter Cursor mit optionaler Farbänderung","Textskalierung bis zu 200 % ohne Verlust von Inhalt oder Funktionalität","Visuelle Hervorhebung von Links und Überschriften","Unterstützung für Alternativtexte bei Bildern","Tooltip-Erklärungen für ausgewählte Inhalte","Worterklärungen durch Textauswahl","Lesehilfen, einschließlich Leseführung und Fokusmasken","Steuerelemente zum Reduzieren oder Stoppen von blinkenden, flackernden oder animierten Elementen"],"statementEnhancementsText2":"Diese Funktionen sollen Nutzer mit visuellen, motorischen und kognitiven Einschränkungen unterstützen.","statementBrowser":"Unterstützung für Browser und assistive Technologien","statementBrowserText":"Wir bemühen uns, eine breite Palette moderner Browser und assistiver Technologien zu unterstützen. Unsere Bemühungen um Barrierefreiheit umfassen Tests und Optimierungen für gängige Plattformen, darunter:","statementBrowserList":["Chrome, Firefox, Edge, Safari und Opera","Bildschirmleseprogramme wie VoiceOver (macOS), JAWS und NVDA (Windows & macOS)"],"statementBrowserText2":"Bitte beachten Sie, dass die Leistung der Barrierefreiheit je nach individueller Gerätekonfiguration und Kombination assistiver Technologien variieren kann.","statementTechnical":"Technischer Rahmen","statementTechnicalText":"Diese Website nutzt folgende Technologien, um barrierefreie Funktionen bereitzustellen:","statementTechnicalList":["HTML5","WAI-ARIA-Attribute","CSS3","JavaScript (ES6 und höher)"],"statementTechnicalText2":"Diese Technologien werden eingesetzt, um die Einhaltung anerkannter Standards zur Barrierefreiheit zu unterstützen.","statementThirdParty":"Inhalte von Drittanbietern","statementThirdPartyText":"Einige Bereiche dieser Website können Inhalte oder Integrationen von Drittanbietern enthalten (wie Social-Media-Plattformen, eingebettete Videos oder externe Widgets), die nicht in unserem Eigentum stehen oder von uns kontrolliert werden. Daher können wir die Barrierefreiheit dieser externen Komponenten nicht garantieren.","statementThirdPartyText2":"Zur Orientierung können Sie die Richtlinien zur Barrierefreiheit dieser Drittanbieter direkt einsehen:","statementThirdPartyLinks":[{"text":"Facebook Barrierefreiheit","url":"https://www.facebook.com/help/accessibility"},{"text":"YouTube Barrierefreiheit","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Instagram Barrierefreiheit","url":"https://help.instagram.com/650202712454932"},{"text":"Twitter Barrierefreiheit","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"LinkedIn Barrierefreiheit","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Laufende Verbesserungen & Feedback","statementFeedbackText":"Wir arbeiten kontinuierlich daran, die Barrierefreiheit unserer Website zu verbessern. Obwohl wir uns bemühen, alle Anliegen zur Barrierefreiheit zu berücksichtigen, sind möglicherweise noch nicht alle Inhalte oder Funktionen vollständig optimiert.","statementFeedbackText2":"Wenn Sie Schwierigkeiten beim Zugriff auf Inhalte haben, ein Problem mit der Barrierefreiheit feststellen oder Verbesserungsvorschläge machen möchten, kontaktieren Sie uns bitte über die Option \"Feedback senden\" auf der Website.","statementFeedbackText3":"Ihr Feedback hilft uns, die Erfahrung für alle zu verbessern.","statementLastUpdated":"Zuletzt aktualisiert:"},
291        pt: {"skipToMain":"Pular para o conteúdo principal","accessibility":"Acessibilidade","closeToolbar":"Fechar barra de acessibilidade","toggleToolbar":"Abrir/fechar barra de acessibilidade","textSize":"Tamanho do Texto","increaseText":"Aumentar Texto","increaseTextAria":"Aumentar tamanho do texto","decreaseText":"Diminuir Texto","decreaseTextAria":"Diminuir tamanho do texto","contrastColors":"Contraste e Cores","highContrast":"Alto Contraste","highContrastAria":"Ativar/desativar modo de alto contraste","negativeContrast":"Contraste Negativo","negativeContrastAria":"Ativar/desativar contraste negativo","grayscale":"Escala de Cinza","grayscaleAria":"Ativar/desativar modo escala de cinza","readableFont":"Fonte Legível","readableFontAria":"Usar fonte legível","highlighting":"Destaques","highlightLinks":"Destacar Links","highlightLinksAria":"Destacar links","highlightTitles":"Destacar Títulos","highlightTitlesAria":"Destacar títulos","readingAids":"Auxílios de Leitura","readingGuide":"Guia de Leitura","readingGuideAria":"Ativar/desativar guia de leitura","readingMask":"Máscara de Leitura","readingMaskAria":"Ativar/desativar máscara de leitura","textSpacing":"Espaçamento do Texto","textSpacingAria":"Aumentar espaçamento do texto","navigationInteraction":"Navegação e Interação","keyboardNav":"Navegação por Teclado","keyboardNavAria":"Navegação por teclado aprimorada","bigCursor":"Cursor Grande","bigCursorAria":"Cursor grande","stopAnimations":"Parar Animações","stopAnimationsAria":"Parar animações","resetAll":"Redefinir Todas as Configurações","resetAllAria":"Redefinir todas as configurações de acessibilidade","accessibilityStatement":"Declaração de Acessibilidade","viewStatementAria":"Ver declaração de acessibilidade","resetNotification":"Todas as configurações de acessibilidade foram redefinidas.","toolbarAvailable":"Barra de acessibilidade disponível. Pressione Alt+A para abrir.","accessibilityControls":"Controles de acessibilidade","statementTitle":"Declaração de Acessibilidade","closeStatement":"Fechar declaração de acessibilidade","statementCommitment":"Compromisso com a Acessibilidade","statementCommitmentText":"Nos esforçamos para garantir que o nosso site seja acessível e utilizável por todos, incluindo pessoas com deficiência. Como parte deste compromisso, implementámos uma solução automatizada de acessibilidade concebida para melhorar a usabilidade e alinhar-se, tanto quanto possível, com a Norma Israelita IS 5568 e as Diretrizes de Acessibilidade para Conteúdo Web (WCAG) 2.1 Nível AA.","statementCommitmentText2":"Os recursos de acessibilidade são fornecidos através de uma ferramenta automatizada e disponibilizados \"tal como estão\", de acordo com os nossos Termos de Serviço. As ferramentas automatizadas apoiam a conformidade, mas a conformidade legal integral pode ainda exigir correções ao nível do conteúdo e do código do site.","statementEnhancements":"Melhorias de Acessibilidade Disponíveis Neste Site","statementEnhancementsText":"O sistema de acessibilidade instalado neste site fornece uma variedade de ferramentas para melhorar a navegação, a legibilidade e a interação, incluindo, entre outras:","statementEnhancementsList":["Suporte completo de navegação por teclado em todas as funcionalidades do site","Tamanho, alinhamento e espaçamento de fonte ajustáveis","Controlos de contraste para modos de fundo claro e escuro","Ajustes de cor personalizados para melhor visibilidade","Modos adaptados para daltónicos, incluindo monocromático e correspondência de contraste","Opções de fonte otimizadas para legibilidade","Cursor ampliado com alteração de cor opcional","Ampliação de texto até 200% sem perda de conteúdo ou funcionalidade","Ênfase visual em links e títulos","Suporte de texto alternativo para imagens","Explicações em dicas de ferramentas para conteúdos selecionados","Definições de palavras através da seleção de texto","Ferramentas de apoio à leitura, incluindo guias de leitura e máscaras de foco","Controlos para reduzir ou parar elementos intermitentes, piscantes ou animados"],"statementEnhancementsText2":"Estes recursos destinam-se a apoiar utilizadores com necessidades de acessibilidade visuais, motoras e cognitivas.","statementBrowser":"Suporte para Navegadores e Tecnologias Assistivas","statementBrowserText":"Procuramos suportar uma ampla variedade de navegadores modernos e tecnologias assistivas. Os nossos esforç
291os de acessibilidade incluem testes e otimização para plataformas comummente utilizadas, incluindo:","statementBrowserList":["Chrome, Firefox, Edge, Safari e Opera","Leitores de ecrã como VoiceOver (macOS), JAWS e NVDA (Windows e macOS)"],"statementBrowserText2":"Note-se que o desempenho da acessibilidade pode variar consoante as configurações individuais do dispositivo e as combinações de tecnologias assistivas.","statementTechnical":"Estrutura Técnica","statementTechnicalText":"Este site depende das seguintes tecnologias para fornecer funcionalidades acessíveis:","statementTechnicalList":["HTML5","Atributos WAI-ARIA","CSS3","JavaScript (ES6 e superior)"],"statementTechnicalText2":"Estas tecnologias são utilizadas para apoiar a conformidade com normas de acessibilidade reconhecidas.","statementThirdParty":"Conteúdo de Terceiros","statementThirdPartyText":"Algumas áreas deste site podem incluir conteúdo ou integrações de terceiros (como plataformas de redes sociais, vídeos incorporados ou widgets externos) que não são propriedade nem estão sob o nosso controlo. Como resultado, não podemos garantir a acessibilidade destes componentes externos.","statementThirdPartyText2":"Para sua referência, pode consultar diretamente as políticas de acessibilidade destes fornecedores terceiros:","statementThirdPartyLinks":[{"text":"Acessibilidade do Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Acessibilidade do YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Acessibilidade do Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Acessibilidade do Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Acessibilidade do LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Melhorias Contínuas e Feedback","statementFeedbackText":"Trabalhamos continuamente para melhorar a acessibilidade do nosso site. Embora nos esforcemos ao máximo para resolver questões de acessibilidade, alguns conteúdos ou funcionalidades podem ainda não estar totalmente otimizados.","statementFeedbackText2":"Se tiver dificuldade em aceder a conteúdos, encontrar algum problema de acessibilidade ou quiser sugerir melhorias, encorajamo-lo a contactar-nos através da opção \"Enviar Feedback\" disponível no site.","statementFeedbackText3":"O seu feedback ajuda-nos a melhorar a experiência para todos.","statementLastUpdated":"Última Atualização:"},
292        it: {"skipToMain":"Salta al contenuto principale","accessibility":"Accessibilità","closeToolbar":"Chiudi la barra degli strumenti di accessibilità","toggleToolbar":"Attiva/disattiva la barra degli strumenti di accessibilità","textSize":"Dimensione del testo","increaseText":"Aumenta testo","increaseTextAria":"Aumenta la dimensione del testo","decreaseText":"Riduci testo","decreaseTextAria":"Riduci la dimensione del testo","contrastColors":"Contrasto e colori","highContrast":"Alto contrasto","highContrastAria":"Attiva/disattiva la modalità ad alto contrasto","negativeContrast":"Contrasto negativo","negativeContrastAria":"Attiva/disattiva il contrasto negativo","grayscale":"Scala di grigi","grayscaleAria":"Attiva/disattiva la modalità scala di grigi","readableFont":"Font leggibile","readableFontAria":"Usa un font leggibile","highlighting":"Evidenziazione","highlightLinks":"Evidenzia link","highlightLinksAria":"Evidenzia i link","highlightTitles":"Evidenzia titoli","highlightTitlesAria":"Evidenzia le intestazioni","readingAids":"Strumenti di lettura","readingGuide":"Guida alla lettura","readingGuideAria":"Attiva/disattiva la guida alla lettura","readingMask":"Maschera di lettura","readingMaskAria":"Attiva/disattiva la maschera di lettura","textSpacing":"Spaziatura del testo","textSpacingAria":"Aumenta la spaziatura del testo","navigationInteraction":"Navigazione e interazione","keyboardNav":"Navigazione da tastiera","keyboardNavAria":"Navigazione da tastiera avanzata","bigCursor":"Cursore grande","bigCursorAria":"Cursore grande","stopAnimations":"Ferma animazioni","stopAnimationsAria":"Ferma le animazioni","resetAll":"Ripristina tutte le impostazioni","resetAllAria":"Ripristina tutte le impostazioni di accessibilità","accessibilityStatement":"Dichiarazione di accessibilità","viewStatementAria":"Visualizza la dichiarazione di accessibilità","resetNotification":"Tutte le impostazioni di accessibilità sono state ripristinate.","toolbarAvailable":"Barra degli strumenti di accessibilità disponibile. Premi Alt+A per aprirla.","accessibilityControl
292s":"Controlli di accessibilità","statementTitle":"Dichiarazione di accessibilità","closeStatement":"Chiudi la dichiarazione di accessibilità","statementCommitment":"Impegno per l'accessibilità","statementCommitmentText":"Ci impegniamo a garantire che il nostro sito web sia accessibile e utilizzabile da tutti, incluse le persone con disabilità. Come parte di questo impegno, abbiamo implementato una soluzione di accessibilità automatizzata progettata per migliorare l'usabilità e per allinearsi, quanto più possibile, allo Standard Israeliano IS 5568 e alle Linee guida per l'accessibilità dei contenuti web (WCAG) 2.1 Livello AA.","statementCommitmentText2":"Le funzionalità di accessibilità sono fornite tramite uno strumento automatizzato e sono rese disponibili \"così come sono\", in conformità con i nostri Termini di Servizio. Gli strumenti automatizzati supportano la conformità, ma la piena conformità legale potrebbe comunque richiedere interventi sul contenuto e sul codice a livello di sito.","statementEnhancements":"Miglioramenti di accessibilità disponibili su questo sito web","statementEnhancementsText":"Il sistema di accessibilità installato su questo sito web offre una serie di strumenti per migliorare la navigazione, la leggibilità e l'interazione, tra cui, a titolo esemplificativo:","statementEnhancementsList":["Supporto completo alla navigazione da tastiera su tutte le funzionalità del sito","Dimensione, allineamento e spaziatura del font regolabili","Controlli di contrasto per modalità con sfondo chiaro e scuro","Regolazioni personalizzate dei colori per una migliore visibilità","Modalità adatte ai daltonici, incluse modalità monocromatiche e corrispondenza del contrasto","Opzioni di font ottimizzate per la leggibilità","Cursore ingrandito con possibilità di cambiare colore","Scalabilità del testo fino al 200% senza perdita di contenuto o funzionalità","Evidenziazione visiva di link e intestazioni","Supporto per testo alternativo alle immagini","Spiegazioni tramite tooltip per contenuti selezionati","Definizioni delle parole tramite selezione del testo","Strumenti di assistenza alla lettura, inclusi guide alla lettura e maschere di focus","Controlli per ridurre o interrompere elementi lampeggianti, intermittenti o animati"],"statementEnhancementsText2":"Queste funzionalità sono pensate per supportare utenti con esigenze di accessibilità visive, motorie e cognitive.","statementBrowser":"Supporto per browser e tecnologie assistive","statementBrowserText":"Puntiamo a supportare un'ampia gamma di browser moderni e tecnologie assistive. I nostri interventi di accessibilità includono test e ottimizzazioni per le piattaforme più comunemente utilizzate, tra cui:","statementBrowserList":["Chrome, Firefox, Edge, Safari e Opera","Screen reader come VoiceOver (macOS), JAWS e NVDA (Windows e macOS)"],"statementBrowserText2":"Si prega di notare che le prestazioni di accessibilità possono variare in base alle configurazioni individuali del dispositivo e alle combinazioni di tecnologie assistive.","statementTechnical":"Struttura tecnica","statementTechnicalText":"Questo sito web si basa sulle seguenti tecnologie per offrire funzionalità accessibili:","statementTechnicalList":["HTML5","Attributi WAI-ARIA","CSS3","JavaScript (ES6 e versioni successive)"],"statementTechnicalText2":"Queste tecnologie vengono utilizzate per supportare la conformità agli standard di accessibilità riconosciuti.","statementThirdParty":"Contenuti di terze parti","statementThirdPartyText":"Alcune aree di questo sito web possono includere contenuti o integrazioni di terze parti (come piattaforme social media, video incorporati o widget esterni) che non sono di nostra proprietà né sotto il nostro controllo. Di conseguenza, non possiamo garantire l'accessibilità di questi componenti esterni.","statementThirdPartyText2":"Per riferimento, è possibile consultare direttamente le politiche di accessibilità di questi fornitori terzi:","statementThirdPartyLinks":[{"text":"Accessibilità di Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Accessibilità di YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Accessibilità di Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Accessibilità di Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Accessibilità di LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Miglioramenti continui e feedback","statementFeedbackText":"Lavoriamo costantemente per migliorare l'accessibilità del nostro 
292sito web. Sebbene ci impegniamo al massimo per risolvere i problemi di accessibilità, alcuni contenuti o funzionalità potrebbero non essere ancora completamente ottimizzati.","statementFeedbackText2":"Se riscontri difficoltà nell'accedere ai contenuti, incontri un problema di accessibilità o desideri suggerire miglioramenti, ti invitiamo a contattarci tramite l'opzione \"Invia feedback\" disponibile sul sito web.","statementFeedbackText3":"Il tuo feedback ci aiuta a migliorare l'esperienza per tutti.","statementLastUpdated":"Ultimo aggiornamento:"},
293        ru: {"skipToMain":"Перейти к основному содержимому","accessibility":"Доступность","closeToolbar":"Закрыть панель доступности","toggleToolbar":"Открыть/закрыть панель доступности","textSize":"Размер текста","increaseText":"Увеличить текст","increaseTextAria":"Увеличить размер текста","decreaseText":"Уменьшить текст","decreaseTextAria":"Уменьшить размер текста","contrastColors":"Контраст и цвета","highContrast":"Высокий контраст","highContrastAria":"Включить/выключить режим высокого контраста","negativeContrast":"Негативный контраст","negativeContrastAria":"Включить/выключить негативный контраст","grayscale":"Оттенки серого","grayscaleAria":"Включить/выключить режим оттенков серого","readableFont":"Удобный шрифт","readableFontAria":"Использовать удобный для чтения шрифт","highlighting":"Выделение","highlightLinks":"Выделить ссылки","highlightLinksAria":"Выделить ссылки","highlightTitles":"Выделить заголовки","highlightTitlesAria":"Выделить заголовки","readingAids":"Помощь при чтении","readingGuide":"Линия чтения","readingGuideAria":"Включить/выключить линию чтения","readingMask":"Маска чтения","readingMaskAria":"Включить/выключить маску чтения","textSpacing":"Межтекстовый интервал","textSpacingAria":"Увеличить межтекстовый интервал","navigationInteraction":"Навигация и взаимодействие","keyboardNav":"Навигация с клавиатуры","keyboardNavAria":"Расширенная навигация с клавиатуры","bigCursor":"Крупный курсор","bigCursorAria":"Крупный курсор","stopAnimations":"Остановить анимацию","stopAnimationsAria":"Остановить анимацию","resetAll":"Сбросить все настройки","resetAllAria":"Сбросить все настройки доступности","accessibilityStatement":"Заявление о доступности","viewStatementAria":"Просмотреть заявление о доступности","resetNotification":"Все настройки доступности были сброшены.","toolbarAvailable":"Доступна панель специальных возможностей. Нажмите Alt+A, чтобы открыть её.","accessibilityControls":"Элементы управления доступностью","statementTitle":"Заявление о доступности","closeStatement":"Закрыть заявление о доступности","statementCommitment":"Обязательство по обеспечению доступности","statementCommitmentText":"Мы стремимся к тому, чтобы наш сайт был доступен и удобен для всех, включая людей с инвалидностью. В рамках этого обязательства мы внедрили автоматизированное решение по обеспечению доступности, разработанное для повышения удобства использования и максимально возможного соответствия израильскому стандарту IS 5568 и Руководству по доступности веб-контента (WCAG) 2.1 уровня AA.","statementCommitmentText2":"Функции доступности предоставляются с помощью автоматизированного инструмента и предлагаются «как есть» в соответствии с нашими Условиями использования. Автоматизированные инструменты способствуют соответствию требованиям, однако полное соблюдение законодательства может также требовать доработки контента и кода сайта.","statementEnhancements":"Функции доступности, доступные на этом сайте","statementEnhancementsText":"Установленная на этом сайте система доступности предоставляет ряд инструментов для улучшения навигации, удобочитаемости и взаимодействия, включая, но не ограничиваясь следующим:","statementEnhancementsList":["Полная поддержка навигации с клавиатуры для всех функций сайта","Настраиваемый размер шрифта, выравнивание и межтекстовый интервал","Регулировка контраста для светлого и тёмного фона","Индивидуальная настройка цветов для улучшения видимости","Режимы для людей с нарушением цветового восприятия, включая монохромный режим и подбор контраста","Варианты шрифтов, оптимизированные для удобочитаемости","Увеличенный курсор с возможностью изменения цвета","Масштабирование текста до 200% без потери содержимого или функциональности","Визуальное выделение ссылок и заголовков","Поддержка альтернативного текста для изображений","Всплывающие подсказки для отдельных элементов содержимого","Определения слов при выделении текста","Инструменты помощи при чтении, включая линии чтения и маски фокусировки","Возможность уменьшить или остановить мигание, вспышки или анимационные элементы"],"statementEnhancementsText2":"Эти функции предназначены для поддержки пользователей с нарушениями зрения, моторики и когнитивных функций.","statementBrowser":"Поддержка браузеров и вспомогательных технологий","statementBrowserText":"Мы стремимся поддерживать широкий спектр современных браузеров и вспомогательных технологий. Наши усилия по обеспечению доступности включают тестирование и оптимизацию для часто используемых платформ, в том числе:","statementBrowserList":["Chrome, Firefox, Edge, Safari и Opera","Программы экранного доступа, такие как VoiceOver (macOS), JAWS и NVDA (Windows и macOS)"],"statementBrowserText2":"Обратите внимание, что уровень доступности может отличаться в зависимости от конфигурации устройства и сочетания используемых вспомогательных технологий.","statementTechnical":"Техническая основа","statementTechnicalText":"Этот сайт использует следующие технологии для обеспечения доступности функций:","statementTechnicalList":["HTML5","Атрибуты WAI-ARIA","CSS3","JavaScript (ES6 и выше)"],"statementTechnicalText2":"Эти технологии используются для поддержки соответствия признанным стандартам доступности.","statementThirdParty":"Контент третьих сторон","statementThirdPartyText":"Некоторые разделы этого сайта могут содержать контент или интеграции третьих сторон (например, платформы социальных сетей, встроенные видео или внешние виджеты), которые не принадлежат нам и не контролируются нами. В связи с этим мы не можем гарантировать доступность этих внешних компонентов.","statementThirdPartyText2":"Для справки вы можете ознакомиться с политиками доступности этих сторонних поставщиков напрямую:","statementThirdPartyLinks":[{"text":"Доступность Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Доступность YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Доступность Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Доступность Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Доступность LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Постоянные улучшения и обратная связь","statementFeedbackText":"Мы постоянно работаем над улучшением доступности нашего сайта. Несмотря на все наши усилия по устранению проблем с доступностью, некоторые материалы или функции могут быть ещё не полностью оптимизированы.","statementFeedbackText2":"Если у вас возникли трудности с доступом к контенту, вы обнаружили проблему с доступностью или хотите предложить улучшения, пожалуйста, свяжитесь с нами через раздел «Отправить отзыв» на сайте.","statementFeedbackText3":"Ваши отзывы помогают нам улучшать удобство использования сайта для всех.","statementLastUpdated":"Последнее обновление:"},
294        zh: {"skipToMain":"跳至主要内容","accessibility":"无障碍","closeToolbar":"关闭无障碍工具栏","toggleToolbar":"切换无障碍工具栏","textSize":"文字大小","increaseText":"放大文字","increaseTextAria":"放大文字大小","decreaseText":"缩小文字","decreaseTextAria":"缩小文字大小","contrastColors":"对比度和颜色","highContrast":"高对比度","highContrastAria":"切换高对比度模式","negativeContrast":"反转对比度","negativeContrastAria":"切换反转对比度","grayscale":"灰度","grayscaleAria":"切换灰度模式","readableFont":"易读字体","readableFontAria":"使用易读字体","highlighting":"高亮显示","highlightLinks":"高亮链接","highlightLinksAria":"高亮显示链接","highlightTitles":"高亮标题","highlightTitlesAria":"高亮显示标题","readingAids":"阅读辅助","readingGuide":"阅读引导线","readingGuideAria":"切换阅读引导线","readingMask":"阅读遮罩","readingMaskAria":"切换阅读遮罩","textSpacing":"文字间距","textSpacingAria":"增加文字间距","navigationInteraction":"导航与交互","keyboardNav":"键盘导航","keyboardNavAria":"增强型键盘导航","bigCursor":"大光标","bigCursorAria":"大光标","stopAnimations":"停止动画","stopAnimationsAria":"停止动画","resetAll":"重置所有设置","resetAllAria":"重置所有无障碍设置","accessibilityStatement":"无障碍声明","viewStatementAria":"查看无障碍声明","resetNotification":"所有无障碍设置已重置。","toolbarAvailable":"可使用无障碍工具栏。按 Alt+A 打开。","accessibilityControl
294s":"无障碍控制项","statementTitle":"无障碍声明","closeStatement":"关闭无障碍声明","statementCommitment":"无障碍承诺","statementCommitmentText":"我们努力确保我们的网站对所有人(包括残障人士)均可访问和使用。作为此项承诺的一部分,我们已实施了一套自动化无障碍解决方案,旨在提升可用性,并尽可能符合以色列标准 IS 5568 及《网页内容无障碍指南》(WCAG)2.1 AA 级的要求。","statementCommitmentText2":"这些无障碍功能通过自动化工具提供,并按照我们的服务条款以“现状”方式提供。自动化工具有助于合规,但要实现完全的法律合规,可能仍需要对网站层面的内容和代码进行修复。","statementEnhancements":"本网站提供的无障碍增强功能","statementEnhancementsText":"本网站安装的无障碍系统提供了一系列工具,用于改善导航、可读性和交互体验,包括但不限于:","statementEnhancementsList":["在网站各项功能中提供完整的键盘导航支持","可调节的字体大小、对齐方式和间距","适用于浅色和深色背景模式的对比度控制","自定义颜色调整以提升可视性","色盲友好模式,包括单色和对比度匹配","优化可读性的字体选项","可放大的光标,并可选择更改颜色","文字可放大至200%而不丢失内容或功能","突出显示链接和标题","图像的替代文本支持","为特定内容提供工具提示说明","通过选中文字查看词语释义","阅读辅助工具,包括阅读引导线和焦点遮罩","用于减少或停止闪烁、闪光或动画效果的控制项"],"statementEnhancementsText2":"这些功能旨在支持有视觉、运动和认知无障碍需求的用户。","statementBrowser":"浏览器与辅助技术支持","statementBrowserText":"我们致力于支持广泛的现代浏览器和辅助技术。我们的无障碍工作包括针对常用平台的测试和优化,包括:","statementBrowserList":["Chrome、Firefox、Edge、Safari 和 Opera","屏幕阅读器,如 VoiceOver(macOS)、JAWS 和 NVDA(Windows 和 macOS)"],"statementBrowserText2":"请注意,无障碍表现可能因个人设备配置和辅助技术组合的不同而有所差异。","statementTechnical":"技术框架","statementTechnicalText":"本网站依靠以下技术来实现无障碍功能:","statementTechnicalList":["HTML5","WAI-ARIA 属性","CSS3","JavaScript(ES6 及以上版本)"],"statementTechnicalText2":"这些技术用于支持符合公认的无障碍标准。","statementThirdParty":"第三方内容","statementThirdPartyText":"本网站的部分区域可能包含并非由我们拥有或控制的第三方内容或集成服务(例如社交媒体平台、嵌入式视频或外部小组件)。因此,我们无法保证这些外部组件的无障碍性。","statementThirdPartyText2":"您可以直接查阅以下第三方提供商的无障碍政策以作参考:","statementThirdPartyLinks":[{"text":"Facebook 无障碍","url":"https://www.facebook.com/help/accessibility"},{"text":"YouTube 无障碍","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Instagram 无障碍","url":"https://help.instagram.com/650202712454932"},{"text":"Twitter 无障碍","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"LinkedIn 无障碍","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"持续改进与反馈","statementFeedbackText":"我们持续努力改善网站的无障碍性。尽管我们竭尽全力解决无障碍相关问题,但部分内容或功能可能尚未完全优化。","statementFeedbackText2":"如果您在访问内容时遇到任何困难、发现无障碍问题,或希望提出改进建议,欢迎通过网站上提供的“发送反馈”选项与我们联系。","statementFeedbackText3":"您的反馈将帮助我们为每一位用户改善使用体验。","statementLastUpdated":"最后更新时间:"},
295        ja: {"skipToMain":"メインコンテンツへスキップ","accessibility":"アクセシビリティ","closeToolbar":"アクセシビリティツールバーを閉じる","toggleToolbar":"アクセシビリティツールバーの表示切替","textSize":"文字サイズ","increaseText":"文字を拡大","increaseTextAria":"文字サイズを拡大","decreaseText":"文字を縮小","decreaseTextAria":"文字サイズを縮小","contrastColors":"コントラストと色","highContrast":"ハイコントラスト","highContrastAria":"ハイコントラストモードの切替","negativeContrast":"反転コントラスト","negativeContrastAria":"反転コントラストの切替","grayscale":"グレースケール","grayscaleAria":"グレースケールモードの切替","readableFont":"読みやすいフォント","readableFontAria":"読みやすいフォントを使用","highlighting":"強調表示","highlightLinks":"リンクを強調","highlightLinksAria":"リンクを強調表示","highlightTitles":"見出しを強調","highlightTitlesAria":"見出しを強調表示","readingAids":"読書支援","readingGuide":"読書ガイド","readingGuideAria":"読書ガイドの切替","readingMask":"リーディングマスク","readingMaskAria":"リーディングマスクの
295切替","textSpacing":"文字間隔","textSpacingAria":"文字間隔を広げる","navigationInteraction":"ナビゲーションと操作","keyboardNav":"キーボード操作","keyboardNavAria":"拡張キーボードナビゲーション","bigCursor":"大きなカーソル","bigCursorAria":"大きなカーソル","stopAnimations":"アニメーションを停止","stopAnimationsAria":"アニメーションの停止","resetAll":"すべての設定をリセット","resetAllAria":"すべてのアクセシビリティ設定をリセット","accessibilityStatement":"アクセシビリティ声明","viewStatementAria":"アクセシビリティ声明を表示","resetNotification":"すべてのアクセシビリティ設定がリセットされました。","toolbarAvailable":"アクセシビリティツールバーが利用可能です。Alt+Aキーで開きます。","accessibilityControls":"アクセシビリティ操作パネル","statementTitle":"アクセシビリティ声明","closeStatement":"アクセシビリティ声明を閉じる","statementCommitment":"アクセシビリティへの取り組み","statementCommitmentText":"当社は、障がいのある方を含むすべての方にとって、当ウェブサイトがアクセシブルで使いやすいものとなるよう努めています。この取り組みの一環として、可能な限りIsraeli Standard IS 5568およびWeb Content Accessibility Guidelines(WCAG)2.1 Level AAに準拠するよう設計された、自動アクセシビリティソリューションを導入しています。","statementCommitmentText2":"これらのアクセシビリティ機能は自動化ツールを通じて提供されており、当社の利用規約に従い「現状のまま」提供されます。自動化ツールは準拠を支援しますが、完全な法的準拠のためにはサイト側でのコンテンツやコードの修正が必要な場合があります。","statementEnhancements":"本ウェブサイトで利用可能なアクセシビリティ機能","statementEnhancementsText":"本ウェブサイトに導入されているアクセシビリティシステムは、ナビゲーション、読みやすさ、操作性を向上させるための各種ツールを提供しています。これには以下が含まれますが、これらに限定されません。","statementEnhancementsList":["サイト全体の機能に対応した完全なキーボードナビゲーション","フォントサイズ、配置、間隔の調整","明るい背景・暗い背景モードのコントラスト調整","視認性向上のためのカスタムカラー調整","モノクロやコントラストマッチングを含む色覚異常対応モード","読みやすさに最適化されたフォントオプション","色の変更が可能な拡大カーソル","コンテンツや機能を損なうことなく最大200%まで拡大できる文字サイズ","リンクや見出しの視覚的な強調表示","画像の代替テキスト対応","選択したコンテンツに対するツールチップ説明","テキスト選択による単語の意味表示","読書ガイドやフォーカスマスクを含む読書支援ツール","点滅・フラッシュ・アニメーション要素を軽減または停止するコントロール"],"statementEnhancementsText2":"これらの機能は、視覚、運動、認知面でのアクセシビリティニーズを持つ利用者を支援することを目的としています。","statementBrowser":"ブラウザおよび支援技術のサポート","statementBrowserText":"当社は、幅広い最新のブラウザおよび支援技術のサポートを目指しています。当社のアクセシビリティへの取り組みには、以下のような一般的に使用されているプラットフォームでのテストと最適化が含まれます。","statementBrowserList":["Chrome、Firefox、Edge、Safari、Opera","VoiceOver(macOS)、JAWS、NVDA(Windows & macOS)などのスクリーンリーダー"],"statementBrowserText2":"アクセシビリティのパフォーマンスは、各デバイスの設定や支援技術の組み合わせによって異なる場合があることをご了承ください。","statementTechnical":"技術的な枠組み","statementTechnicalText":"本ウェブサイトは、アクセシブルな機能を提供するために以下の技術を使用しています。","statementTechnicalList":["HTML5","WAI-ARIA属性","CSS3","JavaScript(ES6以降)"],"statementTechnicalText2":"これらの技術は、認められたアクセシビリティ基準への準拠を支援するために使用されています。","statementThirdParty":"第三者コンテンツ","statementThirdPartyText":"本ウェブサイトの一部には、当社が所有または管理していない第三者コンテンツや統合機能(ソーシャルメディアプラットフォーム、埋め込み動画、外部ウィジェットなど)が含まれる場合があります。そのため、これらの外部コンポーネントのアクセシビリティを保証することはできません。","statementThirdPartyText2":"参考として、以下の第三者プロバイダーのアクセシビリティポリシーを直接ご確認いただけます。","statementThirdPartyLinks":[{"text":"Facebookのアクセシビリティ","url":"https://www.facebook.com/help/accessibility"},{"text":"YouTubeのアクセシビリティ","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Instagramのアクセシビリティ","url":"https://help.instagram.com/650202712454932"},{"text":"Twitterのアクセシビリティ","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"LinkedInのアクセシビリティ","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"継続的な改善とフィードバック","statementFeedbackText":"当社は、ウェブサイトのアクセシビリティ向上に継続的に取り組んでいます。アクセシビリティに関する問題に対応するよう努めておりますが、一部のコンテンツや機能はまだ完全に最適化されていない場合があります。","statementFeedbackText2":"コンテンツへのアクセスに問題がある場合、アクセシビリティの問題に気づいた場合、または改善のご提案がある場合は、ウェブサイト上でご利用いただける「フィードバックを送信」オプションよりご連絡ください。","statementFeedbackText3":"皆様からのフィードバックは、すべての方の利用体験を向上させるために役立てられます。","statementLastUpdated":"最終更新日:"},
296        hi: {"skipToMain":"मुख्य सामग्री पर जाएं","accessibility":"पहुंच-योग्यता","closeToolbar":"पहुंच-योग्यता टूलबार बंद करें","toggleToolbar":"पहुंच-योग्यता टूलबार टॉगल करें","textSize":"टेक्स्ट आकार","increaseText":"टेक्स्ट बड़ा करें","increaseTextAria":"टेक्स्ट का आकार बढ़ाएं","decreaseText":"टेक्स्ट छोटा करें","decreaseTextAria":"टेक्स्ट का आकार घटाएं","contrastColors":"कंट्रास्ट और रंग","highContrast":"उच्च कंट्रास्ट","highContrastAria":"उच्च कंट्रास्ट मोड टॉगल करें","negativeContrast":"नेगेटिव कंट्रास्ट","negativeContrastAria":"नेगेटिव कंट्रास्ट टॉगल करें","grayscale":"ग्रेस्केल","grayscaleAria":"ग्रेस्केल मोड टॉगल करें","readableFont":"पठनीय फ़ॉन्ट","readableFontAria":"पठनीय फ़ॉन्ट का उपयोग करें","highlighting":"हाइलाइटिंग","highlightLinks":"लिंक हाइलाइट करें","highlightLinksAria":"लिंक हाइलाइट करें","highlightTitles":"शीर्षक हाइलाइट करें","highlightTitlesAria":"शीर्षकों को हाइलाइट करें","readingAids":"पठन सहायता","readingGuide":"रीडिंग गाइड","readingGuideAria":"रीडिंग गाइड टॉगल करें","readingMask":"रीडिंग मास्क","readingMaskAria":"रीडिंग मास्क टॉगल करें","textSpacing":"टेक्स्ट स्पेसिंग","textSpacingAria":"टेक्स्ट स्पेसिंग बढ़ाएं","navigationInteraction":"नेविगेशन और इंटरैक्शन","keyboardNav":"कीबोर्ड नेविगेशन","keyboardNavAria":"उन्नत कीबोर्ड नेविगेशन","bigCursor":"बड़ा कर्सर","bigCursorAria":"बड़ा कर्सर","stopAnimations":"एनिमेशन रोकें","stopAnimationsAria":"एनिमेशन रोकें","resetAll":"सभी सेटिंग्स रीसेट करें","resetAllAria":"सभी पहुंच-योग्यता सेटिंग्स रीसेट करें","accessibilityStatement":"पहुंच-योग्यता वक्तव्य","viewStatementAria":"पहुंच-योग्यता वक्तव्य देखें","resetNotification":"सभी पहुंच-योग्यता सेटिंग्स रीसेट कर दी गई हैं।","toolbarAvailable":"पहुंच-योग्यता टूलबार उपलब्ध है। खोलने के लिए Alt+A दबाएं।","accessibilityControls":"पहुंच-योग्यता नियंत्रण","statementTitle":"पहुंच-योग्यता वक्तव्य","closeStatement":"पहुंच-योग्यता वक्तव्य बंद करें","statementCommitment":"पहुंच-योग्यता प्रतिबद्धता","statementCommitmentText":"हम यह सुनिश्चित करने का प्रयास करते हैं कि हमारी वेबसाइट सभी के लिए, जिसमें विकलांग व्यक्ति भी शामिल हैं, सुलभ और उपयोग योग्य हो। इस प्रतिबद्धता के हिस्से के रूप में, हमने एक स्वचालित पहुंच-योग्यता समाधान लागू किया है जो उपयोगिता बढ़ाने और यथासंभव Israeli Standard IS 5568 तथा Web Content Accessibility Guidelines (WCAG) 2.1 Level AA के अनुरूप होने के लिए डिज़ाइन किया गया है।","
296statementCommitmentText2":"पहुंच-योग्यता सुविधाएं एक स्वचालित उपकरण के माध्यम से प्रदान की जाती हैं और हमारी सेवा की शर्तों के अनुसार \"जैसी हैं वैसी\" उपलब्ध कराई जाती हैं। स्वचालित उपकरण अनुपालन में सहायता करते हैं, लेकिन पूर्ण कानूनी अनुपालन के लिए फिर भी साइट-स्तरीय सामग्री और कोड में सुधार की आवश्यकता हो सकती है।","statementEnhancements":"इस वेबसाइट पर उपलब्ध पहुंच-योग्यता सुधार","statementEnhancementsText":"इस वेबसाइट पर स्थापित पहुंच-योग्यता प्रणाली नेविगेशन, पठनीयता और इंटरैक्शन को बेहतर बनाने के लिए कई उपकरण प्रदान करती है, जिनमें शामिल हैं, परंतु इन्हीं तक सीमित नहीं:","statementEnhancementsList":["साइट की सभी कार्यक्षमताओं में पूर्ण कीबोर्ड नेविगेशन समर्थन","समायोज्य फ़ॉन्ट आकार, संरेखण और स्पेसिंग","हल्के और गहरे बैकग्राउंड मोड के लिए कंट्रास्ट नियंत्रण","बेहतर दृश्यता के लिए कस्टम रंग समायोजन","कलर-ब्लाइंड के अनुकूल मोड, जिनमें मोनोक्रोम और कंट्रास्ट मिलान शामिल हैं","पठनीयता के लिए अनुकूलित फ़ॉन्ट विकल्प","वैकल्पिक रंग परिवर्तन के साथ बड़ा कर्सर","सामग्री या कार्यक्षमता खोए बिना 200% तक टेक्स्ट स्केलिंग","लिंक और शीर्षकों पर दृश्य जोर","छवियों के लिए वैकल्पिक टेक्स्ट समर्थन","चयनित सामग्री के लिए टूलटिप स्पष्टीकरण","टेक्स्ट चयन के माध्यम से शब्द परिभाषाएं","पठन सहायता उपकरण, जिनमें रीडिंग गाइड और फोकस मास्क शामिल हैं","झिलमिलाहट, फ्लैशिंग या एनिमेटेड तत्वों को कम करने या रोकने के नियंत्रण"],"statementEnhancementsText2":"ये सुविधाएं दृष्टि, गतिशीलता और संज्ञानात्मक पहुंच-योग्यता आवश्यकताओं वाले उपयोगकर्ताओं की सहायता के लिए बनाई गई हैं।","statementBrowser":"ब्राउज़र और सहायक तकनीक समर्थन","statementBrowserText":"हमारा लक्ष्य आधुनिक ब्राउज़रों और सहायक तकनीकों की एक विस्तृत श्रृंखला का समर्थन करना है। हमारे पहुंच-योग्यता प्रयासों में सामान्य रूप से उपयोग किए जाने वाले प्लेटफ़ॉर्म के लिए परीक्षण और अनुकूलन शामिल है, जिनमें शामिल हैं:","statementBrowserList":["Chrome, Firefox, Edge, Safari, और Opera","स्क्रीन रीडर जैसे VoiceOver (macOS), JAWS, और NVDA (Windows और macOS)"],"statementBrowserText2":"कृपया ध्यान दें कि व्यक्तिगत डिवाइस कॉन्फ़िगरेशन और सहायक तकनीक संयोजनों के आधार पर पहुंच-योग्यता प्रदर्शन भिन्न हो सकता है।","
296statementTechnical":"तकनीकी ढांचा","statementTechnicalText":"यह वेबसाइट सुलभ कार्यक्षमता प्रदान करने के लिए निम्नलिखित तकनीकों पर निर्भर करती है:","statementTechnicalList":["HTML5","WAI-ARIA विशेषताएं","CSS3","JavaScript (ES6 और उससे ऊपर)"],"statementTechnicalText2":"इन तकनीकों का उपयोग मान्यता प्राप्त पहुंच-योग्यता मानकों के अनुपालन का समर्थन करने के लिए किया जाता है।","statementThirdParty":"तृतीय-पक्ष सामग्री","statementThirdPartyText":"इस वेबसाइट के कुछ हिस्सों में तृतीय-पक्ष सामग्री या एकीकरण (जैसे सोशल मीडिया प्लेटफ़ॉर्म, एम्बेडेड वीडियो, या बाहरी विजेट) शामिल हो सकते हैं, जो हमारे स्वामित्व या नियंत्रण में नहीं हैं। परिणामस्वरूप, हम इन बाहरी घटकों की पहुंच-योग्यता की गारंटी नहीं दे सकते।","statementThirdPartyText2":"संदर्भ के लिए, आप इन तृतीय-पक्ष प्रदाताओं की पहुंच-योग्यता नीतियों को सीधे देख सकते हैं:","statementThirdPartyLinks":[{"text":"Facebook पहुंच-योग्यता","url":"https://www.facebook.com/help/accessibility"},{"text":"YouTube पहुंच-योग्यता","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Instagram पहुंच-योग्यता","url":"https://help.instagram.com/650202712454932"},{"text":"Twitter पहुंच-योग्यता","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"LinkedIn पहुंच-योग्यता","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"निरंतर सुधार और प्रतिक्रिया","statementFeedbackText":"हम अपनी वेबसाइट की पहुंच-योग्यता में सुधार के लिए निरंतर प्रयासरत हैं। हालांकि हम पहुंच-योग्यता संबंधी चिंताओं को दूर करने का हर संभव प्रयास करते हैं, फिर भी कुछ सामग्री या सुविधाएं अभी पूरी तरह अनुकूलित नहीं हो सकती हैं।","statementFeedbackText2":"यदि आपको सामग्री तक पहुंचने में कोई कठिनाई होती है, कोई पहुंच-योग्यता समस्या आती है, या आप सुधार सुझाना चाहते हैं, तो हम आपको वेबसाइट पर उपलब्ध \"फीडबैक भेजें\" विकल्प के माध्यम से हमसे संपर्क करने के लिए प्रोत्साहित करते हैं।","statementFeedbackText3":"आपकी प्रतिक्रिया हमें सभी के लिए अनुभव को बेहतर बनाने में मदद करती है।","statementLastUpdated":"अंतिम अद्यतन:"},
297        nl: {"skipToMain":"Naar hoofdinhoud gaan","accessibility":"Toegankelijkheid","closeToolbar":"Toegankelijkheidswerkbalk sluiten","toggleToolbar":"Toegankelijkheidswerkbalk in-/uitschakelen","textSize":"Tekstgrootte","
297increaseText":"Tekst vergroten","increaseTextAria":"Tekstgrootte vergroten","decreaseText":"Tekst verkleinen","decreaseTextAria":"Tekstgrootte verkleinen","contrastColors":"Contrast & Kleuren","highContrast":"Hoog Contrast","highContrastAria":"Hoog contrast in-/uitschakelen","negativeContrast":"Negatief Contrast","negativeContrastAria":"Negatief contrast in-/uitschakelen","grayscale":"Grijstinten","grayscaleAria":"Grijstinten in-/uitschakelen","readableFont":"Leesbaar Lettertype","readableFontAria":"Leesbaar lettertype gebruiken","highlighting":"Markering","highlightLinks":"Links Markeren","highlightLinksAria":"Links markeren","highlightTitles":"Titels Markeren","highlightTitlesAria":"Koppen markeren","readingAids":"Leeshulpmiddelen","readingGuide":"Leeslijn","readingGuideAria":"Leeslijn in-/uitschakelen","readingMask":"Leesmasker","readingMaskAria":"Leesmasker in-/uitschakelen","textSpacing":"Tekstafstand","textSpacingAria":"Tekstafstand vergroten","navigationInteraction":"Navigatie & Interactie","keyboardNav":"Toetsenbordnavigatie","keyboardNavAria":"Verbeterde toetsenbordnavigatie","bigCursor":"Grote Cursor","bigCursorAria":"Grote cursor","stopAnimations":"Animaties Stoppen","stopAnimationsAria":"Animaties stoppen","resetAll":"Alle Instellingen Resetten","resetAllAria":"Alle toegankelijkheidsinstellingen resetten","accessibilityStatement":"Toegankelijkheidsverklaring","viewStatementAria":"Toegankelijkheidsverklaring bekijken","resetNotification":"Alle toegankelijkheidsinstellingen zijn gereset.","toolbarAvailable":"Toegankelijkheidswerkbalk beschikbaar. Druk op Alt+A om te openen.","accessibilityControls":"Toegankelijkheidsopties","statementTitle":"Toegankelijkheidsverklaring","closeStatement":"Toegankelijkheidsverklaring sluiten","statementCommitment":"Toegankelijkheidsverbintenis","statementCommitmentText":"Wij streven ernaar onze website toegankelijk en bruikbaar te maken voor iedereen, inclusief mensen met een beperking. Als onderdeel van deze verbintenis hebben wij een geautomatiseerde toegankelijkheidsoplossing geïmplementeerd die is ontworpen om de bruikbaarheid te verbeteren en zo dicht mogelijk aan te sluiten bij de Israeli Standard IS 5568 en de Web Content Accessibility Guidelines (WCAG) 2.1 Level AA.","statementCommitmentText2":"De toegankelijkheidsfuncties worden aangeboden via een geautomatiseerd hulpmiddel en worden \"als zodanig\" beschikbaar gesteld, in overeenstemming met onze Gebruiksvoorwaarden. Geautomatiseerde hulpmiddelen ondersteunen naleving, maar volledige wettelijke naleving kan nog steeds herstelwerkzaamheden op het niveau van inhoud en code van de site vereisen.","statementEnhancements":"Beschikbare Toegankelijkheidsverbeteringen op Deze Website","statementEnhancementsText":"Het toegankelijkheidssysteem dat op deze website is geïnstalleerd, biedt een reeks hulpmiddelen om navigatie, leesbaarheid en interactie te verbeteren, waaronder onder meer:","statementEnhancementsList":["Volledige ondersteuning van toetsenbordnavigatie voor alle site-functionaliteiten","Aanpasbare lettergrootte, uitlijning en tekstafstand","Contrastregeling voor lichte en donkere achtergrondmodi","Aangepaste kleurinstellingen voor betere zichtbaarheid","Kleurenblindvriendelijke modi, inclusief monochroom en contrastafstemming","Lettertype-opties geoptimaliseerd voor leesbaarheid","Vergrote cursor met optionele kleurwijzigingen","Tekstschaling tot 200% zonder verlies van inhoud of functionaliteit","Visuele accentuering van links en koppen","Ondersteuning voor alternatieve tekst bij afbeeldingen","Tooltip-uitleg bij geselecteerde inhoud","Woordverklaringen via tekstselectie","Leeshulpmiddelen, inclusief leeslijnen en focusmaskers","Bediening om knipperende, flikkerende of geanimeerde elementen te verminderen of te stoppen"],"statementEnhancementsText2":"Deze functies zijn bedoeld om gebruikers met visuele, motorische en cognitieve toegankelijkheidsbehoeften te ondersteunen.","statementBrowser":"Ondersteuning van Browsers en Hulptechnologie","statementBrowserText":"Wij streven ernaar een breed scala aan moderne browsers en hulptechnologieën te ondersteunen. Onze toegankelijkheidsinspanningen omvatten testen en optimalisatie voor veelgebruikte platforms, waaronder:","statementBrowserList":["Chrome, Firefox, Edge, Safari en Opera","Schermlezers zoals VoiceOver (macOS), JAWS en NVDA (Windows & macOS)"],"statementBrowserText2":"Houd er rekening mee dat de toegankelijkheidsprestaties kunnen variëren afhankelijk van individuele apparaatconfiguraties en comb
297inaties van hulptechnologieën.","statementTechnical":"Technisch Kader","statementTechnicalText":"Deze website vertrouwt op de volgende technologieën om toegankelijke functionaliteit te leveren:","statementTechnicalList":["HTML5","WAI-ARIA-attributen","CSS3","JavaScript (ES6 en hoger)"],"statementTechnicalText2":"Deze technologieën worden gebruikt om naleving van erkende toegankelijkheidsnormen te ondersteunen.","statementThirdParty":"Inhoud van Derden","statementThirdPartyText":"Sommige delen van deze website kunnen inhoud of integraties van derden bevatten (zoals socialmediaplatforms, ingesloten video's of externe widgets) die niet door ons worden beheerd of gecontroleerd. Daardoor kunnen wij de toegankelijkheid van deze externe onderdelen niet garanderen.","statementThirdPartyText2":"Voor meer informatie kunt u het toegankelijkheidsbeleid van deze externe aanbieders rechtstreeks raadplegen:","statementThirdPartyLinks":[{"text":"Toegankelijkheid van Facebook","url":"https://www.facebook.com/help/accessibility"},{"text":"Toegankelijkheid van YouTube","url":"https://support.google.com/youtube/topic/9257096"},{"text":"Toegankelijkheid van Instagram","url":"https://help.instagram.com/650202712454932"},{"text":"Toegankelijkheid van Twitter","url":"https://help.twitter.com/en/using-twitter/accessibility-features"},{"text":"Toegankelijkheid van LinkedIn","url":"https://www.linkedin.com/accessibility"}],"statementFeedback":"Voortdurende Verbeteringen & Feedback","statementFeedbackText":"Wij werken voortdurend aan het verbeteren van de toegankelijkheid van onze website. Hoewel wij ons best doen om toegankelijkheidsproblemen aan te pakken, zijn sommige inhoud of functies mogelijk nog niet volledig geoptimaliseerd.","statementFeedbackText2":"Als u problemen ondervindt bij het openen van inhoud, een toegankelijkheidsprobleem tegenkomt of verbeteringen wilt voorstellen, raden wij u aan contact met ons op te nemen via de optie \"Feedback Versturen\" die beschikbaar is op de website.","statementFeedbackText3":"Uw feedback helpt ons de ervaring voor iedereen te verbeteren.","statementLastUpdated":"Laatst Bijgewerkt:"}
298      };
299
300      function t(key) {
301        return translations[currentLang]?.[key] || translations.en[key] || key;
302      }
303
304      function removeExistingAccessibilityUi() {
305        const staleElementIds = [
306          'a11y-toolbar',
307          'a11y-toolbar-header',
308          'a11y-toolbar-title',
309          'a11y-toolbar-content',
310          'a11y-close-btn',
311          'a11y-toggle',
312          'a11y-reading-guide',
313          'a11y-reading-mask',
314          'a11y-font-size-indicator',
315          'a11y-statement-modal',
316          'a11y-statement-content',
317          'a11y-statement-header',
318          'a11y-statement-body',
319          'a11y-statement-title',
320          'a11y-statement-close',
321        ];
322
323        staleElementIds.forEach((id) => {
324          const element = document.getElementById(id);
325          if (element) {
326            element.remove();
327          }
328        });
329
330        document
331          .querySelectorAll('[data-a11y-toolbar-announcement="true"]')
332          .forEach((node) => node.remove());
333
334        // Remove orphan toolbar controls that were persisted without wrapper IDs.
335        document
336          .querySelectorAll('.a11y-control-group, .a11y-reset-btn, .a11y-statement-btn')
337          .forEach((node) => {
338            const parentToolbar = node.closest('#a11y-toolbar');
339            if (!parentToolbar) {
340              node.remove();
341            }
342          });
343      }
344
345      // RTL will be applied in initAccessibility after language is detected
346      // Initialize on DOM ready
347      console.log('📋 Setting up initialization, readyState:', document.readyState);
348      if (document.readyState === 'loading') {
349        console.log('⏳ Document still loading, waiting for DOMContentLoaded...');
350        document.addEventListener('DOMContentLoaded', function() {
351          console.log('✅ DOMContentLoaded fired, initializing...');
352          initAccessibility();
353        });
354      } else {
355        console.log('✅ Document already ready, initializing immediately...');
356        // Small delay to ensure everything is ready, especially in iframes
357        setTimeout(function() {
358          initAccessibility();
359        }, 100);
360      }
361
362      function initAccessibility() {
363        try {
364          console.log('🔧 initAccessibility called');
365          console.log('   Document ready:', document.readyState);
366          console.log('   Body exists:', !!document.body);
367          
368          // Re-detect language now that DOM is ready (important for iframe reloads)
369          currentLang = detectLanguage();
370          console.log('🌐 Language detected in initAccessibility:', currentLang);
371          console.log('   HTML lang attribute:', document.documentElement.lang || document.documentElement.getAttribute('lang'));
372          
373          // Rebuild stale persisted runtime markup so click handlers always exist.
374          if (document.getElementById('a11y-toolbar') || document.getElementById('a11y-toggle')) {
375            console.log('♻️ Existing accessibility UI detected, rebuilding runtime UI');
376            removeExistingAccessibilityUi();
377          }
378          
379          // Wait for body if not ready
380          if (!document.body) {
381            console.log('⏳ Body not ready, retrying in 100ms...');
382            setTimeout(initAccessibility, 100);
383            return;
384          }
385          
386          console.log('✅ Initializing accessibility toolbar for the first time');
387          
388          // Apply accessibility language without changing whole-site direction.
389          // Keep host page dir/lang intact to avoid moving all site content.
390          document.documentElement.setAttribute('data-a11y-language', currentLang);
391          
392          // Add skip to main content link - WCAG 2.4.1
393          addSkipLink();
394          
395          // Enhance semantic structure - WCAG 1.3.1
396          try {
397            enhanceSemanticHTML();
398          } catch (semanticError) {
399            console.warn('⚠️ Error in enhanceSemanticHTML:', semanticError);
400            // Continue initialization even if semantic enhancement fails
401          }
402          
403          // Create accessibility toolbar
404          createAccessibilityToolbar();
405          
406          // Restore saved preferences
407          restoreSavedPreferences();
408          
409          // Add keyboard shortcuts - WCAG 2.1.1
410          setupKeyboardShortcuts();
411          
412          console.log('✅ Accessibility initialization complete');
413        } catch (error) {
414          console.error('❌ Error in initAccessibility:', error);
415          console.error('   Error stack:', error.stack);
416        }
417      }
418
419      function addSkipLink() {
420        // Check if skip link already exists
421        if (document.querySelector('.a11y-skip-link')) {
422          return;
423        }
424        
425        const skipLink = document.createElement('a');
426        skipLink.href = '#main-content';
427        skipLink.className = 'a11y-skip-link';
428        skipLink.textContent = t('skipToMain');
429        skipLink.setAttribute('aria-label', t('skipToMain'));
430        document.body.insertBefore(skipLink, document.body.firstChild);
431
432        skipLink.addEventListener('click', function(e) {
433          e.preventDefault();
434          // Resolve the landmark rather than a hardcoded id: the section that
435          // carries role="main" may keep its OWN id now that we no longer
436          // overwrite it, so #main-content is no longer guaranteed to exist.
437          const main = document.getElementById('main-content')
438            || document.querySelector('main, [role="main"]');
439          if (main) {
440            main.setAttribute('tabindex', '-1');
441            main.focus();
442          }
443        });
444      }
445
446      function enhanceSemanticHTML() {
447        // The landmark id may only be TAKEN when it is free page-wide.
448        //
449        // The guards below ("does this element already have an id?") stop us
450        // overwriting the element's OWN id, but they said nothing about the id
451        // already belonging to some OTHER element. On a page whose layout
452        // wrapper is `<section id="main-content">` with a `<main>` inside it,
453        // stamping the same id on the <main> produced TWO elements with it — so
454        // every `#main-content{...}` rule in the page CSS started matching the
455        // inner <main> as well. Measured on A004814/areas: the wrapper's
456        // `#main-content{display:grid;grid-template-columns:177px 1fr 245px}`
457        // was inherited by the <main>, whose paragraphs collapsed into a 53px
458        // column — one word per line. Reported as "the text is compressed into
459        // narrow vertical columns". As with the sibling bug this function
460        // already carries, the HTML in GCS is correct and only the live DOM is
461        // wrong, which makes it very hard to see.
462        //
463        // A duplicate id is also a WCAG 4.1.1 parsing failure in its own right.
464        // Leaving the element without the id is safe: the skip-link handler
465        // resolves `main, [role="main"]` too, and role="main" is still set.
466        function landmarkIdIsFree() {
467          return !document.getElementById('main-content');
468        }
469
470        // Add main landmark if not present - WCAG 1.3.1
471        let main = document.querySelector('main');
472        if (!main) {
473          main = document.querySelector('[role="main"]');
474          if (!main) {
475            const firstSection = document.querySelector('section') || document.body.children[0];
476            if (firstSection && firstSection.tagName !== 'SCRIPT' && firstSection.tagName !== 'STYLE') {
477              // NEVER overwrite an id or a role the page already has.
478              //
479              // This used to assign both unconditionally. On any page without a
480              // <main>, the first <section>'s id was destroyed at runtime and
481              // every `#that-id{...}` rule in the page CSS stopped matching.
482              // Measured on A004679/treatments-1: `<section id="hero">` styled by
483              // `#hero{margin-top:150px;height:621px;...}` became #main-content,
484              // collapsed to 0px, and the article rendered under the fixed header
485              // — reported as "the page is cut". The HTML in GCS was correct and
486              // only the live DOM was wrong, which makes it very hard to see.
487              //
488              // The guard two lines below (`if (main && !main.id
488)`) already got
489              // this right for the existing-<main> path; this branch had simply
490              // been missed. The skip link no longer depends on the id being
491              // forced — its handler resolves [role="main"] as well.
492              if (!firstSection.id && landmarkIdIsFree()) {
493                firstSection.id = 'main-content';
494              }
495              if (!firstSection.getAttribute('role')) {
496                firstSection.setAttribute('role', 'main');
497              }
498            }
499          }
500        }
501        if (main && !main.id && landmarkIdIsFree()) {
502          main.id = 'main-content';
503        }
504
505        // Add ARIA labels to navigation - WCAG 2.4.1
506        document.querySelectorAll('nav:not([aria-label])').forEach((nav, index) => {
507          nav.setAttribute('aria-label', `Navigation ${index + 1}`);
508        });
509
510        // Add roles to semantic elements - WCAG 1.3.1
511        document.querySelectorAll('header:not([role])').forEach(header => {
512          header.setAttribute('role', 'banner');
513        });
514
515        document.querySelectorAll('footer:not([role])').forEach(footer => {
516          footer.setAttribute('role', 'contentinfo');
517        });
518
519        // Ensure all images have alt text - WCAG 1.1.1
520        document.querySelectorAll('img:not([alt])').forEach(img => {
521          img.setAttribute('alt', 'Image');
522          console.warn('Image missing alt text:', img.src);
523        });
524
525        // Ensure all buttons have labels - WCAG 4.1.2
526        document.querySelectorAll('button:not([aria-label])').forEach(button => {
527          if (!button.textContent.trim() && !button.querySelector('img[alt], [aria-label]')) {
528            button.setAttribute('aria-label', 'Button');
529            console.warn('Button missing label:', button);
530          }
531        });
532
533        // Ensure all links have labels - WCAG 2.4.4
534        document.querySelectorAll('a:not([aria-label])').forEach(link => {
535          if (!link.textContent.trim() && !link.querySelector('img[alt]')) {
536            link.setAttribute('aria-label', 'Link');
537            console.warn('Link missing label:', link);
538          }
539        });
540
541        // Validate form accessibility - WCAG 3.3.2, 4.1.3
542        try {
543          validateFormAccessibility();
544        } catch (formError) {
545          console.warn('⚠️ Error in form accessibility validation:', formError);
546        }
547
548        // Validate heading hierarchy - IS 5568 Section 2.4.10
549        try {
550          validateHeadingHierarchy();
551        } catch (headingError) {
552          console.warn('⚠️ Error in heading hierarchy validation:', headingError);
553        }
554
555        // Validate media accessibility - IS 5568 Level AA/AAA
556        try {
557          validateMediaAccessibility();
558        } catch (mediaError) {
559          console.warn('⚠️ Error in media accessibility validation:', mediaError);
560        }
561
562        // Validate language of parts - WCAG 3.1.2 (skipped for Hebrew per IS 5568)
563        try {
564          validateLanguageOfParts();
565        } catch (langError) {
566          console.warn('⚠️ Error in language of parts validation:', langError);
567        }
568      }
569
570      function validateHeadingHierarchy() {
571        // IS 5568 Part 1 (2021) Section 2.4.10: Heading hierarchy validation (Level AA requirement)
572        // Note: In IS 5568, heading hierarchy is upgraded from WCAG AAA to Level AA
573        const headings = Array.from(document.querySelectorAll('h1, h2, h3, h4, h5, h6')).filter(function(h) {
574          return !h.closest('[data-initial-load-popup]');
575        });
576        const issues = [];
577
578        // Check 1: No headings at all
579        if (headings.length === 0) {
580          const hasTextContent = document.body.textContent && document.body.textContent.trim().length > 100;
581          if (hasTextContent) {
582            issues.push({
583              type: 'missing-headings',
584              severity: 'error',
585              message: 'Page contains text content but no heading tags (h1-h6) found. IS 5568 requires hierarchical headings for pages with text content.',
586              suggestion: 'Add at least one h1 heading for the main page title, followed by h2-h6 for section headings.',
587              standard: 'IS 5568 Part 1 (2021) Section 2.4.10 - Level AA'
588            });
589          }
590        } else {
591          // Check 2: Missing h1 (Level AA violation - HIGH PRIORITY)
592          const hasH1 = headings.some(h => h.tagName === 'H1');
593          if (!hasH1) {
594            issues.push({
595              type: 'missing-h1',
596              severity: 'error',
597              message: 'Page is missing an h1 heading. IS 5568 Level AA requires exactly one h1 for the main page title.',
598              suggestion: 'Add an h1 tag with the main page title. This is a Level AA requirement in IS 5568.',
599              standard: 'IS 5568 Part 1 (2021) Section 2.4.10 - Level AA'
600            });
601          }
602
603          // Check 3: Multiple h1 tags (Level AA violation - HIGH PRIORITY)
604          const h1Count = headings.filter(h => h.tagName === 'H1').length;
605          if (h1Count > 1) {
606            issues.push({
607              type: 'multiple-h1',
608              severity: 'error',
609              message: 'Page contains ' + h1Count + ' h1 headings. IS 5568 Level AA requires exactly one h1 per page.',
610              suggestion: 'Convert additional h1 tags to h2 or lower level headings. Only one h1 is allowed per page.',
611              standard: 'IS 5568 Part 1 (2021) Section 2.4.10 - Level AA'
612            });
613          }
614
615          // Check 4: Skipped heading levels
616          let previousLevel = 0;
617          const skippedLevels = [];
618          
619          headings.forEach((heading, index) => {
620            const currentLevel = parseInt(heading.tagName.substring(1));
621            
622            if (previousLevel > 0) {
623              const levelDiff = currentLevel - previousLevel;
624              
625              // Skipped levels (e.g., h1 to h3, skipping h2)
626              if (levelDiff > 1) {
627                const skipped = [];
628                for (let i = previousLevel + 1; i < currentLevel; i++) {
629                  skipped.push('h' + i);
630                }
631                skippedLevels.push({
632                  from: 'h' + previousLevel,
633                  to: 'h' + currentLevel,
634                  skipped: skipped,
635                  element: heading,
636                  index: index
637                });
638              }
639            }
640            
641            previousLevel = currentLevel;
642          });
643
644          if (skippedLevels.length > 0) {
645            skippedLevels.forEach(skip => {
646              issues.push({
647                type: 'skipped-level',
648                severity: 'error',
649                message: 'Skipped heading level: Found ' + skip.to + ' after ' + skip.from + ', missing ' + skip.skipped.join(', ') + '. IS 5568 Level AA requires sequential heading hierarchy.',
650                suggestion: 'Change the ' + skip.to + ' to ' + skip.skipped[0] + ' or add the missing ' + skip.skipped.join(' and ') + ' heading(s) before it. Headings must be sequential (h1→h2→h3, etc.).',
651                element: skip.element,
652                standard: 'IS 5568 Part 1 (2021) Section 2.4.10 - Level AA'
653              });
654            });
655          }
656
657          // Check 5: Heading levels that are too deep (h5, h6 are rarely needed)
658          // Note: This is informational only, not a Level AA violation
659          const deepHeadings = headings.filter(h => {
660            const level = parseInt(h.tagName.substring(1));
661            return level >= 5;
662          });
663          
664          if (deepHeadings.length > 0) {
665            issues.push({
666              type: 'deep-headings',
667              severity: 'info',
668              message: 'Found ' + deepHeadings.length + ' deep heading(s) (h5-h6). Consider restructuring content to use h2-h4 instead for better navigation.',
669              suggestion: 'Restructure content hierarchy to use h2-h4 headings for better navigation. Deep headings (h5-h6) are allowed but may indicate overly complex structure.',
670              standard: 'IS 5568 Part 1 (2021) Section 2.4.10 - Best Practice'
671            });
672          }
673        }
674
675        // Display issues if any found
676        if (issues.length > 0) {
677          console.group('⚠️ IS 5568 Part 1 (2021) Section 2.4.10 - Heading Hierarchy Issues Detected (Level AA)');
678          issues.forEach((issue, index) => {
679            const severityLabel = issue.severity === 'error' ? '🔴 HIGH PRIORITY (Level AA Violation)' : 
680                                 issue.severity === 'warning' ? '🟡 WARNING' : 'ℹ️ INFO';
681            console.groupCollapsed((index + 1) + '. ' + issue.type + ' - ' + severityLabel);
682            console.log('Message:', issue.message);
683            console.log('Suggestion:', issue.suggestion);
684            console.log('Standard:', issue.standard);
685            if (issue.element) {
686              console.log('Element:', issue.element);
687              console.log('Element text:', issue.element.textContent ? issue.element.textContent.substring(0, 50) : '');
688            }
689            console.groupEnd();
690          });
691          console.groupEnd();
692
693          // Audit details stay in the console only — no on-page banners for visitors or editors.
694        } else {
695          console.log('✅ IS 5568 Part 1 (2021) Section 2.4.10 Level AA: Heading hierarchy is valid');
696        }
697      }
698
699      function validateFormAccessibility() {
700        // WCAG 3.3.2 (Labels or Instructions) and 4.1.3 (Status Messages)
701        const formInputs = Array.from(document.querySelectorAll('input, textarea, select'));
702        const issues = [];
703        const forms = Array.from(document.querySelectorAll('form'));
704
705        // Validate each form input
706        formInputs.forEach(function(input, index) {
707          const inputIssues = [];
708          const inputId = input.id;
709          const inputType = input.type || input.tagName.toLowerCase();
710          const inputEl = input;
711          const isHidden = inputType === 'hidden' || input.hasAttribute('hidden') || 
712                          (inputEl.style && inputEl.style.display === 'none') ||
713                          (inputEl.style && inputEl.style.visibility === 'hidden');
714
715          // Skip hidden inputs
716          if (isHidden) {
717            return;
718          }
719
720          // Check 1: Programmatically associated label (WCAG 3.3.2)
721          let hasLabel = false;
722          let labelMethod = '';
723
724          // Method 1: Explicit label with 'for' attribute
725          if (inputId) {
726            const labelByFor = document.querySelector('label[for="' + inputId + '"]');
727            if (labelByFor) {
728              hasLabel = true;
729              labelMethod = 'label[for]';
730            }
731          }
732
733          // Method 2: Implicit label (input nested inside label)
734          if (!hasLabel) {
735            const implicitLabel = input.closest('label');
736            if (implicitLabel) {
737              hasLabel = true;
738              labelMethod = 'implicit (nested)';
739            }
740          }
741
742          // Method 3: aria-labelledby
743          if (!hasLabel && input.getAttribute('aria-labelledby')) {
744            const labelledBy = input.getAttribute('aria-labelledby');
745            const labelElement = document.getElementById(labelledBy || '');
746            if (labelElement) {
747              hasLabel = true;
748              labelMethod = 'aria-labelledby';
749            }
750          }
751
752          // Method 4: aria-label (acceptable but not preferred)
753          if (!hasLabel && input.getAttribute('aria-label')) {
754            hasLabel = true;
755            labelMethod = 'aria-label';
756          }
757
758          // Method 5: title attribute (not ideal but acceptable as fallback)
759          if (!hasLabel && input.getAttribute('title')) {
760            hasLabel = true;
761            labelMethod = 'title (not recommended)';
762          }
763
764          if (!hasLabel) {
765            inputIssues.push({
766              type: 'missing-label',
767              severity: 'error',
768              message: 'Form input is missing a programmatically associated label.',
769              suggestion: 'Add a <label> element with for attribute matching the input id, nest the input inside a <label>, or add aria-labelledby/aria-label attribute.',
770              standard: 'WCAG 3.3.2',
771              element: input
772            });
773          } else if (labelMethod === 'title (not recommended)') {
774            inputIssues.push({
775              type: 'title-as-label',
776              severity: 'warning',
777              message: 'Form input uses title attribute as label, which is not ideal for accessibility.',
778              suggestion: 'Replace title with a proper <label> element with for attribute or use aria-label.',
779              standard: 'WCAG 3.3.2',
780              element: input
781            });
782          }
783
784          // Check 2: Form validation error announcements (WCAG 4.1.3)
785          const form = input.closest('form');
786          if (form) {
787            const hasAriaInvalid = input.hasAttribute('aria-invalid');
788            const hasErrorId = input.getAttribute('aria-describedby');
789            
790            // Check if there's an error message element
791            let hasErrorMessage = false;
792            if (hasErrorId) {
793              const errorElement = document.getElementById(hasErrorId);
794              if (errorElement) {
795                hasErrorMessage = true;
796                // Check if error element has aria-live
797                const errorHasAriaLive = errorElement.getAttribute('aria-live') || 
798                                        errorElement.closest('[aria-live]');
799                if (!errorHasAriaLive) {
800                  inputIssues.push({
801                    type: 'error-not-announced',
802                    severity: 'warning',
803                    message: 'Form input has error message but it is not announced to screen readers via aria-live.',
804                    suggestion: 'Add aria-live="polite" or aria-l
804ive="assertive" to the error message element, or wrap it in a container with aria-live.',
805                    standard: 'WCAG 4.1.3',
806                    element: input
807                  });
808                }
809              }
810            }
811
812            // Check if input has validation state but no error announcement
813            if (hasAriaInvalid && input.getAttribute('aria-invalid') === 'true' && !hasErrorMessage) {
814              inputIssues.push({
815                type: 'invalid-without-message',
816                severity: 'error',
817                message: 'Form input is marked as invalid (aria-invalid="true") but has no associated error message.',
818                suggestion: 'Add an error message element and link it using aria-describedby, or ensure the error is announced via aria-live region.',
819                standard: 'WCAG 4.1.3',
820                element: input
821              });
822            }
823          }
824
825          if (inputIssues.length > 0) {
826            issues.push({
827              inputType: inputType,
828              index: index + 1,
829              element: input,
830              issues: inputIssues
831            });
832          }
833        });
834
835        // Validate forms for error announcement regions
836        forms.forEach(function(form, formIndex) {
837          const formIssues = [];
838          
839          // Check if form has validation errors indicated only by color
840          const colorOnlyErrors = form.querySelectorAll('.error, .invalid, [class*="error"], [class*="invalid"]');
841          let hasColorOnlyIndication = false;
842          
843          colorOnlyErrors.forEach(function(errorEl) {
844            // Check if error is only indicated by color (red border/background) without text or aria
845            const hasText = errorEl.textContent && errorEl.textContent.trim().length > 0;
846            const hasAria = errorEl.getAttribute('aria-label') || 
847                           errorEl.getAttribute('aria-describedby') ||
848                           errorEl.getAttribute('aria-live') ||
849                           errorEl.getAttribute('role') === 'alert';
850            
851            if (!hasText && !hasAria) {
852              // Check if parent input has aria-describedby pointing to this
853              let parentInput = errorEl.closest('input, textarea, select');
854              
855              // If no closest input found, check previous sibling
856              if (!parentInput && errorEl.previousElementSibling) {
857                const prevSibling = errorEl.previousElementSibling;
858                if (prevSibling && prevSibling.nodeType === 1 && // Node.ELEMENT_NODE
859                    (prevSibling.tagName === 'INPUT' || 
860                     prevSibling.tagName === 'TEXTAREA' ||
861                     prevSibling.tagName === 'SELECT')) {
862                  parentInput = prevSibling;
863                }
864              }
865              
866              // Only check getAttribute if parentInput is actually an Element
867              if (parentInput && parentInput.nodeType === 1 && typeof parentInput.getAttribute === 'function' && !parentInput.getAttribute('aria-describedby')) {
868                hasColorOnlyIndication = true;
869              }
870            }
871          });
872
873          if (hasColorOnlyIndication) {
874            formIssues.push({
875              type: 'color-only-errors',
876              severity: 'error',
877              message: 'Form validation errors are indicated only by color (red border/background) without text or screen reader announcements.',
878              suggestion: 'Add visible error text and link it to inputs using aria-describedby. Ensure errors are announced via aria-live="polite" or role="alert".',
879              standard: 'WCAG 1.4.1, 4.1.3',
880              element: form
881            });
882          }
883
884          if (!form.querySelector('[aria-live], [role="alert"]') && form.querySelector('input[aria-invalid="true"], textarea[aria-invalid="true"], select[aria-invalid="true"]')) {
885            formIssues.push({
886              type: 'no-error-announcement',
887              severity: 'warning',
888              message: 'Form has validation errors but no aria-live region to announce them to screen readers.',
889              suggestion: 'Add an aria-live="polite" or aria-live="assertive" region to the form, or use role="alert" for critical errors.',
890              standard: 'WCAG 4.1.3',
891              element: form
892            });
893          }
894
895          if (formIssues.length > 0) {
896            issues.push({
897              inputType: 'form',
898              index: formIndex + 1,
899              element: form,
900              issues: formIssues
901            });
902          }
903        });
904
905        // Enhance forms: Add aria-live regions if missing
906        forms.forEach(function(form) {
907          if (!form.querySelector('[aria-live], [role="alert"]')) {
908            // Create aria-live region for form errors
909            const liveRegion = document.createElement('div');
910            liveRegion.id = 'a11y-form-errors-' + (form.id || Math.random().toString(36).substr(2, 9));
911            liveRegion.setAttribute('aria-live', 'polite');
912            liveRegion.setAttribute('aria-atomic', 'true');
913            liveRegion.className = 'sr-only';
914            liveRegion.style.cssText = 'position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0;';
915            form.appendChild(liveRegion);
916
917            // Monitor form for validation errors and announce them
918            const inputs = form.querySelectorAll('input, textarea, select');
919            inputs.forEach(function(input) {
920              input.addEventListener('invalid', function(e) {
921                const target = e.target;
922                const errorMessage = target.validationMessage || 'Invalid input';
923                liveRegion.textContent = errorMessage;
924                
925                // Also set aria-invalid if not already set
926                if (!target.getAttribute('aria-invalid')) {
927                  target.setAttribute('aria-invalid', 'true');
928                }
929                
930                // Link error message if not already linked
931                if (!target.getAttribute('aria-describedby')) {
932                  const errorId = 'a11y-error-' + (target.id || Math.random().toString(36).substr(2, 9));
933                  target.setAttribute('aria-describedby', errorId);
934                  
935                  // Create or update error message element
936                  let errorEl = document.getElementById(errorId);
937                  if (!errorEl) {
938                    errorEl = document.createElement('div');
939                    errorEl.id = errorId;
940                    errorEl.className = 'a11y-error-message';
941                    errorEl.setAttribute('role', 'alert');
942                    errorEl.setAttribute('aria-live', 'polite');
943                    if (target.parentNode) {
944                      target.parentNode.insertBefore(errorEl, target.nextSibling);
945                    }
946                  }
947                  errorEl.textContent = errorMessage;
948                }
949              });
950
951              input.addEventListener('input', function(e) {
952                const target = e.target;
953                // Clear error state when user starts typing
954                if (target.getAttribute('aria-invalid') === 'true' && target.validity && target.validity.valid) {
955                  target.setAttribute('aria-invalid', 'false');
956                  const errorId = target.getAttribute('aria-describedby');
957                  if (errorId) {
958                    const errorEl = document.getElementById(errorId);
959                    if (errorEl) {
960                      errorEl.textContent = '';
961                    }
962                  }
963                  liveRegion.textContent = '';
964                }
965              });
966            });
967          }
968        });
969
970        // Display issues if any found
971        if (issues.length > 0) {
972          console.group('⚠️ WCAG 3.3.2, 4.1.3 - Form Accessibility Issues Detected');
973          issues.forEach(function(formItem, formIndex) {
974            console.groupCollapsed((formItem.inputType === 'form' ? 'FORM' : formItem.inputType.toUpperCase()) + ' ' + formItem.index + ' - ' + formItem.issues.length + ' issue(s)');
975            formItem.issues.forEach(function(issue, issueIndex) {
976              console.groupCollapsed((issueIndex + 1) + '. ' + issue.type + ' (' + issue.severity + ')');
977              console.log('Message:', issue.message);
978              console.log('Suggestion:', issue.suggestion);
979              console.log('Standard:', issue.standard);
980              console.log('Element:', issue.element);
981              console.log('Element id:', issue.element.id || 'No ID');
982              console.log('Element name:', issue.element.getAttribute('name') || 'No name');
983              console.groupEnd();
984            });
985            console.groupEnd();
986          });
987          console.groupEnd();
988
989          // Form audit: console only (no fixed banners on the live page).
990        } else if (formInputs.length > 0) {
991          console.log('✅ WCAG 3.3.2, 4.1.3: All form inputs have proper labels and error announcements');
992        }
993      }
994
995      function validateMediaAccessibility() {
996        // IS 5568 Part 1 (2021) Media accessibility validation
997        // Note: Several requirements upgraded from WCAG Level A to Level AA, and Level AA to Level AAA
998        const videos = Array.from(document.querySelectorAll('video'));
999        const audios = Array.from(document.querySelectorAll('audio'));
1000        const issues = [];
1001
1002        // Validate video elements
1003        videos.forEach((video, index) => {
1004          const videoIssues = [];
1005
1006          // Check if video is video-only (no audio track)
1007          const isVideoOnly = !video.muted && video.volume === 0 || 
1008                             video.hasAttribute('data-video-only') ||
1009                             video.getAttribute('aria-label')?.toLowerCase().includes('video-only') ||
1010                             video.getAttribute('aria-label')?.toLowerCase().includes('silent');
1011
1012          // Check 1: Missing captions/subtitles (SRT/VTT) - IS 5568 Part 1 (2021) Section 1.2.2 Level AA (upgraded from WCAG Level A)
1013          const tracks = video.querySelectorAll('track');
1014          const hasCaptions = Array.from(tracks).some(track => {
1015            const kind = track.getAttribute('kind');
1016            return kind === 'captions' || kind === 'subtitles';
1017          });
1018
1019          if (!hasCaptions) {
1020            videoIssues.push({
1021              type: 'missing-captions',
1022              severity: 'error',
1023              message: 'Video element is missing captions or subtitles (SRT/VTT files). IS 5568 Part 1 (2021) requires captions at Level AA.',
1024              suggestion: 'Add <track> elements with kind="captions" or kind="subtitles" and src attribute pointing to .srt or .vtt files. This is a Level AA requirement in IS 5568.',
1025              standard: 'IS 5568 Part 1 (2021) Section 1.2.2 - Level AA',
1026              element: video
1027            });
1028          }
1029
1030          // Check 1.2.1: Video-only content needs text alternative - IS 5568 Part 1 (2021) Level AA (upgraded from WCAG Level A)
1031          if (isVideoOnly) {
1032            const hasVideoOnlyAlternative = video.getAttribute('data-text-alternative') ||
1033                                          video.getAttribute('aria-describedby') ||
1034                                          video.closest('[data-text-alternative]') ||
1035                                          document.querySelector('a[href*="alternative"][aria-describedby="' + (video.id || 'video-' + index) + '"]');
1036            
1037            if (!hasVideoOnlyAlternative) {
1038              videoIssues.push({
1039                type: 'video-only-missing-alternative',
1040                severity: 'error',
1041                message: 'Video-only content (no audio) is missing a text alternative. IS 5568 Part 1 (2021) requires text alternatives for video-only at Level AA.',
1042                suggestion: 'Add a text alternative describing the video content using data-text-alternative attribute, aria-describedby, or a nearby text description link.',
1043                standard: 'IS 5568 Part 1 (2021) Section 1.2.1 - Level AA',
1044                element: video
1045              });
1046            }
1047          }
1048
1049          // Check 1.2.3: Audio description or media alternative - IS 5568 Part 1 (2021) Level AA (upgraded from WCAG Level A)
1050          const hasAudioDescription = Array.from(tracks).some(track => {
1051            const kind = track.getAttribute('kind');
1052            return kind === 'descriptions';
1053          });
1054          const hasMediaAlternative = video.getAttribute('data-media-alternative') ||
1055                                    video.getAttribute('aria-describedby') ||
1056                                    video.closest('[data-media-alternative]');
1057
1058          if (!hasAudioDescription && !hasMediaAlternative && !isVideoOnly) {
1059            videoIssues.push({
1060              type: 'missing-audio-description',
1061              severity: 'error',
1062              message: 'Video with audio is missing audio description or media alternative. IS 5568 Part 1 (2021) requires this at Level AA.',
1063              suggestion: 'Add <track> element with kind="descriptions" for audio description, or provide a media alternative (text version) using data-media-alternative attribute.',
1064              standard: 'IS 5568 Part 1 (2021) Section 1.2.3 - Level AA',
1065              element: video
1066            });
1067          }
1068
1069          // Check 1.2.4: Live captions - IS 5568 Part 1 (2021) Level AAA (upgraded from WCAG Level AA)
1070          const isLive = video.hasAttribute('data-live') ||
1071                        video.getAttribute('aria-label')?.toLowerCase().includes('live') ||
1072                        video.closest('[data-live]');
1073          
1074          if (isLive) {
1075            const hasLiveCaptions = Array.from(tracks).some(track => {
1076              const kind = track.getAttribute('kind');
1077              const srclang = track.getAttribute('srclang');
1078              return (kind === 'captions' || kind === 'subtitles') && track.getAttribute('data-live') === 'true';
1079            });
1080
1081            if (!hasLiveCaptions) {
1082              videoIssues.push({
1083                type: 'missing-live-captions',
1084                severity: 'warning',
1085                message: 'Live video is missing live captions. IS 5568 Part 1 (2021) requires live captions at Level AAA (can be provided on demand).',
1086                suggestion: 'Add live captions via <track> element with kind="captions" and data-live="true", or note that live captions are available upon request.',
1087                standard: 'IS 5568 Part 1 (2021) Section 1.2.4 - Level AAA (Request on Demand)',
1088                element: video
1089              });
1090            }
1091          }
1092
1093          // Check 1.2.5: Audio description (extended) - IS 5568 Part 1 (2021) Level AAA (upgraded from WCAG Level AA)
1094          // Note: This is for extended audio description, not the basic one (1.2.3)
1095          const hasExtendedAudioDescription = video.getAttribute('data-extended-audio-description') ||
1096                                             Array.from(tracks).some(track => {
1097                                               return track.getAttribute('kind') === 'descriptions' && 
1098                                                      track.getAttribute('data-extended') === 'true';
1099                                             });
1100
1101          if (!hasExtendedAudioDescription && !isVideoOnly && !isLive) {
1102            // This is informational - extended audio description is Level AAA and can be on demand
1103            videoIssues.push({
1104              type: 'missing-extended-audio-description',
1105              severity: 'info',
1106              message: 'Video may benefit from extended audio description. IS 5568 Part 1 (2021) requires extended audio description at Level AAA (can be provided on demand).',
1107              suggestion: 'Consider adding extended audio description for complex visual content, or note that extended audio description is available upon request.',
1108              standard: 'IS 5568 Part 1 (2021) Section 1.2.5 - Level AAA (Request on Demand)',
1109              element: video
1110            });
1111          }
1112
1113          // Check 2: Missing transcript link/alternative (for pre-recorded video) - IS 5568 Level AAA
1114          if (!isLive) {
1115            const hasTranscript = video.getAttribute('data-transcript') || 
1116                                 video.getAttribute('aria-describedby') ||
1117                                 video.closest('[data-transcript]') ||
1118                                 document.querySelector('a[href*="transcript"][aria-describedby="' + (video.id || 'video-' + index) + '"]') ||
1119                                 (video.id && document.querySelector('a[href*="transcript"]')?.getAttribute('aria-describedby') === video.id);
1120
1121            if (!hasTranscript) {
1122              videoIssues.push({
1123                type: 'missing-transcript',
1124                severity: 'warning',
1125                message: 'Pre-recorded video element does not have a transcript or text alternative link.',
1126                suggestion: 'Add a transcript link near the video using data-transcript attribute or aria-describedby pointing to a transcript element/link.',
1127                standard: 'IS 5568 Part 1 (2021) Section 1.2.1 - Level AAA',
1128                element: video
1129              });
1130            }
1131          }
1132
1133          // Check 3: Missing accessible controls
1134          const hasControls = video.hasAttribute('controls');
1135          const hasCustomControls = video.querySelector('button[aria-label*="play"], button[aria-label*="pause"]') ||
1136                                   video.closest('.video-player, .media-player, [role="application"]');
1137
1138          if (!hasControls && !hasCustomControls) {
1139            videoIssues.push({
1140              type: 'missing-controls',
1141              severity: 'error',
1142              message: 'Video element lacks accessible controls (native controls attribute or custom accessible controls).',
1143              suggestion: 'Add controls attribute to video element, or implement custom controls with proper ARIA labels and keyboard support.',
1144              standard: 'IS 5568 Part 1 (2021) Section 1.2.2 - Level AA',
1145              element: video
1146            });
1147          }
1148
1149          // Check 4: Missing title or aria-label
1150          const hasTitle = video.getAttribute('title') || 
1151                          video.getAttribute('aria-label') ||
1152                          video.getAttribute('aria-labelledby');
1153
1154          if (!hasTitle) {
1155            videoIssues.push({
1156              type: 'missing-title',
1157              severity: 'warning',
1158              message: 'Video element is missing a title or aria-label for screen readers.',
1159              suggestion: 'Add title or aria-label attribute describing the video content.',
1160              standard: 'IS 5568 Part 1 (2021) Section 1.2.1 - Level AA',
1161              element: video
1162            });
1163          }
1164
1165          // Check 5: Autoplay without controls (accessibility issue)
1166          if (video.hasAttribute('autoplay') && !hasControls && !hasCustomControls) {
1167            videoIssues.push({
1168              type: 'autoplay-without-controls',
1169              severity: 'error',
1170              message: 'Video has autoplay but no accessible controls to stop it.',
1171              suggestion: 'Remove autoplay attribute or add controls attribute. Autoplaying media should be controllable by users.',
1172              standard: 'IS 5568 Part 1 (2021) Section 1.2.2 - Level AA',
1173              element: video
1174            });
1175          }
1176
1177          if (videoIssues.length > 0) {
1178            issues.push({
1179              mediaType: 'video',
1180              index: index + 1,
1181              element: video,
1182              issues: videoIssues
1183            });
1184          }
1185        });
1186
1187        // Validate audio elements
1188        audios.forEach((audio, index) => {
1189          const audioIssues = [];
1190
1191          // Check if audio is live
1192          const isLive = audio.hasAttribute('data-live') ||
1193                        audio.getAttribute('aria-label')?.toLowerCase().includes('live') ||
1194                        audio.closest('[data-live]');
1195
1196          // Check 1.2.1: Audio-only content needs text alternative - IS 5568 Part 1 (2021) Level AA (upgraded from WCAG Level A)
1197          const hasTranscript = audio.getAttribute('data-transcript') || 
1198                               audio.getAttribute('aria-describedby') ||
1199                               audio.closest('[data-transcript]') ||
1200                               document.querySelector('a[href*="transcript"][aria-describedby="' + (audio.id || 'audio-' + index) + '"]') ||
1201                               (audio.id && document.querySelector('a[href*="transcript"]')?.getAttribute('aria-describedby') === audio.id);
1202
1203          if (!hasTranscript && !isLive) {
1204            audioIssues.push({
1205              type: 'missing-transcript',
1206              severity: 'error',
1207              message: 'Audio element is missing a transcript or text alternative. IS 5568 Part 1 (2021) requires text alternatives for audio-only at Level AA.',
1208              suggestion: 'Add a transcript link using data-transcript attribute or aria-describedby pointing to a transcript element/link. This is a Level AA requirement in IS 5568.',
1209              standard: 'IS 5568 Part 1 (2021) Section 1.2.1 - Level AA',
1210              element: audio
1211            });
1212          }
1213
1214          // Check 1.2.4: Live captions for live audio - IS 5568 Part 1 (2021) Level AAA (upgraded from WCAG Level AA)
1215          if (isLive) {
1216            const hasLiveCaptions = audio.getAttribute('data-live-captions') === 'true' ||
1217                                   audio.getAttribute('data-live-transcript') === 'true';
1218
1219            if (!hasLiveCaptions) {
1220              audioIssues.push({
1221                type: 'missing-live-captions',
1222                severity: 'warning',
1223                message: 'Live audio is missing live captions/transcript. IS 5568 Part 1 (2021) requires live captions at Level AAA (can be provided on demand).',
1224                suggestion: 'Provide live captions or transcript for live audio, or note that live captions are available upon request.',
1225                standard: 'IS 5568 Part 1 (2021) Section 1.2.4 - Level AAA (Request on Demand)',
1226                element: audio
1227              });
1228            }
1229          }
1230
1231          // Check 2: Missing accessible controls - IS 5568 Part 1 (2021) Level AA
1232          const hasControls = audio.hasAttribute('controls');
1233          const hasCustomControls = audio.querySelector('button[aria-label*="play"], button[aria-label*="pause"]') ||
1234                                   audio.closest('.audio-player, .media-player, [role="application"]');
1235
1236          if (!hasControls && !hasCustomControls) {
1237            audioIssues.push({
1238              type: 'missing-controls',
1239              severity: 'error',
1240              message: 'Audio element lacks accessible controls (native controls attribute or custom accessible controls).',
1241              suggestion: 'Add controls attribute to audio element, or implement custom controls with proper ARIA labels and keyboard support.',
1242              standard: 'IS 5568 Part 1 (2021) Section 1.2.2 - Level AA',
1243              element: audio
1244            });
1245          }
1246
1247          // Check 3: Missing title or aria-label
1248          const hasTitle = audio.getAttribute('title') || 
1249                          audio.getAttribute('aria-label') ||
1250                          audio.getAttribute('aria-labelledby');
1251
1252          if (!hasTitle) {
1253            audioIssues.push({
1254              type: 'missing-title',
1255              severity: 'warning',
1256              message: 'Audio element is missing a title or aria-label for screen readers.',
1257              suggestion: 'Add title or aria-label attribute describing the audio content.',
1258              standard: 'IS 5568 Level AA',
1259              element: audio
1260            });
1261          }
1262
1263          // Check 4: Autoplay without controls
1264          if (audio.hasAttribute('autoplay') && !hasControls && !hasCustomControls) {
1265            audioIssues.push({
1266              type: 'autoplay-without-controls',
1267              severity: 'error',
1268              message: 'Audio has autoplay but no accessible controls to stop it.',
1269              suggestion: 'Remove autoplay attribute or add controls attribute. Autoplaying media should be controllable by users.',
1270              standard: 'IS 5568 Part 1 (2021) Section 1.2.2 - Level AA',
1271              element: audio
1272            });
1273          }
1274
1275          if (audioIssues.length > 0) {
1276            issues.push({
1277              mediaType: 'audio',
1278              index: index + 1,
1279              element: audio,
1280              issues: audioIssues
1281            });
1282          }
1283        });
1284
1285        // Display issues if any found
1286        if (issues.length > 0) {
1287          console.group('⚠️ IS 5568 Part 1 (2021) - Media Accessibility Issues Detected');
1288          issues.forEach((mediaItem, mediaIndex) => {
1289            console.groupCollapsed(mediaItem.mediaType.toUpperCase() + ' ' + mediaItem.index + ' - ' + mediaItem.issues.length + ' issue(s)');
1290            mediaItem.issues.forEach((issue, issueIndex) => {
1291              const severityLabel = issue.severity === 'error' ? '🔴 HIGH PRIORITY (Level AA Violation)' : 
1292                                   issue.severity === 'warning' ? '🟡 WARNING (Level AAA)' : 
1293                                   issue.severity === 'info' ? 'ℹ️ INFO (Level AAA - Request on Demand)' : issue.severity;
1294              console.groupCollapsed((issueIndex + 1) + '. ' + issue.type + ' - ' + severityLabel);
1295              console.log('Message:', issue.message);
1296              console.log('Suggestion:', issue.suggestion);
1297              console.log('Standard:', issue.standard);
1298              console.log('Element:', issue.element);
1299              console.log('Element src:', issue.element.src || issue.element.getAttribute('src') || 'N/A');
1300              console.log('Element id:', issue.element.id || 'No ID');
1301              console.groupEnd();
1302            });
1303            console.groupEnd();
1304          });
1305          console.groupEnd();
1306
1307          // Media audit: console only (no fixed banners).
1308        } else if (videos.length > 0 || audios.length > 0) {
1309          console.log('✅ IS 5568 Part 1 (2021): All media elements have proper accessibility features');
1310        }
1311      }
1312
1313      function validateLanguageOfParts() {
1314        // WCAG 3.1.2: Language of Parts
1315        // IS 5568 Part 1 (2021) Exception: This check does NOT apply to Hebrew pages using UTF-8 encoding,
1316        // as screen readers can automatically identify language changes in Hebrew text.
1317        
1318        // Get primary document language
1319        const primaryLang = document.documentElement.lang || document.documentElement.getAttribute('lang') || '';
1320        const primaryLangCode = primaryLang.toLowerCase().split('-')[0];
1321        
1322        // Skip validation for Hebrew pages per IS 5568 Part 1 (2021)
1323        if (primaryLangCode === 'he') {
1324          console.log('ℹ️ IS 5568 Part 1 (2021): Language of Parts (Section 3.1.2) check skipped for Hebrew pages.');
1325          console.log('   Reason: Screen readers can automatically identify language changes in UTF-8 encoded Hebrew text.');
1326          console.log('   No lang attributes required on individual phrases or parts when primary document language is Hebrew.');
1327          return;
1328        }
1329        
1330        // For non-Hebrew pages, check for elements with lang attributes that differ from parent
1331        // This helps identify potential language changes that should be marked
1332        const issues = [];
1333        const elementsWithLang = Array.from(document.querySelectorAll('[lang]'));
1334        const primaryLangAttr = primaryLang || 'en';
1335        
1336        elementsWithLang.forEach(function(element) {
1337          // Skip if this is the html element (primary language)
1338          if (element === document.documentElement) {
1339            return;
1340          }
1341          
1342          // Skip accessibility toolbar elements
1343          if (element.id && (element.id.startsWith('a11y-') || element.classList.contains('sr-only'))) {
1344            return;
1345          }
1346          
1347          const elementLang = element.getAttribute('lang');
1348          if (!elementLang) {
1349            return;
1350          }
1351          
1352          // Check if parent has a different lang attribute
1353          const parent = element.parentElement;
1354          if (parent) {
1355            const parentLang = parent.getAttribute('lang') || 
1356                             parent.closest('[lang]')?.getAttribute('lang') || 
1357                             primaryLangAttr;
1358            
1359            // If element lang differs from parent, that's correct (language change is marked)
1360            // But verify the lang attribute is valid
1361            const elementLangCode = elementLang.toLowerCase().split('-')[0];
1362            const parentLangCode = parentLang.toLowerCase().split('-')[0];
1363            
1364            if (elementLangCode !== parentLangCode) {
1365              // Language change is properly marked - this is good
1366              return;
1367            }
1368          }
1369        });
1370        
1371        // Note: Full language detection (detecting unmarked language changes) would require
1372        // sophisticated natural language processing. This validation focuses on verifying
1373        // that existing lang attributes are used correctly.
1374        
1375        if (issues.length === 0) {
1376          console.log('✅ WCAG 3.1.2: Language of Parts validation completed.');
1377          console.log('   Note: Full validation requires manual review for mixed-language content without lang attributes.');
1378        } else {
1379          console.group('⚠️ WCAG 3.1.2 - Language of Parts Issues Detected');
1380          issues.forEach(function(issue, index) {
1381            console.groupCollapsed((index + 1) + '. ' + issue.type + ' (' + issue.severity + ')');
1382            console.log('Message:', issue.message);
1383            console.log('Suggestion:', issue.suggestion);
1384            console.log('Standard:', issue.standard);
1385            if (issue.element) {
1386              console.log('Element:', issue.element);
1387              console.log('Element text:', issue.element.textContent ? issue.element.textContent.substring(0, 50) : '');
1388            }
1389            console.groupEnd();
1390          });
1391          console.groupEnd();
1392        }
1393      }
1394
1395      function createAccessibilityToolbar() {
1396        // Create toolbar container
1397        const toolbar = document.createElement('div');
1398        toolbar.id = 'a11y-toolbar';
1399        toolbar.setAttribute('role', 'toolbar');
1400        toolbar.setAttribute('aria-label', t('accessibilityControls'));
1401        
1402        // Apply RTL for Hebrew
1403        if (currentLang === 'he') {
1404          toolbar.style.direction = 'rtl';
1405        }
1406        
1407        // Header with drag functionality
1408        const header = document.createElement('div');
1409        header.id = 'a11y-toolbar-header';
1410        header.innerHTML = `
1411          <div id="a11y-toolbar-title">
1412            <span>♿</span>
1413            <span>${t('accessibility')}</span>
1414          </div>
1415          <button id="a11y-close-btn" aria-label="${t('closeToolbar')}">×</button>
1416        `;
1417        
1418        // Toggle button (always visible)
1419        const toggleBtn = document.createElement('button');
1420        toggleBtn.id = 'a11y-toggle';
1421        toggleBtn.setAttribute('aria-label', t('toggleToolbar'));
1422        toggleBtn.setAttribute('aria-expanded', 'false');
1423        toggleBtn.innerHTML = '♿';
1424        // Ensure button is visible with explicit styles (inline beats stylesheet; mirror RTL layout)
1425        toggleBtn.style.position = 'fixed';
1426        if (currentLang === 'he') {
1427          toggleBtn.style.left = '20px';
1428          toggleBtn.style.right = 'auto';
1429        } else {
1430          toggleBtn.style.right = '20px';
1431          toggleBtn.style.left = 'auto';
1432        }
1433        toggleBtn.style.bottom = '20px';
1434        toggleBtn.style.width = '60px';
1435        toggleBtn.style.height = '60px';
1436        toggleBtn.style.display = 'flex';
1437        toggleBtn.style.alignItems = 'center';
1438        toggleBtn.style.justifyContent = 'center';
1439        toggleBtn.style.opacity = '1';
1440        toggleBtn.style.visibility = 'visible';
1441        toggleBtn.style.zIndex = '99998';
1442        toggleBtn.style.cursor = 'pointer';
1443        console.log('✅ Accessibility toggle button created and should be visible');
1444        
1445        // Content
1446        const content = document.createElement('div');
1447        content.id = 'a11y-toolbar-content';
1448        content.innerHTML = `
1449          <!-- Text Size Controls -->
1450          <div class="a11y-control-group">
1451            <div class="a11y-control-group-title">${t('textSize')}</div>
1452            <div class="a11y-control-grid">
1453              <button class="a11y-control-btn" data-action="increase-text" aria-label="${t('increaseTextAria')}">
1454                <span class="a11y-control-icon">A+</span>
1455                <span class="a11y-control-label">${t('increaseText')}</span>
1456              </button>
1457              <button class="a11y-control-btn" data-action="decrease-text" aria-label="${t('decreaseTextAria')}">
1458                <span class="a11y-control-icon">A-</span>
1459                <span class="a11y-control-label">${t('decreaseText')}</span>
1460              </button>
1461            </div>
1462          </div>
1463
1464          <!-- Contrast & Colors -->
1465          <div class="a11y-control-group">
1466            <div class="a11y-control-group-title">${t('contrastColors')}</div>
1467            <div class="a11y-control-grid">
1468              <button class="a11y-control-btn" data-action="high-contrast" aria-label="${t('highContrastAria')}">
1469                <span class="a11y-control-icon">◐</span>
1470                <span class="a11y-control-label">${t('highContrast')}</span>
1471              </button>
1472              <button class="a11y-control-btn" data-action="negative-contrast" aria-label="${t('negativeContrastAria')}">
1473                <span class="a11y-control-icon">◑</span>
1474                <span class="a11y-control-label">${t('negativeContrast')}</span>
1475              </button>
1476              <button class="a11y-control-btn" data-action="grayscale" aria-label="${t('grayscaleAria')}">
1477                <span class="a11y-control-icon">⚫</span>
1478                <span class="a11y-control-label">${t('grayscale')}</span>
1479              </button>
1480              <button class="a11y-control-btn" data-action="readable-font" aria-label="${t('readableFontAria')}">
1481                <span class="a11y-control-icon">Aa</span>
1482                <span class="a11y-control-label">${t('readableFont')}</span>
1483              </button>
1484            </div>
1485          </div>
1486
1487          <!-- Highlighting -->
1488          <div class="a11y-control-group">
1489            <div class="a11y-control-group-title">${t('highlighting')}</div>
1490            <div class="a11y-control-grid">
1491              <button class="a11y-control-btn" data-action="highlight-links" aria-label="${t('highlightLinksAria')}">
1492                <span class="a11y-control-icon">🔗</span>
1493                <span class="a11y-control-label">${t('highlightLinks')}</span>
1494              </button>
1495              <button class="a11y-control-btn" data-action="highlight-titles" aria-label="${t('highlightTitlesAria')}">
1496                <span class="a11y-control-icon">H</span>
1497                <span class="a11y-control-label">${t('highlightTitles')}</span>
1498              </button>
1499            </div>
1500          </div>
1501
1502          <!-- Reading Aids -->
1503          <div class="a11y-control-group">
1504            <div class="a11y-control-group-title">${t('readingAids')}</div>
1505            <div class="a11y-control-grid">
1506              <button class="a11y-control-btn" data-action="reading-guide" aria-label="${t('readingGuideAria')}">
1507                <span class="a11y-control-icon">═</span>
1508                <span class="a11y-control-label">${t('readingGuide')}</span>
1509              </button>
1510              <button class="a11y-control-btn" data-action="reading-mask" aria-label="${t('readingMaskAria')}">
1511                <span class="a11y-control-icon">◉</span>
1512                <span class="a11y-control-label">${t('readingMask')}</span>
1513              </button>
1514              <button class="a11y-control-btn" data-action="text-spacing" aria-label="${t('textSpacingAria')}">
1515                <span class="a11y-control-icon">↔</span>
1516                <span class="a11y-control-label">${t('textSpacing')}</span>
1517              </button>
1518            </div>
1519          </div>
1520
1521          <!-- Navigation & Interaction -->
1522          <div class="a11y-control-group">
1523            <div class="a11y-control-group-title">${t('navigationInteraction')}</div>
1524            <div class="a11y-control-grid">
1525              <button class="a11y-control-btn" data-action="keyboard-nav" aria-label="${t('keyboardNavAria')}">
1526                <span class="a11y-control-icon">⌨</span>
1527                <span class="a11y-control-label">${t('keyboardNav')}</span>
1528              </button>
1529              <button class="a11y-control-btn" data-action="big-cursor" aria-label="${t('bigCursorAria')}">
1530                <span class="a11y-control-icon">➤</span>
1531                <span class="a11y-control-label">${t('bigCursor')}</span>
1532              </button>
1533              <button class="a11y-control-btn" data-action="stop-animations" aria-label="${t('stopAnimationsAria')}">
1534                <span class="a11y-control-icon">⏸</span>
1535                <span class="a11y-control-label">${t('stopAnimations')}</span>
1536              </button>
1537            </div>
1538          </div>
1539
1540          <!-- Reset -->
1541          <div class="a11y-control-group">
1542            <button class="a11y-reset-btn" data-action="reset" aria-label="${t('resetAllAria')}">
1543              ↺ ${t('resetAll')}
1544            </button>
1545            <button class="a11y-statement-btn" data-action="statement" aria-label="${t('viewStatementAria')}" style="width:100%;background:#4169E1;color:white;border:none;border-radius:8px;padding:12px;font-size:14px;font-weight:600;cursor:pointer;transition:all 0.2s;margin-top:10px;display:flex;align-items:center;justify-content:center;gap:8px;">
1546              <span>📋</span>
1547              <span>${t('accessibilityStatement')}</span>
1548            </button>
1549          </div>
1550        `;
1551
1552        // Assemble toolbar (don't append toggle button to toolbar - it's independent now)
1553        toolbar.appendChild(header);
1554        toolbar.appendChild(content);
1555        document.body.appendChild(toolbar);
1556        
1557        // Append toggle button independently to body (floating button)
1558        document.body.appendChild(toggleBtn);
1559        
1560        // Force button to be visible - double check after a short delay
1561        setTimeout(() => {
1562          const btn = document.getElementById('a11y-toggle');
1563          if (btn) {
1564            btn.style.display = 'flex';
1565            btn.style.opacity = '1';
1566            btn.style.visibility = 'visible';
1567            btn.style.pointerEvents = 'all';
1568            btn.classList.remove('hidden');
1569            console.log('✅ Accessibility toggle button verified visible at:', btn.getBoundingClientRect());
1570          } else {
1571            console.error('❌ Accessibility toggle button not found!');
1572          }
1573        }, 100);
1574
1575        // Create reading guide (if not exists)
1576        if (!document.getElementById('a11y-reading-guide')) {
1577          const readingGuide = document.createElement('div');
1578          readingGuide.id = 'a11y-reading-guide';
1579          document.body.appendChild(readingGuide);
1580        }
1581
1582        // Create reading mask (if not exists)
1583        if (!document.getElementById('a11y-reading-mask')) {
1584          const readingMask = document.createElement('div');
1585          readingMask.id = 'a11y-reading-mask';
1586          document.body.appendChild(readingMask);
1587        }
1588
1589        // Create font size indicator (if not exists)
1590        if (!document.getElementById('a11y-font-size-indicator')) {
1591          const fontSizeIndicator = document.createElement('div');
1592          fontSizeIndicator.id = 'a11y-font-size-indicator';
1593          document.body.appendChild(fontSizeIndicator);
1594        }
1595        
1596        // Create accessibility statement modal (if not exists)
1597        if (!document.getElementById('a11y-statement-modal')) {
1598          createAccessibilityStatementModal();
1599        }
1600
1601        // Setup event listeners
1602        setupToolbarEvents(toolbar, toggleBtn, header);
1603      }
1604      
1605      function createAccessibilityStatementModal() {
1606        const modal = document.createElement('div');
1607        modal.id = 'a11y-statement-modal';
1608        modal.setAttribute('role', 'dialog');
1609        modal.setAttribute('aria-modal', 'true');
1610        modal.setAttribute('aria-labelledby', 'a11y-statement-title');
1611        
1612        const content = document.createElement('div');
1613        content.id = 'a11y-statement-content';
1614        
1615        // Get current site domain dynamically
1616        const siteDomain = window.location.hostname;
1617        
1618        // Get contact info from data attributes if available
1619        const contactInfo = {
1620          phone: document.documentElement.getAttribute('data-a11y-phone') || null,
1621          officeVisitsEnabled: document.documentElement.getAttribute('data-a11y-office-visits') === 'true' ? true : 
1622                              document.documentElement.getAttribute('data-a11y-office-visits') === 'false' ? false : null,
1623          officeVisitsMessage: document.documentElement.getAttribute('data-a11y-office-message') || null,
1624          officeAccessible: document.documentElement.getAttribute('data-a11y-office-accessible') === 'true' ? true : 
1625                           document.documentElement.getAttribute('data-a11y-office-accessible') === 'false' ? false : null,
1626          coordinatorName: document.documentElement.getAttribute('data-a11y-coordinator-name') || null,
1627          officeAccessibilityFeatures: document.documentElement.getAttribute('data-a11y-office-features') || null,
1628          requestAlternativeFormatLink: document.documentElement.getAttribute('data-a11y-alternative-format-link') || null,
1629          liveCaptionsOnDemand: document.documentElement.getAttribute('data-a11y-live-captions-ondemand') === 'true',
1630          extendedAudioDescriptionOnDemand: document.documentElement.getAttribute('data-a11y-extended-audio-ondemand') === 'true'
1631        };
1632        const useCustomStatementContent = document.documentElement.getAttribute('data-a11y-custom-statement-enabled') === 'true';
1633        const customStatementDirectionAttr = document.documentElement.getAttribute('data-a11y-custom-statement-direction');
1634        const customStatementDirection = customStatementDirectionAttr === 'rtl' ? 'rtl' : 'ltr';
1635        const customStatementEncoded = document.documentElement.getAttribute('data-a11y-custom-statement-html') || '';
1636        let customStatementHtml = '';
1637        if (useCustomStatementContent && customStatementEncoded) {
1638          try {
1639            customStatementHtml = decodeURIComponent(customStatementEncoded);
1640          } catch (err) {
1641            console.error('Failed to decode custom accessibility statement HTML:', err);
1642          }
1643        }
1644        
1645        // Helper function to escape HTML
1646        function escapeHtml(text) {
1647          const div = document.createElement('div');
1648          div.textContent = text;
1649          return div.innerHTML;
1650        }
1651        
1652        const enhancementsList = translations[currentLang].statementEnhancementsList.map(item => 
1653          '<li>' + escapeHtml(item) + '</li>'
1654        ).join('');
1655        const browserList = translations[currentLang].statementBrowserList.map(item => 
1656          '<li>' + escapeHtml(item) + '</li>'
1657        ).join('');
1658        const technicalList = translations[currentLang].statementTechnicalList.map(item => 
1659          '<li>' + escapeHtml(item) + '</li>'
1660        ).join('');
1661        const thirdPartyLinks = translations[currentLang].statementThirdPartyLinks.map(link => 
1662          '<li><a href="' + escapeHtml(link.url) + '" target="_blank" rel="noopener noreferrer">' + escapeHtml(link.text) + '</a></li>'
1663        ).join('');
1664        
1665        const dateLocale = currentLang === 'he' ? 'he-IL' : 'en-US';
1666        const lastUpdated = new Date().toLocaleDateString(dateLocale, { year: 'numeric', month: 'long', day: 'numeric' });
1667        
1668        // Build HTML content with proper escaping
1669        const direction = currentLang === 'he' ? 'rtl' : 'ltr';
1670        const contactInfoHtml = 
1671          (contactInfo.phone ? 
1672            '<p style="margin-bottom: 8px;"><strong>📞 ' + (currentLang === 'he' ? 'טלפון:' : 'Phone:') + '</strong> <a href="tel:' + escapeHtml(contactInfo.phone.replace(/[^0-9+()-]/g, '')) + '">' + escapeHtml(contactInfo.phone) + '</a></p>' : 
1673            '') +
1674          (contactInfo.coordinatorName ? 
1675            '<p style="margin-bottom: 8px;"><strong>👤 ' + (currentLang === 'he' ? 'רכז נגישות:' : 'Accessibility Coordinator:') + '</strong> ' + escapeHtml(contactInfo.coordinatorName) + '</p>' : 
1676            '') +
1677          (contactInfo.officeVisitsEnabled === false && contactInfo.officeVisitsMessage ? 
1678            '<p style="margin-bottom: 8px;"><strong>🏢 ' + (currentLang === 'he' ? 'ביקורים במשרד:' : 'Office Visits:') + '</strong> ' + escapeHtml(contactInfo.officeVisitsMessage) + '</p>' : 
1679            '') +
1680          (contactInfo.officeVisitsEnabled === true ? 
1681            '<p style="margin-bottom: 8px;"><strong>🏢 ' + (currentLang === 'he' ? 'ביקורים במשרד:' : 'Office Visits:') + '</strong> ' + 
1682            (contactInfo.officeAccessible ? 
1683              (currentLang === 'he' ? 'המשרד שלנו נגיש לאנשים עם מוגבלויות. אנא צרו קשר כדי לתאם ביקור.' : 
1684               'Our office is accessible for people with disabilities. Please contact us to schedule a visit.') : 
1685              (currentLang === 'he' ? 'המשרד שלנו עשוי שלא להיות נגיש במלואו. אנא צרו קשר כדי לדון בהתאמות נגישות.' : 
1686               'Our office may not be fully accessible. Please contact us to discuss accessibility accommodations.')) + 
1687            '</p>' : 
1688            '') +
1689          (contactInfo.officeAccessibilityFeatures ? 
1690            '<p style="margin-bottom: 8px;"><strong>♿ ' + (currentLang === 'he' ? 'תכונות נגישות במשרד:' : 'Office Accessibility Features:') + '</strong> ' + escapeHtml(contactInfo.officeAccessibilityFeatures) + '</p>' : 
1691            '') +
1692          (contactInfo.requestAlternativeFormatLink ? 
1693            '<p style="margin-bottom: 8px;"><strong>📄 ' + (currentLang === 'he' ? 'בקשה לפורמט חלופי:' : 'Request Alternative Format:') + '</strong> ' + 
1694            (contactInfo.requestAlternativeFormatLink.startsWith('http://') || contactInfo.requestAlternativeFormatLink.startsWith('https://') || contactInfo.requestAlternativeFormatLink.startsWith('mailto:') ?
1695              '<a href="' + escapeHtml(contactInfo.requestAlternativeFormatLink) + '" target="_blank" rel="noopener noreferrer">' + escapeHtml(contactInfo.requestAlternativeFormatLink) + '</a>' :
1696              escapeHtml(contactInfo.requestAlternativeFormatLink)) + 
1697            '</p>' : 
1698            '');
1699        
1700        // Build "Request on Demand" section for Level AAA items (IS 5568 Part 1 (2021))
1701        const onDemandHtml = 
1702          (contactInfo.liveCaptionsOnDemand || contactInfo.extendedAudioDescriptionOnDemand ?
1703            '<div style="background: #fff7ed; border-left: 4px solid #f59e0b; padding: 16px; margin: 20px 0; border-radius: 4px;">' +
1704              '<h3 style="margin-top: 0; color: #f59e0b; font-size: 18px;">' + 
1705              (currentLang === 'he' ? 'שירותי נגישות זמינים לפי בקשה (רמה AAA)' : 'Accessibility Services Available on Request (Level AAA)') + 
1706              '</h3>' +
1707              '<p style="margin-bottom: 12px;">' +
1708              (currentLang === 'he' ? 
1709                'לפי תקן IS 5568 חלק 1 (2021), השירותים הבאים זמינים לפי בקשה:' :
1710                'According to IS 5568 Part 1 (2021), the following services are available upon request:') +
1711              '</p>' +
1712              '<ul style="margin: 12px 0; padding-left: 24px;">' +
1713              (contactInfo.liveCaptionsOnDemand ?
1714                '<li style="margin-bottom: 8px;"><strong>' + 
1715                (currentLang === 'he' ? 'כתוביות חיות (סעיף 1.2.4):' : 'Live Captions (Section 1.2.4):') + 
1716                '</strong> ' +
1717                (currentLang === 'he' ? 
1718                  'כתוביות חיות זמינות לפי בקשה עבור תוכן וידאו/אודיו חי. אנא צרו קשר כדי לבקש שירות זה.' :
1719                  'Live captions are available upon request for live video/audio content. Please contact us to request this service.') +
1720                '</li>' : '') +
1721              (contactInfo.extendedAudioDescriptionOnDemand ?
1722                '<li style="margin-bottom: 8px;"><strong>' + 
1723                (currentLang === 'he' ? 'תיאור שמע מורחב (סעיף 1.2.5):' : 'Extended Audio Description (Section 1.2.5):') + 
1724                '</strong> ' +
1725                (currentLang === 'he' ? 
1726                  'תיאור שמע מורחב זמין לפי בקשה עבור תוכן וידאו מורכב. אנא צרו קשר כדי לבקש שירות זה.' :
1727                  'Extended audio description is available upon request for complex video content. Please contact us to request this service.') +
1728                '</li>' : '') +
1729              '</ul>' +
1730            '</div>' : '');
1731        
1732        const defaultStatementBodyHtml =
1733          '<div id="a11y-statement-body" style="direction: ' + direction + ';">' +
1734            '<h3>' + escapeHtml(t('statementCommitment')) + '</h3>' +
1735            '<p>' + escapeHtml(t('statementCommitmentText')) + '</p>' +
1736            '<p>' + escapeHtml(t('statementCommitmentText2')) + '</p>' +
1737            '<h3>' + escapeHtml(t('statementEnhancements')) + '</h3>' +
1738            '<p>' + escapeHtml(t('statementEnhancementsText')) + '</p>' +
1739            '<ul>' + enhancementsList + '</ul>' +
1740            '<p>' + escapeHtml(t('statementEnhancementsText2')) + '</p>' +
1741            '<h3>' + escapeHtml(t('statementBrowser')) + '</h3>' +
1742            '<p>' + escapeHtml(t('statementBrowserText')) + '</p>' +
1743            '<ul>' + browserList + '</ul>' +
1744            '<p>' + escapeHtml(t('statementBrowserText2')) + '</p>' +
1745            '<h3>' + escapeHtml(t('statementTechnical')) + '</h3>' +
1746            '<p>' + escapeHtml(t('statementTechnicalText')) + '</p>' +
1747            '<ul>' + technicalList + '</ul>' +
1748            '<p>' + escapeHtml(t('statementTechnicalText2')) + '</p>' +
1749            '<h3>' + escapeHtml(t('statementThirdParty')) + '</h3>' +
1750            '<p>' + escapeHtml(t('statementThirdPartyText')) + '</p>' +
1751            '<p>' + escapeHtml(t('statementThirdPartyText2')) + '</p>' +
1752            '<ul>' + thirdPartyLinks + '</ul>' +
1753            onDemandHtml +
1754            '<div class="highlight-note">' +
1755              '<h3 style="margin-top: 0;">' + escapeHtml(t('statementFeedback')) + '</h3>' +
1756              '<p>' + escapeHtml(t('statementFeedbackText')) + '</p>' +
1757              contactInfoHtml +
1758              '<p style="margin-bottom: 0;">' + escapeHtml(t('statementFeedbackText2')) + '</p>' +
1759              '<p style="margin-bottom: 0;"><strong>' + escapeHtml(t('statementFeedbackText3')) + '</strong></p>' +
1760            '</div>' +
1761            '<p style="margin-top: 32px; padding-top: 24px; border-top: 2px solid #e5e7eb; text-align: center; color: #666; font-size: 14px;">' +
1762              '<strong>' + escapeHtml(t('statementLastUpdated')) + '</strong> ' + escapeHtml(lastUpdated) +
1763            '</p>' +
1764          '</div>';
1765        const customStatementBodyHtml =
1766          '<div id="a11y-statement-body" style="direction: ' + customStatementDirection + ';">' +
1767            customStatementHtml +
1768          '</div>';
1769        const statementBodyHtml =
1770          useCustomStatementContent && customStatementHtml
1771            ? customStatementBodyHtml
1772            : defaultStatementBodyHtml;
1773
1774        content.innerHTML =
1775          '<div id="a11y-statement-header">' +
1776            '<h2 id="a11y-statement-title">♿ ' + escapeHtml(t('statementTitle')) + '</h2>' +
1777            '<button id="a11y-statement-close" aria-label="' + escapeHtml(t('closeStatement')) + '">×</button>' +
1778          '</div>' +
1779          statementBodyHtml;
1780        
1781        modal.appendChild(content);
1782        document.body.appendChild(modal);
1783        
1784        // Close statement modal when clicking outside
1785        modal.addEventListener('click', (e) => {
1786          if (e.target === modal) {
1787            closeAccessibilityStatement();
1788          }
1789        });
1790        
1791        // Close button
1792        const closeBtn = content.querySelector('#a11y-statement-close');
1793        closeBtn.addEventListener('click', closeAccessibilityStatement);
1794        
1795        // ESC key to close
1796        document.addEventListener('keydown', (e) => {
1797          if (e.key === 'Escape' && modal.classList.contains('show')) {
1798            closeAccessibilityStatement();
1799          }
1800        });
1801      }
1802      
1803      function openAccessibilityStatement() {
1804        const modal = document.getElementById('a11y-statement-modal');
1805        if (modal) {
1806          modal.classList.add('show');
1807          document.body.style.overflow = 'hidden'; // Prevent background scrolling
1808          
1809          // Focus on close button for keyboard accessibility
1810          setTimeout(() => {
1811            const closeBtn = document.getElementById('a11y-statement-close');
1812            if (closeBtn) closeBtn.focus();
1813          }, 100);
1814        }
1815      }
1816      
1817      function closeAccessibilityStatement() {
1818        const modal = document.getElementById('a11y-statement-modal');
1819        if (modal) {
1820          modal.classList.remove('show');
1821          document.body.style.overflow = ''; // Restore scrolling
1822        }
1823      }
1824
1825      function setupToolbarEvents(toolbar, toggleBtn, header) {
1826        const closeBtn = document.getElementById('a11y-close-btn');
1827        const controls = document.querySelectorAll('.a11y-control-btn, .a11y-reset-btn, .a11y-statement-btn');
1828        
1829        function setToolbarExpanded(expanded, focusFirstControl) {
1830          if (expanded) {
1831            toolbar.classList.add('expanded');
1832            toggleBtn.classList.add('hidden');
1833            toggleBtn.setAttribute('aria-expanded', 'true');
1834            if (focusFirstControl) {
1835              setTimeout(() => {
1836                const firstControl = document.querySelector('.a11y-control-btn');
1837                if (firstControl) firstControl.focus();
1838              }, 100);
1839            }
1840          } else {
1841            toolbar.classList.remove('expanded');
1842            toggleBtn.classList.remove('hidden');
1843            toggleBtn.setAttribute('aria-expanded', 'false');
1844            toolbar.style.transform = '';
1845          }
1846        }
1847        
1848        // Toggle toolbar - Open it and hide the floating button
1849        toggleBtn.addEventListener('click', (e) => {
1850          e.preventDefault();
1851          e.stopPropagation();
1852          setToolbarExpanded(true, true);
1853          savePreference('toolbarExpanded', true);
1854        });
1855
1856        // Close toolbar - Hide it completely and show the floating button
1857        closeBtn.addEventListener('click', (e) => {
1858          e.preventDefault();
1859          e.stopPropagation();
1860          setToolbarExpanded(false, false);
1861          savePreference('toolbarExpanded', false);
1862        });
1863
1864        // Draggable toolbar
1865        let isDragging = false;
1866        let startY = 0;
1867        let startTop = 0;
1868
1869        header.addEventListener('mousedown', (e) => {
1870          if (e.target === closeBtn || e.target.closest('#a11y-close-btn')) return;
1871          isDragging = true;
1872          startY = e.clientY;
1873          const rect = toolbar.getBoundingClientRect();
1874          startTop = rect.top;
1875          toolbar.classList.add('dragging');
1876          e.preventDefault();
1877        });
1878
1879        document.addEventListener('mousemove', (e) => {
1880          if (!isDragging) return;
1881          const deltaY = e.clientY - startY;
1882          const newTop = startTop + deltaY;
1883          const maxTop = window.innerHeight - toolbar.offsetHeight;
1884          const clampedTop = Math.max(0, Math.min(newTop, maxTop));
1885          const translateX = toolbar.classList.contains('expanded') ? 0 : 360;
1886          toolbar.style.top = clampedTop + 'px';
1887          toolbar.style.transform = `translateX(${translateX}px)`;
1888        });
1889
1890        document.addEventListener('mouseup', () => {
1891          if (isDragging) {
1892            isDragging = false;
1893            toolbar.classList.remove('dragging');
1894          }
1895        });
1896
1897        // Control button actions
1898        controls.forEach(btn => {
1899          btn.addEventListener('click', function() {
1900            const action = this.getAttribute('data-action');
1901            handleAction(action, this);
1902          });
1903        });
1904
1905        // Reading guide mouse tracking
1906        document.addEventListener('mousemove', (e) => {
1907          if (document.body.classList.contains('a11y-reading-guide')) {
1908            const guide = document.getElementById('a11y-reading-guide');
1909            guide.style.top = (e.clientY - 1) + 'px';
1910          }
1911          if (document.body.classList.contains('a11y-reading-mask')) {
1912            document.documentElement.style.setProperty('--mouse-x', e.clientX + 'px');
1913            document.documentElement.style.setProperty('--mouse-y', e.clientY + 'px');
1914          }
1915        });
1916      }
1917
1918      // State variables
1919      let textSizeLevel = 100;
1920      const PREFERENCES_STORAGE_KEY = 'webydo.accessibility.preferences.v1';
1921
1922      function readPreferences() {
1923        try {
1924          if (!window.localStorage) return {};
1925          const raw = window.localStorage.getItem(PREFERENCES_STORAGE_KEY);
1926          if (!raw) return {};
1927          const parsed = JSON.parse(raw);
1928          return parsed && typeof parsed === 'object' ? parsed : {};
1929        } catch (error) {
1930          console.warn('⚠️ Failed to read accessibility preferences:', error);
1931          return {};
1932        }
1933      }
1934
1935      function handleAction(action, button) {
1936        const indicator = document.getElementById('a11y-font-size-indicator');
1937
1938        switch(action) {
1939          case 'increase-text':
1940            textSizeLevel = Math.min(textSizeLevel + 10, 200);
1941            applyTextSize(textSizeLevel);
1942            showFontSizeIndicator(textSizeLevel);
1943            savePreference('textSize', textSizeLevel);
1944            break;
1945
1946          case 'decrease-text':
1947            textSizeLevel = Math.max(textSizeLevel - 10, 80);
1948            applyTextSize(textSizeLevel);
1949            showFontSizeIndicator(textSizeLevel);
1950            savePreference('textSize', textSizeLevel);
1951            break;
1952
1953          case 'high-contrast':
1954          case 'readable-font':
1955          case 'highlight-links':
1956          case 'highlight-titles':
1957          case 'reading-guide':
1958          case 'reading-mask':
1959          case 'keyboard-nav':
1960          case 'big-cursor':
1961          case 'stop-animations':
1962          case 'text-spacing':
1963            const className = 'a11y-' + action;
1964            document.body.classList.toggle(className);
1965            button.classList.toggle('active');
1966            savePreference(action, document.body.classList.contains(className));
1967            break;
1968            
1969          case 'negative-contrast':
1970          case 'grayscale':
1971            // Apply filter classes to html instead of body to prevent fixed positioning issues
1972            const filterClassName = 'a11y-' + action;
1973            document.documentElement.classList.toggle(filterClassName);
1974            button.classList.toggle('active');
1975            savePreference(action, document.documentElement.classList.contains(filterClassName));
1976            break;
1977
1978          case 'reset':
1979            resetAllSettings();
1980            break;
1981          
1982          case 'statement':
1983            openAccessibilityStatement();
1984            break;
1985        }
1986      }
1987
1988      /*
1989       * Text resizing must work regardless of the UNIT the site was authored in.
1990       * Scaling only the root font-size (which is all this used to do) moves text
1991       * authored in rem and NOTHING else — measured 0% effect on sites written in
1992       * px, which is most legacy/AI-built output. The control looked alive (the %
1993       * applied, the indicator animated, the preference saved) while no visitor
1994       * text ever changed size: an SI 5568 control that silently did nothing.
1995       *
1996       * So: remember each text-bearing element's ORIGINAL computed size once, then
1997       * always set size = original * factor. Computing from the ORIGINAL (never
1998       * from the current computed value) is what prevents rem-based sites from
1999       * being scaled twice, since the root % below still applies to them.
2000       * Level 100 removes every inline override, so Reset is exact.
2001       */
2002      let a11yTextOriginals = null;
2003
2004      function a11yCaptureTextOriginals() {
2005        if (a11yTextOriginals) return;
2006        a11yTextOriginals = [];
2007        const all = document.body ? document.body.querySelectorAll('*') : [];
2008        for (let i = 0; i < all.length; i++) {
2009          const el = all[i];
2010          // never resize the accessibility UI itself
2011          if (el.closest && el.closest('#a11y-toolbar, #a11y-toggle, #a11y-statement-modal, #a11y-font-size-indicator, #a11y-skip-link')) continue;
2012          let hasText = false;
2013          for (let n = 0; n < el.childNodes.length; n++) {
2014            const node = el.childNodes[n];
2015            if (node.nodeType === 3 && node.nodeValue && node.nodeValue.trim()) { hasText = true; break; }
2016          }
2017          if (!hasText) continue;
2018          const px = parseFloat(getComputedStyle(el).fontSize);
2019          if (px) a11yTextOriginals.push([el, px]);
2020        }
2021      }
2022
2023      function applyTextSize(level) {
2024        // capture BEFORE the root changes, so the stored sizes are the true originals
2025        if (level !== 100) a11yCaptureTextOriginals();
2026        document.documentElement.style.fontSize = level + '%';
2027        if (!a11yTextOriginals) return;
2028        for (let i = 0; i < a11yTextOriginals.length; i++) {
2029          const el = a11yTextOriginals[i][0];
2030          const px = a11yTextOriginals[i][1];
2031          if (!el.isConnected) continue;
2032          if (level === 100) el.style.removeProperty('font-size');
2033          else el.style.setProperty('font-size', (px * level / 100).toFixed(2) + 'px', 'important');
2034        }
2035      }
2036
2037      function showFontSizeIndicator(size) {
2038        const indicator = document.getElementById('a11y-font-size-indicator');
2039        indicator.textContent = size + '%';
2040        indicator.style.display = 'block';
2041        clearTimeout(window.fontSizeTimeout);
2042        window.fontSizeTimeout = setTimeout(() => {
2043          indicator.style.display = 'none';
2044        }, 2000);
2045      }
2046
2047      function resetAllSettings() {
2048        // Reset text size (also clears every per-element override)
2049        textSizeLevel = 100;
2050        applyTextSize(100);
2051        
2052        // Remove all accessibility classes
2053        const bodyClasses = [
2054          'a11y-high-contrast', 'a11y-readable-font', 'a11y-highlight-links', 
2055          'a11y-highlight-titles', 'a11y-reading-guide', 'a11y-reading-mask', 
2056          'a11y-keyboard-nav', 'a11y-big-cursor', 'a11y-stop-animations', 'a11y-text-spacing'
2057        ];
2058        bodyClasses.forEach(cls => document.body.classList.remove(cls));
2059        
2060        // Remove filter classes from html element
2061        const htmlClasses = ['a11y-negative-contrast', 'a11y-grayscale'];
2062        htmlClasses.forEach(cls => document.documentElement.classList.remove(cls));
2063
2064        // Remove active state from buttons
2065        document.querySelectorAll('.a11y-control-btn.active').forEach(btn => {
2066          btn.classList.remove('active');
2067        });
2068
2069        // Reset persisted preferences
2070        try {
2071          if (window.localStorage) {
2072            window.localStorage.removeItem(PREFERENCES_STORAGE_KEY);
2073          }
2074        } catch (error) {
2075          console.warn('⚠️ Failed to clear accessibility preferences:', error);
2076        }
2077        
2078        // Show notification
2079        alert(t('resetNotification'));
2080      }
2081
2082      function savePreference(key, value) {
2083        try {
2084          if (!window.localStorage) return;
2085          const preferences = readPreferences();
2086          preferences[key] = value;
2087          window.localStorage.setItem(PREFERENCES_STORAGE_KEY, JSON.stringify(preferences));
2088        } catch (error) {
2089          console.warn('⚠️ Failed to save accessibility preference:', key, error);
2090        }
2091      }
2092
2093      function restoreSavedPreferences() {
2094        const preferences = readPreferences();
2095        // Toolbar defaults to closed unless explicitly forced or user saved it open.
2096        const shouldForceOpen =
2097          document.documentElement.getAttribute('data-a11y-auto-open') === 'true';
2098
2099        const toolbar = document.getElementById('a11y-toolbar');
2100        const toggleBtn = document.getElementById('a11y-toggle');
2101
2102        if (!toolbar || !toggleBtn) {
2103          console.warn('⚠️ Accessibility toolbar elements not found during restore');
2104          return;
2105        }
2106
2107        if (shouldForceOpen || preferences.toolbarExpanded === true) {
2108          toolbar.classList.add('expanded');
2109          toggleBtn.classList.add('hidden');
2110          toggleBtn.setAttribute('aria-expanded', 'true');
2111          console.log('🎬 Accessibility toolbar opened from saved state/force flag');
2112        } else {
2113          toolbar.classList.remove('expanded');
2114          toggleBtn.classList.remove('hidden');
2115          toggleBtn.setAttribute('aria-expanded', 'false');
2116          toolbar.style.transform = '';
2117          toolbar.style.top = '';
2118          console.log('✅ Accessibility toolbar starts CLOSED by default');
2119        }
2120
2121        if (typeof preferences.textSize === 'number' && preferences.textSize >= 80 && preferences.textSize <= 200) {
2122          textSizeLevel = preferences.textSize;
2123          applyTextSize(textSizeLevel);
2124        }
2125
2126        const bodyActions = [
2127          'high-contrast',
2128          'readable-font',
2129          'highlight-links',
2130          'highlight-titles',
2131          'reading-guide',
2132          'reading-mask',
2133          'keyboard-nav',
2134          'big-cursor',
2135          'stop-animations',
2136          'text-spacing'
2137        ];
2138        bodyActions.forEach((action) => {
2139          if (preferences[action] === true) {
2140            document.body.classList.add('a11y-' + action);
2141            const button = document.querySelector('[data-action="' + action + '"]');
2142            if (button) button.classList.add('active');
2143          }
2144        });
2145
2146        const htmlActions = ['negative-contrast', 'grayscale'];
2147        htmlActions.forEach((action) => {
2148          if (preferences[action] === true) {
2149            document.documentElement.classList.add('a11y-' + action);
2150            const button = document.querySelector('[data-action="' + action + '"]');
2151            if (button) button.classList.add('active');
2152          }
2153        });
2154      }
2155
2156      function setupKeyboardShortcuts() {
2157        document.addEventListener('keydown', (e) => {
2158          // Alt + A: Toggle accessibility toolbar
2159          if (e.altKey && e.key === 'a') {
2160            e.preventDefault();
2161            const toolbar = document.getElementById('a11y-toolbar');
2162            const toggleBtn = document.getElementById('a11y-toggle');
2163            if (toolbar && toggleBtn) {
2164              const isExpanded = toolbar.classList.contains('expanded');
2165              if (isExpanded) {
2166                // Close toolbar, show floating button
2167                toolbar.classList.remove('expanded');
2168                toggleBtn.classList.remove('hidden');
2169                toggleBtn.setAttribute('aria-expanded', 'false');
2170              } else {
2171                // Open toolbar, hide floating button
2172                toolbar.classList.add('expanded');
2173                toggleBtn.classList.add('hidden');
2174                toggleBtn.setAttribute('aria-expanded', 'true');
2175                // Focus first control button when opening
2176                setTimeout(() => {
2177                  const firstControl = document.querySelector('.a11y-control-btn');
2178                  if (firstControl) firstControl.focus();
2179                }, 100);
2180              }
2181            }
2182          }
2183
2184          // ESC: Close accessibility toolbar
2185          if (e.key === 'Escape') {
2186            const toolbar = document.getElementById('a11y-toolbar');
2187            const toggleBtn = document.getElementById('a11y-toggle');
2188            const statementModal = document.getElementById('a11y-statement-modal');
2189            
2190            // Only close toolbar if it's open and statement modal is not open
2191            if (toolbar && toolbar.classList.contains('expanded') && 
2192                (!statementModal || !statementModal.classList.contains('show'))) {
2193              toolbar.classList.remove('expanded');
2194              if (toggleBtn) {
2195                toggleBtn.classList.remove('hidden');
2196                toggleBtn.setAttribute('aria-expanded', 'false');
2197              }
2198            }
2199          }
2200
2201          // Alt + +: Increase text size
2202          if (e.altKey && (e.key === '+' || e.key === '=')) {
2203            e.preventDefault();
2204            const btn = document.querySelector('[data-action="increase-text"]');
2205            if (btn) btn.click();
2206          }
2207
2208          // Alt + -: Decrease text size
2209          if (e.altKey && e.key === '-') {
2210            e.preventDefault();
2211            const btn = document.querySelector('[data-action="decrease-text"]');
2212            if (btn) btn.click();
2213          }
2214
2215          // Alt + C: Toggle high contrast
2216          if (e.altKey && e.key === 'c') {
2217            e.preventDefault();
2218            const btn = document.querySelector('[data-action="high-contrast"]');
2219            if (btn) btn.click();
2220          }
2221
2222          // Alt + R: Reset
2223          if (e.altKey && e.key === 'r') {
2224            e.preventDefault();
2225            const btn = document.querySelector('[data-action="reset"]');
2226            if (btn) btn.click();
2227          }
2228        });
2229      }
2230
2231      // Announce to screen readers
2232      const announcement = document.createElement('div');
2233      announcement.setAttribute('role', 'status');
2234      announcement.setAttribute('aria-live', 'polite');
2235      announcement.className = 'sr-only';
2236      announcement.setAttribute('data-a11y-toolbar-announcement', 'true');
2237      document.body.appendChild(announcement);
2238
2239      // Announce toolbar availability
2240      setTimeout(() => {
2241        announcement.textContent = t('toolbarAvailable');
2242      }, 1000);
2243
2244    })();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.