PageSourceSearch

https://www.pm.gc.ca/modules/custom/pm_admin/js/pm_language_switcher.js?tm7t0n

js pm.gc.ca collected 2026-10-01 08:30:01 UTC 4,428 bytes, 131 lines download raw bytes

1(function ($, Drupal, drupalSettings) {
2  function isDebugEnabled() {
3    return localStorage.getItem('PM_DEBUG') === 'true';
4  }
5
6  Drupal.behaviors.languageSwitcherParams = {
7    attach: function (context, settings) {
8      if (isDebugEnabled()) console.log('[Language Switcher] Behavior attached');
9      attachLanguageSwitcherHandler();
10    }
11  };
12
13  var allowedParams = [
14    'display', 'id', 'lang', 'loc', 'lsf', 'page', 't',
15    'sort_by', 'sort_order', 'combine',
16    'field_date_released_value', 'field_date_released_value_1',
17    'field_date_released_value_min', 'field_date_released_value_max',
18    'field_tag_target_id', 'field_tag_target_id[]',
19    'field_tag_target_id[0]', 'field_tag_target_id[][value]',
20    'webform', 'token', '_token', 'destination', 'fid',
21    'Apply', 'apply', 'Appliquer', 'appliquer', 'Reset', 'reset', 'Reinitialiser', 'reinitialiser', 
22    'auHash'
23  ];
24
25  function isAllowedDestination(value) {
26    try {
27      var destUrl = new URL(value, window.location.origin);
28      var host = destUrl.hostname;
29      var isSameDomain = host === window.location.hostname;
30      var isCanadaCa = /\.canada\.ca$/i.test(host);
31      var isGcCa = /\.gc\.ca$/i.test(host);
32      return isSameDomain || isCanadaCa || isGcCa;
33    }
34    catch (e) {
35      return false;
36    }
37  }
38
39  function getTargetLanguage(link) {
40    return link.getAttribute('lang') || 'en';
41  }
42
43  function translateButtonParam(key, value, targetLang) {
44    var enToFr = {
45      'Apply': 'Appliquer',
46      'apply': 'appliquer',
47      'Reset': 'Reinitialiser',
48      'reset': 'reinitialiser'
49    };
50    var frToEn = {
51      'Appliquer': 'Apply',
52      'appliquer': 'apply',
53      'Reinitialiser': 'Reset',
54      'reinitialiser': 'reset'
55    };
56    
57    if (targetLang === 'fr' && enToFr[value]) {
58      return enToFr[value];
59    }
60    if (targetLang === 'en' && frToEn[value]) {
61      return frToEn[value];
62    }
63    return value;
64  }
65
66  function attachLanguageSwitcherHandler() {
67    var langSwitchLinks = document.querySelectorAll('.language-link');
68    if (isDebugEnabled()) console.log('[Language Switcher] Found links:', langSwitchLinks.length);
69    
70    langSwitchLinks.forEach(function(link) {
71      if (link.dataset.langSwitchAttached) return;
72      link.dataset.langSwitchAttached = 'true';
73      var targetLang = getTargetLanguage(link);
74
75      function updateHref() {
76        var currentHref = link.getAttribute('href');
77        if (isDebugEnabled()) console.log('[Language Switcher] Processing href:', currentHref);
78        
79        if (currentHref.indexOf('=') !== -1) {
80          if (isDebugEnabled()) console.log('[Language Switcher] Skipping - already has query params');
81          return;
82        }
83
84        var urlParams = new URLSearchParams(window.location.search);
85        var params = [];
86        urlParams.forEach(function(value, key) {
87          var keyLower = key.toLowerCase();
88          if (allowedParams.indexOf(key) === -1 && 
89              allowedParams.indexOf(keyLower) === -1 && 
90              key !== 'field_tag_target_id[]' &&
91              keyLower !== 'field_tag_target_id[]') {
92            return;
93          }
94          if (key === 'page' && (value === '0' || value === '0,0')) {
95            return;
96          }
97          if (key === 'destination' && !isAllowedDestination(value)) {
98            return;
99          }
100          if (value !== '') {
101            var translatedValue = translateButtonParam(key, value, targetLang);
102            params.push(key + '=' + encodeURIComponent(translatedValue));
103          }
104        });
105
106        if (params.length > 0) {
107          var separator = currentHref.indexOf('?') === -1 ? '?' : '&';
108          var newHref = currentHref + separator + params.join('&');
109          if (isDebugEnabled()) {
110            console.log('[Language Switcher] Params will be added:', params.join(', '));
111            console.log('[Language Switcher] New href:', newHref);
112          }
113          link.setAttribute('href', newHref);
114        }
115        else {
116          if (isDebugEnabled()) console.log('[Language Switcher] No params to add for:', currentHref);
117        }
118      }
119
120      updateHref();
121
122      link.addEventListener('click', updateHref);
123    });
124  }
125
126  window.PMLanguageSwitcher = {
127    allowedParams: allowedParams,
128    isAllowedDestination: isAllowedDestination,
129    attachLanguageSwitcherHandler: attachLanguageSwitcherHandler
130  };
131})(jQuery, Drupal, drupalSettings);

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.