blob: eba0a1a59bfa0421a4b17ecb4e2d8998ef214f40 [file] [log] [blame]
avm999634a2a5d52016-06-04 16:17:29 +02001function $(selector) {
2 return document.querySelector(selector);
3}
4
5function $all(selector) {
6 return document.querySelectorAll(selector);
7}
8
9function isEmpty(obj) {
10 return Object.keys(obj).length === 0;
11}
12
13function i18n() {
avm99963ce257a92020-12-27 00:07:13 +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() {
21 $('#select_language').textContent = '';
avm999634a2a5d52016-06-04 16:17:29 +020022 var heysortable = sortable.toArray();
23 for (var language in isoLangs) {
24 if (!inArray(language, heysortable)) {
25 var el = document.createElement('option');
26 el.setAttribute('value', language);
avm99963ce257a92020-12-27 00:07:13 +010027 el.innerText = isoLangs[language]['name'] + ' (' +
28 isoLangs[language]['nativeName'] + ')';
29 $('#select_language').appendChild(el);
avm999634a2a5d52016-06-04 16:17:29 +020030 }
31 }
32}
33
34function init() {
35 i18n();
avm99963ce257a92020-12-27 00:07:13 +010036 chrome.storage.sync.get(null, items => {
avm999634a2a5d52016-06-04 16:17:29 +020037 // If no settings are set
38 if (isEmpty(items)) {
avm99963ce257a92020-12-27 00:07:13 +010039 items = {
40 translateinto: {},
41 uniquetab: '',
42 };
43 chrome.storage.sync.set(items);
avm999634a2a5d52016-06-04 16:17:29 +020044 }
45
46 // Check the checkbox of the window opening
avm99963ce257a92020-12-27 00:07:13 +010047 if (items.uniquetab === 'yep') $('#uniquetab').checked = true;
48 if (items.uniquetab === '') $('#varioustabs').checked = true;
49 if (items.uniquetab === 'panel') $('#panel').checked = true;
avm999634a2a5d52016-06-04 16:17:29 +020050
51 // Add event listeners for certain buttons and links
avm99963ce257a92020-12-27 00:07:13 +010052 $('#panelsflag').addEventListener('click', _ => {
53 event.preventDefault();
54 chrome.tabs.create({url: 'chrome://flags/#enable-panels'});
55 });
56
57 $('#save').addEventListener('click', _ => {
58 saveOptions();
avm999634a2a5d52016-06-04 16:17:29 +020059 });
60
61 // Print selected language list
62 var languages = items.translateinto;
63
64 if (languages) {
avm99963ce257a92020-12-27 00:07:13 +010065 for (var language_id of Object.keys(languages)) {
avm999634a2a5d52016-06-04 16:17:29 +020066 var language = languages[language_id];
67 var el = document.createElement('li');
68 el.setAttribute('data-language', language);
69 el.setAttribute('data-id', language);
avm99963ce257a92020-12-27 00:07:13 +010070 el.innerHTML = isoLangs[language]['name'] + ' (' +
71 isoLangs[language]['nativeName'] + ')' +
72 '<span data-language=\'' + language +
73 '\' class=\'delete\'>x</span>';
74 $('#languages').appendChild(el);
75 $('#languages li[data-language=' + language + '] .delete')
76 .addEventListener('click', function() {
77 $('#languages')
78 .removeChild(
79 $('li[data-language=' +
80 this.getAttribute('data-language') + ']'));
81 printListModal();
82 });
avm999634a2a5d52016-06-04 16:17:29 +020083 }
84 }
85
86 // Initiate Sortable
avm99963ce257a92020-12-27 00:07:13 +010087 sortable = new Sortable($('#languages'), {animation: 150});
avm999634a2a5d52016-06-04 16:17:29 +020088
89 // Handling The Dialog
avm99963ce257a92020-12-27 00:07:13 +010090 $('#languages_add').addEventListener('click', _ => {
91 $('dialog#languages_add_dialog').showModal();
92 $('#select_language').focus();
93 });
94
95 $('#languages_add_cancel').addEventListener('click', _ => {
96 $('dialog#languages_add_dialog').close();
97 });
98
99 $('#languages_add_ok').addEventListener('click', _ => {
avm999634a2a5d52016-06-04 16:17:29 +0200100 var el = document.createElement('li');
avm99963ce257a92020-12-27 00:07:13 +0100101 var language = $('#select_language').value;
avm999634a2a5d52016-06-04 16:17:29 +0200102 if (inArray(language, sortable.toArray())) {
103 return;
104 }
105 el.setAttribute('data-language', language);
106 el.setAttribute('data-id', language);
avm99963ce257a92020-12-27 00:07:13 +0100107 el.innerHTML = isoLangs[language]['name'] + ' (' +
108 isoLangs[language]['nativeName'] + ')' +
109 '<span data-language=\'' + language +
110 '\' class=\'delete\'>x</span>';
111 $('#languages').appendChild(el);
112 var selection =
113 $('#select_language option[value=' + language + ']');
avm999634a2a5d52016-06-04 16:17:29 +0200114 selection.parentNode.removeChild(selection);
avm99963ce257a92020-12-27 00:07:13 +0100115 $('#languages li[data-id=' + language + '] .delete')
116 .addEventListener('click', function() {
117 $('#languages')
118 .removeChild(
119 $('li[data-language=' +
120 this.getAttribute('data-language') + ']'));
121 printListModal();
122 });
123 $('dialog').close();
avm999634a2a5d52016-06-04 16:17:29 +0200124 });
125
126 // About credits...
avm99963ce257a92020-12-27 00:07:13 +0100127 fetch('json/credits.json')
128 .then(res => res.json())
129 .then(json => {
130 var content = $('dialog#credits_dialog .content_area');
131 json.forEach(item => {
132 var div = document.createElement('div');
133 if (item.url) {
134 var a = document.createElement('a');
135 a.classList.add('homepage');
136 a.href = item.url;
137 a.target = '_blank';
138 a.textContent =
139 chrome.i18n.getMessage('options_credits_homepage');
140 div.append(a);
avm999634a2a5d52016-06-04 16:17:29 +0200141 }
avm999634a2a5d52016-06-04 16:17:29 +0200142
avm99963ce257a92020-12-27 00:07:13 +0100143 var h4 = document.createElement('h4');
144 h4.textContent = item.name;
145 div.append(h4);
146
147 if (item.author) {
148 var p = document.createElement('p');
149 p.classList.add('author');
150 p.textContent =
151 chrome.i18n.getMessage('options_credits_by') + ' ' +
152 item.author +
153 (item.license ? ' - ' + item.license : '');
154 div.append(p);
155 }
156 content.append(div);
157 });
158
159 window.onhashchange = function() {
160 if (location.hash == '#credits') {
161 $('dialog#credits_dialog').showModal();
162 $('#credits_ok').focus();
163 }
164 };
165
166 if (location.hash == '#credits') {
167 $('dialog#credits_dialog').showModal();
168 $('#credits_ok').focus();
169 }
170
171 $('#credits_ok').addEventListener('click', _ => {
172 $('dialog#credits_dialog').close();
173 });
174 $('dialog#credits_dialog').addEventListener('close', _ => {
175 history.pushState(
176 '', document.title,
177 window.location.pathname + window.location.search);
178 });
179
180 // Print language list in the modal dialog
181 printListModal();
182 })
183 .catch(err => console.log(err));
avm999634a2a5d52016-06-04 16:17:29 +0200184 });
185}
186
avm99963ce257a92020-12-27 00:07:13 +0100187function saveOptions() {
188 var languages = document.getElementById('languages');
189 var options = {
190 uniquetab: '',
191 translateinto: {},
192 };
avm999634a2a5d52016-06-04 16:17:29 +0200193
avm99963ce257a92020-12-27 00:07:13 +0100194 options.uniquetab = radioSelected('uniquetab');
avm999634a2a5d52016-06-04 16:17:29 +0200195
196 var selected_languages = sortable.toArray();
197
198 var i = 0;
199 for (var language_id in selected_languages) {
200 var language = selected_languages[language_id];
201 options.translateinto[i] = language;
202 i++;
203 }
204
205 chrome.storage.sync.set(options, function() {
206 var background = chrome.extension.getBackgroundPage();
207
208 background.translator_tab = false;
209 background.translator_window = false;
210 window.close();
211 });
avm999634a2a5d52016-06-04 16:17:29 +0200212}
213
avm99963ce257a92020-12-27 00:07:13 +0100214function radioSelected(a) {
avm999634a2a5d52016-06-04 16:17:29 +0200215 var elements = document.getElementsByName(a);
216
avm99963ce257a92020-12-27 00:07:13 +0100217 for (var i = 0; i < elements.length; i++)
avm999634a2a5d52016-06-04 16:17:29 +0200218 if (elements[i].checked) return elements[i].value;
219}
220
221function inArray(needle, haystack) {
222 var length = haystack.length;
avm99963ce257a92020-12-27 00:07:13 +0100223 for (var i = 0; i < length; i++) {
224 if (haystack[i] == needle) return true;
avm999634a2a5d52016-06-04 16:17:29 +0200225 }
226 return false;
227}
228
229window.addEventListener('load', init);