blob: b502450c0bbb6a6f17f6dd42abf6a722380edc84 [file] [log] [blame]
avm999634a2a5d52016-06-04 16:17:29 +02001function $(selector) {
avm999635a57c412020-12-27 00:26:45 +01002 return document.querySelector(selector);
avm999634a2a5d52016-06-04 16:17:29 +02003}
4
5function $all(selector) {
avm999635a57c412020-12-27 00:26:45 +01006 return document.querySelectorAll(selector);
avm999634a2a5d52016-06-04 16:17:29 +02007}
8
9function isEmpty(obj) {
avm999635a57c412020-12-27 00:26:45 +010010 return Object.keys(obj).length === 0;
avm999634a2a5d52016-06-04 16:17:29 +020011}
12
13function i18n() {
avm999635a57c412020-12-27 00:26:45 +010014 $all('[data-i18n]').forEach(el => {
15 el.innerHTML =
16 chrome.i18n.getMessage('options_' + el.getAttribute('data-i18n'));
17 });
avm999634a2a5d52016-06-04 16:17:29 +020018}
19
avm99963ce257a92020-12-27 00:07:13 +010020function printListModal() {
avm999635a57c412020-12-27 00:26:45 +010021 $('#select_language').textContent = '';
22 var heysortable = sortable.toArray();
avm999630f961162020-12-27 13:12:27 +010023 var languages = [];
24 for (var langCode of Object.keys(isoLangs)) {
25 var l = isoLangs[langCode];
26 l['code'] = langCode;
27 languages.push(l);
28 }
29
30 languages.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
31 languages.forEach(language => {
32 if (!inArray(language['code'], heysortable)) {
avm999635a57c412020-12-27 00:26:45 +010033 var el = document.createElement('option');
avm999630f961162020-12-27 13:12:27 +010034 el.setAttribute('value', language['code']);
35 el.textContent = language['name'] + ' (' + language['nativeName'] + ')';
avm999635a57c412020-12-27 00:26:45 +010036 $('#select_language').appendChild(el);
avm999634a2a5d52016-06-04 16:17:29 +020037 }
avm999630f961162020-12-27 13:12:27 +010038 });
avm999634a2a5d52016-06-04 16:17:29 +020039}
40
41function init() {
avm999635a57c412020-12-27 00:26:45 +010042 i18n();
43 chrome.storage.sync.get(null, items => {
44 // If no settings are set
45 if (isEmpty(items)) {
46 items = {
47 translateinto: {},
48 uniquetab: '',
49 };
50 chrome.storage.sync.set(items);
51 }
avm999634a2a5d52016-06-04 16:17:29 +020052
avm999635a57c412020-12-27 00:26:45 +010053 // Check the checkbox of the window opening
54 if (items.uniquetab === 'yep') $('#uniquetab').checked = true;
55 if (items.uniquetab === '') $('#varioustabs').checked = true;
56 if (items.uniquetab === 'panel') $('#panel').checked = true;
avm999634a2a5d52016-06-04 16:17:29 +020057
avm999635a57c412020-12-27 00:26:45 +010058 // Add event listeners for certain buttons and links
59 $('#panelsflag').addEventListener('click', _ => {
60 event.preventDefault();
61 chrome.tabs.create({url: 'chrome://flags/#enable-panels'});
avm999634a2a5d52016-06-04 16:17:29 +020062 });
avm999635a57c412020-12-27 00:26:45 +010063
64 $('#save').addEventListener('click', _ => {
avm99963a0036412020-12-29 13:39:05 +010065 saveOptions(true);
66 });
67
68 // Save automatically
69 $all('input[type="radio"]').forEach(radio => {
70 radio.addEventListener('change', _ => {
71 saveOptions();
72 });
avm999635a57c412020-12-27 00:26:45 +010073 });
74
75 // Print selected language list
76 var languages = items.translateinto;
77
78 if (languages) {
79 for (var language_id of Object.keys(languages)) {
80 var language = languages[language_id];
81 var el = document.createElement('li');
82 el.setAttribute('data-language', language);
83 el.setAttribute('data-id', language);
84 el.innerHTML = isoLangs[language]['name'] + ' (' +
85 isoLangs[language]['nativeName'] + ')' +
86 '<span data-language=\'' + language +
87 '\' class=\'delete\'>x</span>';
88 $('#languages').appendChild(el);
89 $('#languages li[data-language=' + language + '] .delete')
90 .addEventListener('click', function() {
91 $('#languages')
92 .removeChild($(
93 'li[data-language=' + this.getAttribute('data-language') +
94 ']'));
95 printListModal();
avm99963a0036412020-12-29 13:39:05 +010096 // Save automatically
97 saveOptions();
avm999635a57c412020-12-27 00:26:45 +010098 });
99 }
100 }
101
102 // Initiate Sortable
103 sortable = new Sortable($('#languages'), {animation: 150});
104
105 // Handling The Dialog
106 $('#languages_add').addEventListener('click', _ => {
107 $('dialog#languages_add_dialog').showModal();
108 $('#select_language').focus();
109 });
110
111 $('#languages_add_cancel').addEventListener('click', _ => {
112 $('dialog#languages_add_dialog').close();
113 });
114
115 $('#languages_add_ok').addEventListener('click', _ => {
116 var el = document.createElement('li');
117 var language = $('#select_language').value;
118 if (inArray(language, sortable.toArray())) {
119 return;
120 }
121 el.setAttribute('data-language', language);
122 el.setAttribute('data-id', language);
123 el.innerHTML = isoLangs[language]['name'] + ' (' +
124 isoLangs[language]['nativeName'] + ')' +
125 '<span data-language=\'' + language + '\' class=\'delete\'>x</span>';
126 $('#languages').appendChild(el);
127 var selection = $('#select_language option[value=' + language + ']');
128 selection.parentNode.removeChild(selection);
129 $('#languages li[data-id=' + language + '] .delete')
130 .addEventListener('click', function() {
131 $('#languages')
132 .removeChild(
133 $('li[data-language=' + this.getAttribute('data-language') +
134 ']'));
135 printListModal();
avm99963a0036412020-12-29 13:39:05 +0100136 // Save automatically
137 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100138 });
139 $('dialog').close();
avm99963a0036412020-12-29 13:39:05 +0100140
141 // Save automatically
142 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100143 });
144
145 // About credits...
avm999639bbb3a42020-12-29 03:29:44 +0100146 var normalCredits = fetch('json/credits.json').then(res => res.json());
147 var i18nCredits = fetch('json/i18n-credits.json').then(res => res.json());
148
149 Promise.all([normalCredits, i18nCredits])
150 .then(values => {
151 var credits = values[0];
152 var i18nCredits = values[1];
avm999635a57c412020-12-27 00:26:45 +0100153 var content = $('dialog#credits_dialog .content_area');
avm999639bbb3a42020-12-29 03:29:44 +0100154 credits.forEach(item => {
avm999635a57c412020-12-27 00:26:45 +0100155 var div = document.createElement('div');
avm999639bbb3a42020-12-29 03:29:44 +0100156 div.classList.add('entry');
avm999635a57c412020-12-27 00:26:45 +0100157 if (item.url) {
158 var a = document.createElement('a');
159 a.classList.add('homepage');
160 a.href = item.url;
161 a.target = '_blank';
162 a.textContent =
163 chrome.i18n.getMessage('options_credits_homepage');
164 div.append(a);
165 }
166
167 var h4 = document.createElement('h4');
168 h4.textContent = item.name;
169 div.append(h4);
170
171 if (item.author) {
172 var p = document.createElement('p');
173 p.classList.add('author');
174 p.textContent = chrome.i18n.getMessage('options_credits_by') +
175 ' ' + item.author +
176 (item.license ? ' - ' + item.license : '');
177 div.append(p);
178 }
179 content.append(div);
180 });
181
avm999639bbb3a42020-12-29 03:29:44 +0100182 var cList = document.getElementById('translators');
183 i18nCredits.forEach(contributor => {
184 var li = document.createElement('li');
185 var languages = [];
186 if (contributor.languages) {
187 contributor.languages.forEach(lang => {
188 languages.push(lang.name || 'undefined');
189 });
190 }
191
192 var name = document.createElement('span');
193 name.classList.add('name');
194 name.textContent = contributor.name || 'undefined';
195 li.append(name);
196
197 if (languages.length > 0) {
198 var languages =
199 document.createTextNode(': ' + languages.join(', '));
200 li.append(languages);
201 }
202
203 cList.append(li);
204 });
205
avm999635a57c412020-12-27 00:26:45 +0100206 window.onhashchange = function() {
207 if (location.hash == '#credits') {
avm999639bbb3a42020-12-29 03:29:44 +0100208 var credits = document.getElementById('credits_dialog');
209 credits.showModal();
210 credits.querySelector('.scrollable').scrollTo(0, 0);
avm999635a57c412020-12-27 00:26:45 +0100211 $('#credits_ok').focus();
212 }
213 };
214
215 if (location.hash == '#credits') {
216 $('dialog#credits_dialog').showModal();
217 $('#credits_ok').focus();
218 }
219
220 $('#credits_ok').addEventListener('click', _ => {
221 $('dialog#credits_dialog').close();
222 });
223 $('dialog#credits_dialog').addEventListener('close', _ => {
224 history.pushState(
225 '', document.title,
226 window.location.pathname + window.location.search);
227 });
228
229 // Print language list in the modal dialog
230 printListModal();
231 })
232 .catch(err => console.log(err));
233 });
avm999634a2a5d52016-06-04 16:17:29 +0200234}
235
avm99963a0036412020-12-29 13:39:05 +0100236function saveOptions(close = false) {
avm999635a57c412020-12-27 00:26:45 +0100237 var languages = document.getElementById('languages');
238 var options = {
239 uniquetab: '',
240 translateinto: {},
241 };
avm999634a2a5d52016-06-04 16:17:29 +0200242
avm999635a57c412020-12-27 00:26:45 +0100243 options.uniquetab = radioSelected('uniquetab');
avm999634a2a5d52016-06-04 16:17:29 +0200244
avm999635a57c412020-12-27 00:26:45 +0100245 var selected_languages = sortable.toArray();
avm999634a2a5d52016-06-04 16:17:29 +0200246
avm999635a57c412020-12-27 00:26:45 +0100247 var i = 0;
248 for (var language_id in selected_languages) {
249 var language = selected_languages[language_id];
250 options.translateinto[i] = language;
251 i++;
252 }
avm999634a2a5d52016-06-04 16:17:29 +0200253
avm999635a57c412020-12-27 00:26:45 +0100254 chrome.storage.sync.set(options, function() {
255 var background = chrome.extension.getBackgroundPage();
avm999634a2a5d52016-06-04 16:17:29 +0200256
avm999635a57c412020-12-27 00:26:45 +0100257 background.translator_tab = false;
258 background.translator_window = false;
avm99963a0036412020-12-29 13:39:05 +0100259 if (close) window.close();
avm999635a57c412020-12-27 00:26:45 +0100260 });
avm999634a2a5d52016-06-04 16:17:29 +0200261}
262
avm99963ce257a92020-12-27 00:07:13 +0100263function radioSelected(a) {
avm999635a57c412020-12-27 00:26:45 +0100264 var elements = document.getElementsByName(a);
avm999634a2a5d52016-06-04 16:17:29 +0200265
avm999635a57c412020-12-27 00:26:45 +0100266 for (var i = 0; i < elements.length; i++)
267 if (elements[i].checked) return elements[i].value;
avm999634a2a5d52016-06-04 16:17:29 +0200268}
269
270function inArray(needle, haystack) {
avm999635a57c412020-12-27 00:26:45 +0100271 var length = haystack.length;
272 for (var i = 0; i < length; i++) {
273 if (haystack[i] == needle) return true;
274 }
275 return false;
avm999634a2a5d52016-06-04 16:17:29 +0200276}
277
278window.addEventListener('load', init);