1/* START OpenCities.CustomControls.LanguageSelector.Language.js */ 2var langCookies; 3 4function getToolbarLanguageItem(element) { 5 return $(element).closest(".toolbar-item.toolbar-language"); 6} 7 8function syncDropdownAriaSelection($selectedLink) { 9 var $item = $selectedLink && $selectedLink.length 10 ? getToolbarLanguageItem($selectedLink) 11 : $(); 12 var $button = $item.length 13 ? $item.find(".toolbar-button-language") 14 : $(".toolbar-button-language"); 15 var $options = $item.length 16 ? getDropdownOptions($item) 17 : getDropdownOptions(getToolbarLanguageItem($button)); 18 $options.attr("aria-selected", "false"); 19 20 if (!$selectedLink || $selectedLink.length === 0) { 21 $button.removeAttr("aria-activedescendant"); 22 return; 23 } 24 25 $selectedLink.attr("aria-selected", "true"); 26 var selectedOptionId = $selectedLink.attr("id"); 27 if (selectedOptionId) { 28 $button.attr("aria-activedescendant", selectedOptionId); 29 } 30} 31 32function getDropdownOptions($toolbarItem) { 33 if (!$toolbarItem || !$toolbarItem.length) { 34 return $(); 35 } 36 return $toolbarItem.find(".toolbar-language-drop-down a[role='option']"); 37} 38 39function focusDropdownOptionByIndex(index, $toolbarItem) { 40 var $options = getDropdownOptions($toolbarItem); 41 if ($options.length === 0) { 42 return; 43 } 44 45 if (index < 0) { 46 index = $options.length - 1; 47 } 48 if (index >= $options.length) { 49 index = 0; 50 } 51 52 var $option = $options.eq(index); 53 syncDropdownAriaSelection($option); 54 $option.focus(); 55 56 var optionElement = $option.get(0); 57 if (optionElement && optionElement.scrollIntoView) { 58 optionElement.scrollIntoView({ block: "nearest" }); 59 } 60} 61 62function getOptionIndexFromElement(element, $toolbarItem) { 63 var $option = $(element).closest("a[role='option']"); 64 if ($option.length === 0) { 65 return -1; 66 } 67 68 var optionNodes = getDropdownOptions($toolbarItem).get(); 69 return optionNodes.indexOf($option[0]); 70} 71 72function closeLanguageDropdownAndFocusButton(context) { 73 var $item = context ? getToolbarLanguageItem(context) : $(".toolbar-item.toolbar-language").first(); 74 var $button = $item.find(".toolbar-button-language"); 75 if ($button.attr("aria-expanded") === "true") { 76 $button.trigger("click"); 77 } 78 $button.removeAttr("aria-activedescendant"); 79 $button.focus(); 80} 81 82function getCurrentLanguageOption($container, selector) { 83 var currentLanguageOption = $container.find(selector).filter(function () { 84 var language = $(this).attr("data-translate-to").toLowerCase(); 85 var userSelectedLang = OpenCities.Settings.Application.LanguageSettings.UserLanguage.toLowerCase(); 86 return language == userSelectedLang || language.startsWith(userSelectedLang) || userSelectedLang.startsWith(language); 87 }); 88 89 if (currentLanguageOption && currentLanguageOption.length > 0) { 90 return currentLanguageOption.first(); 91 } 92 93 return $(); 94} 95 96function getOptionDisplayText($option) { 97 return $option.clone().children("span.visuallyhidden").remove().end().text(); 98} 99 100function updateUserSelectedLanguageText() { 101 $(".toolbar-item.toolbar-language").each(function () { 102 var $item = $(this); 103 var $button = $item.find(".toolbar-button-language"); 104 var $currentLanguage = getCurrentLanguageOption($item, ".toolbar-language-drop-down a[role='option']"); 105 106 if ($currentLanguage.length) { 107 var languageText = getOptionDisplayText($currentLanguage); 108 $button.find(".current-language").text(languageText); 109 if ($button.find(".current-language").next(".visuallyhidden").length === 0) { 110 $button.find(".current-language").after("<span class=\"visuallyhidden\"> is your current preferred language.</span>"); 111 } 112 113 $currentLanguage.closest("li").remove(); 114 $button.removeAttr("aria-activedescendant"); 115 116 if (getDropdownOptions($item).length === 0) { 117 $button.prop("disabled", true); 118 $button.find("i").remove(); 119 $button.find(".toolbar-language-globe-icon").remove(); 120 $item.find(".toolbar-language-drop-down").remove(); 121 } 122 } 123 124 var $currentLanguageLink = getCurrentLanguageOption($item, ".toolbar-language-links a"); 125 if ($currentLanguageLink.length) { 126 $currentLanguageLink.find("span.visuallyhidden").remove(); 127 var languageCode = $currentLanguageLink.attr("data-translate-to"); 128 var languageText = $currentLanguageLink.text(); 129 var currentLanguagelink = $item.find(".toolbar-language-links").find(".lang-" + languageCode); 130 var currentLanguageSpan = $("<span class=\"lang-item current-language\"></span>"); 131 currentLanguageSpan.addClass("lang-" + languageCode); 132 currentLanguageSpan.attr("lang", currentLanguagelink.attr("lang")); 133 currentLanguageSpan.append(languageText + "<span class=\"visuallyhidden\"> is your current preferred language.</span>"); 134 currentLanguagelink.replaceWith(currentLanguageSpan); 135 } 136 });
137} 138 139function googleTranslateElementInit() { 140 var pageLang = OpenCities.Settings.Application.LanguageSettings.PageLanguage; 141 if (pageLang !== 'zh-CN' && pageLang !== 'zh-TW') { 142 pageLang = pageLang.split('-')[0]; 143 } 144 var userLang = OpenCities.Settings.Application.LanguageSettings.UserLanguage; 145 if (userLang !== 'zh-CN' && userLang !== 'zh-TW') { 146 userLang = userLang.split('-')[0]; 147 } 148 var alwaysRun = OpenCities.Settings.Application.LanguageSettings.Always; 149 var runTranslate = true; 150 if (!alwaysRun) { 151 runTranslate = false; 152 var checkLang = $('html').attr('lang').split('-')[0]; 153 $("*[lang]").each(function () { 154 var newLang = $(this).attr('lang').split('-')[0]; 155 if (checkLang !== newLang) { 156 runTranslate = true; 157 return false; 158 } 159 }); 160 } 161 if (!runTranslate) { 162 return; 163 } 164 new google.translate.TranslateElement( 165 { 166 pageLanguage: pageLang, 167 includedLanguages: userLang, 168 layout: google.translate.TranslateElement.FloatPosition.TOP_LEFT, multilanguagePage: true 169 }, 170 'google_translate_element'); 171 $('.toolbar-language .current-language').addClass('google-translate-language'); 172 // Update match height after google translate runs 173 setTimeout(function () { $.fn.matchHeight._update(); }, 2000); 174} 175 176$(function () { 177 $(document).on("click", ".toolbar-language-drop-down a[role='option']", function () { 178 syncDropdownAriaSelection($(this)); 179 }); 180 181 $(document).on("keydown", ".toolbar-button-language", function (e) { 182 var key = e.key || { 38: "ArrowUp", 40: "ArrowDown", 27: "Escape" }[e.keyCode]; 183 if (key !== "ArrowDown" && key !== "ArrowUp" && key !== "Escape") { 184 return; 185 } 186 187 if (key === "Escape") { 188 e.preventDefault(); 189 closeLanguageDropdownAndFocusButton(this); 190 return; 191 } 192 193 e.preventDefault(); 194 var $button = $(this); 195 var $item = getToolbarLanguageItem($button); 196 if ($button.attr("aria-expanded") !== "true") { 197 $button.trigger("click"); 198 } 199 200 var $opts = getDropdownOptions($item); 201 var startIndex = key === "ArrowUp" ? $opts.length - 1 : 0; 202 setTimeout(function () { 203 focusDropdownOptionByIndex(startIndex, $item); 204 }, 0); 205 }); 206 207 $(document).on("keydown", ".toolbar-language-drop-down a[role='option']", function (e) { 208 var key = e.key || { 38: "ArrowUp", 40: "ArrowDown", 27: "Escape", 36: "Home", 35: "End", 32: " " }[e.keyCode]; 209 var $item = getToolbarLanguageItem(this); 210 if (key === "ArrowDown" || key === "ArrowUp") { 211 e.preventDefault(); 212 var currentIndex = getOptionIndexFromElement(this, $item); 213 if (currentIndex < 0) { 214 focusDropdownOptionByIndex(0, $item); 215 return; 216 } 217 focusDropdownOptionByIndex(currentIndex + (key === "ArrowDown" ? 1 : -1), $item); 218 return; 219 } 220 221 if (key === "Home") { 222 e.preventDefault(); 223 focusDropdownOptionByIndex(0, $item); 224 return; 225 } 226 227 if (key === "End") { 228 e.preventDefault(); 229 var $opts = getDropdownOptions($item); 230 focusDropdownOptionByIndex($opts.length - 1, $item); 231 return; 232 } 233 234 if (key === "Escape") { 235 e.preventDefault(); 236 closeLanguageDropdownAndFocusButton(this); 237 return; 238 } 239 240 if (key === " ") { 241 e.preventDefault(); 242 window.location.href = $(this).attr("href"); 243 } 244 }); 245 246 updateUserSelectedLanguageText(); 247 if (OpenCities.Settings.Application.LanguageSettings.InjectGoogleTranslate) { 248 var script = document.createElement('script'); 249 script.src = "//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"; 250 document.head.appendChild(script); 251 } 252}); 253/* END OpenCities.CustomControls.LanguageSelector.Language.js */
254if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded(); 255(function() { 256 function loadHandler() { 257 var hf = window.__TsmHiddenField; 258 if (!hf) return; 259 if (!hf._RSM_init) { hf._RSM_init = true; hf.value = ''; } 260 hf.value += ';;OpenCities.CustomControls:en-GB:8875e443-f2ef-457b-94fb-857d92f72782:8e1d32bf'; 261 Sys.Application.remove_load(loadHandler); 262 }; 263 Sys.Application.add_load(loadHandler); 264})();
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.