Code refactoring

The code was repetitive and old. This change is one iteration towards a
complete refactoring of the code which brings it to a better state.

Also, the extension icon now can be clicked to open the options page.

Change-Id: I998355cd871e31d6590608ff2563d43040944a83
diff --git a/src/js/options.js b/src/js/options.js
index 147b02e..eba0a1a 100644
--- a/src/js/options.js
+++ b/src/js/options.js
@@ -1,16 +1,3 @@
-var isoLangs={af:{name:"Afrikaans",nativeName:"Afrikaans"},sq:{name:"Albanian",nativeName:"Shqip"},am:{name:"Amharic",nativeName:"\u12a0\u121b\u122d\u129b"},ar:{name:"Arabic",nativeName:"\u0627\u0644\u0639\u0631\u0628\u064a\u0629"},hy:{name:"Armenian",nativeName:"\u0540\u0561\u0575\u0565\u0580\u0565\u0576"},az:{name:"Azerbaijani",nativeName:"az\u0259rbaycan dili"},eu:{name:"Basque",nativeName:"euskara"},be:{name:"Belarusian",nativeName:"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f"},
-bn:{name:"Bengali",nativeName:"\u09ac\u09be\u0982\u09b2\u09be"},bs:{name:"Bosnian",nativeName:"bosanski jezik"},bg:{name:"Bulgarian",nativeName:"\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0435\u0437\u0438\u043a"},ca:{name:"Catalan",nativeName:"Catal\u00e0"},ceb:{name:"Cebuano",nativeName:"Bisaya"},ny:{name:"Chichewa",nativeName:"chiChe\u0175a"},zh:{name:"Chinese",nativeName:"\u4e2d\u6587 (Zh\u014dngw\u00e9n)"},co:{name:"Corsican",nativeName:"corsu"},hr:{name:"Croatian",nativeName:"hrvatski"},
-cs:{name:"Czech",nativeName:"\u010desky"},da:{name:"Danish",nativeName:"dansk"},nl:{name:"Dutch",nativeName:"Nederlands"},en:{name:"English",nativeName:"English"},eo:{name:"Esperanto",nativeName:"Esperanto"},et:{name:"Estonian",nativeName:"eesti"},tl:{name:"Filipino",nativeName:"Pilipino"},fi:{name:"Finnish",nativeName:"suomi"},fr:{name:"French",nativeName:"fran\u00e7ais"},fy:{name:"Frisian",nativeName:"Frysk"},gl:{name:"Galician",nativeName:"Galego"},ka:{name:"Georgian",nativeName:"\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8"},
-de:{name:"German",nativeName:"Deutsch"},el:{name:"Greek",nativeName:"\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"},gu:{name:"Gujarati",nativeName:"\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0"},ht:{name:"Haitian Creole",nativeName:"Krey\u00f2l ayisyen"},ha:{name:"Hausa",nativeName:"Hausa"},haw:{name:"Hawaiian",nativeName:"Hausa"},iw:{name:"Hebrew",nativeName:"\u05e2\u05d1\u05e8\u05d9\u05ea"},hi:{name:"Hindi",nativeName:"\u0939\u093f\u0928\u094d\u0926\u0940, \u0939\u093f\u0902\u0926\u0940"},hmn:{name:"Hmong",
-nativeName:"lus Hmoob"},hu:{name:"Hungarian",nativeName:"Magyar"},is:{name:"Icelandic",nativeName:"\u00cdslenska"},ig:{name:"Igbo",nativeName:"As\u1ee5s\u1ee5 Igbo"},id:{name:"Indonesian",nativeName:"Bahasa Indonesia"},ga:{name:"Irish",nativeName:"Gaeilge"},it:{name:"Italian",nativeName:"Italiano"},ja:{name:"Japanese",nativeName:"\u65e5\u672c\u8a9e (\u306b\u307b\u3093\u3054\uff0f\u306b\u3063\u307d\u3093\u3054)"},jv:{name:"Javanese",nativeName:"basa Jawa"},kn:{name:"Kannada",nativeName:"\u0c95\u0ca8\u0ccd\u0ca8\u0ca1"},
-kk:{name:"Kazakh",nativeName:"\u049a\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456"},km:{name:"Khmer",nativeName:"\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a"},ko:{name:"Korean",nativeName:"\ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e)"},ku:{name:"Kurdish (Kurmanji)",nativeName:"Kurd\u00ee"},ky:{name:"Kyrgyz",nativeName:"\u043a\u044b\u0440\u0433\u044b\u0437 \u0442\u0438\u043b\u0438"},lo:{name:"Lao",nativeName:"\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7"},la:{name:"Latin",nativeName:"latine"},
-lv:{name:"Latvian",nativeName:"latvie\u0161u valoda"},lt:{name:"Lithuanian",nativeName:"lietuvi\u0173 kalba"},lb:{name:"Luxembourgish",nativeName:"L\u00ebtzebuergesch"},mk:{name:"Macedonian",nativeName:"\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a"},mg:{name:"Malagasy",nativeName:"Malagasy fiteny"},ms:{name:"Malay",nativeName:"bahasa Melayu"},ml:{name:"Malayalam",nativeName:"\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02"},mt:{name:"Maltese",nativeName:"Malti"},
-mi:{name:"M\u0101ori",nativeName:"te reo M\u0101ori"},mr:{name:"Marathi",nativeName:"\u092e\u0930\u093e\u0920\u0940"},mn:{name:"Mongolian",nativeName:"\u043c\u043e\u043d\u0433\u043e\u043b"},my:{name:"Myanmar",nativeName:"\u1017\u1019\u102c\u1005\u102c"},ne:{name:"Nepali",nativeName:"\u0928\u0947\u092a\u093e\u0932\u0940"},no:{name:"Norwegian",nativeName:"Norsk"},ps:{name:"Pashto",nativeName:"\u067e\u069a\u062a\u0648"},fa:{name:"Persian",nativeName:"\u0641\u0627\u0631\u0633\u06cc"},pl:{name:"Polish",
-nativeName:"polski"},pt:{name:"Portuguese",nativeName:"Portugu\u00eas"},pa:{name:"Punjabi",nativeName:"\u0a2a\u0a70\u0a1c\u0a3e\u0a2c"},ro:{name:"Romanian",nativeName:"rom\u00e2n\u0103"},ru:{name:"Russian",nativeName:"\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a"},sm:{name:"Samoan",nativeName:"gagana faa Samoa"},gd:{name:"Scots Gaelic",nativeName:"G\u00e0idhlig"},sr:{name:"Serbian",nativeName:"\u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a"},st:{name:"Sesotho",
-nativeName:"Sesotho"},sn:{name:"Shona",nativeName:"chiShona"},sd:{name:"Sindhi",nativeName:"\u0938\u093f\u0928\u094d\u0927\u0940"},si:{name:"Sinhala",nativeName:"\u0dc3\u0dd2\u0d82\u0dc4\u0dbd"},sk:{name:"Slovak",nativeName:"sloven\u010dina"},sl:{name:"Slovenian",nativeName:"sloven\u0161\u010dina"},so:{name:"Somali",nativeName:"Soomaaliga"},es:{name:"Spanish",nativeName:"espa\u00f1ol"},su:{name:"Sundanese",nativeName:"Basa Sunda"},sw:{name:"Swahili",nativeName:"Kiswahili"},sv:{name:"Swedish",nativeName:"svenska"},
-tg:{name:"Tajik",nativeName:"\u0442\u043e\u04b7\u0438\u043a\u04e3"},ta:{name:"Tamil",nativeName:"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"},te:{name:"Telugu",nativeName:"\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41"},th:{name:"Thai",nativeName:"\u0e44\u0e17\u0e22"},tr:{name:"Turkish",nativeName:"T\u00fcrk\u00e7e"},uk:{name:"Ukrainian",nativeName:"\u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"},ur:{name:"Urdu",nativeName:"\u0627\u0631\u062f\u0648"},uz:{name:"Uzbek",nativeName:"zbek"},vi:{name:"Vietnamese",
-nativeName:"Ti\u1ebfng Vi\u1ec7t"},cy:{name:"Welsh",nativeName:"Cymraeg"},xh:{name:"Xhosa",nativeName:"isiXhosa"},yi:{name:"Yiddish",nativeName:"\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9"},yo:{name:"Yoruba",nativeName:"Yor\u00f9b\u00e1"},za:{name:"Zhuang, Chuang",nativeName:"Sa\u026f cue\u014b\u0185"},zu:{name:"Zulu",nativeName:"isiZulu"}};
-
 function $(selector) {
     return document.querySelector(selector);
 }
@@ -24,154 +11,187 @@
 }
 
 function i18n() {
-    $("#welcome").innerHTML = chrome.i18n.getMessage("options_welcome");
-    $("#introduction").innerHTML = chrome.i18n.getMessage("options_introduction");
-    //$("#languageselectheader").innerHTML = chrome.i18n.getMessage("options_languageselectheader");
-    $("#otheroptionsheader").innerHTML = chrome.i18n.getMessage("options_otheroptionsheader");
-    $("#varioustabs_label").innerHTML = chrome.i18n.getMessage("options_tabsoption_1");
-    $("#uniquetab_label").innerHTML = chrome.i18n.getMessage("options_tabsoption_2");
-    $("#panel_label").innerHTML = chrome.i18n.getMessage("options_tabsoption_3");
-    $("#languages_add").innerHTML = chrome.i18n.getMessage("options_addlanguage_addbutton");
-    $("#save").innerHTML = chrome.i18n.getMessage("options_savebutton");
-    $("#credits").innerHTML = chrome.i18n.getMessage("options_credits");
-    $("#credits_dialog h3").innerHTML = chrome.i18n.getMessage("options_credits");
-    $("#languages_add_ok").innerHTML = chrome.i18n.getMessage("options_ok");
-    $("#languages_add_cancel").innerHTML = chrome.i18n.getMessage("options_cancel");
-    $("#credits_ok").innerHTML = chrome.i18n.getMessage("options_ok");
-    $("#languages_add_dialog h3").innerHTML = chrome.i18n.getMessage("options_addlanguage");
-    $("#language_label").innerHTML = chrome.i18n.getMessage("options_language_label");
+    $all('[data-i18n]').forEach(el => {
+        el.innerHTML =
+            chrome.i18n.getMessage('options_' + el.getAttribute('data-i18n'));
+    });
 }
 
-function print_list_modal() {
-    $("#select_language").innerHTML = "";
+function printListModal() {
+    $('#select_language').textContent = '';
     var heysortable = sortable.toArray();
     for (var language in isoLangs) {
         if (!inArray(language, heysortable)) {
             var el = document.createElement('option');
             el.setAttribute('value', language);
-            el.innerText = isoLangs[language]["name"]+" ("+isoLangs[language]["nativeName"]+")";
-            $("#select_language").appendChild(el);
+            el.innerText = isoLangs[language]['name'] + ' (' +
+                isoLangs[language]['nativeName'] + ')';
+            $('#select_language').appendChild(el);
         }
     }
 }
 
 function init() {
     i18n();
-    chrome.storage.sync.get(null, function(items) {
+    chrome.storage.sync.get(null, items => {
         // If no settings are set
         if (isEmpty(items)) {
-            items = {'translateinto': {}, 'uniquetab': ''};
-            chrome.storage.sync.set({'translateinto': {}, 'uniquetab': ''});
+            items = {
+                translateinto: {},
+                uniquetab: '',
+            };
+            chrome.storage.sync.set(items);
         }
 
         // Check the checkbox of the window opening
-        if (items.uniquetab === "yep")
-            $("#uniquetab").checked = true;
-        if (items.uniquetab === "")
-            $("#varioustabs").checked = true;
-        if (items.uniquetab === "panel")
-            $("#panel").checked = true;
+        if (items.uniquetab === 'yep') $('#uniquetab').checked = true;
+        if (items.uniquetab === '') $('#varioustabs').checked = true;
+        if (items.uniquetab === 'panel') $('#panel').checked = true;
 
         // Add event listeners for certain buttons and links
-        $("#panelsflag").addEventListener('click', function() { event.preventDefault(); chrome.tabs.create({url: 'chrome://flags/#enable-panels'}); });
-        $("#save").addEventListener('click', function() {
-            save_options();
+        $('#panelsflag').addEventListener('click', _ => {
+            event.preventDefault();
+            chrome.tabs.create({url: 'chrome://flags/#enable-panels'});
+        });
+
+        $('#save').addEventListener('click', _ => {
+            saveOptions();
         });
 
         // Print selected language list
         var languages = items.translateinto;
 
         if (languages) {
-            for (var language_id in languages) {
+            for (var language_id of Object.keys(languages)) {
                 var language = languages[language_id];
                 var el = document.createElement('li');
                 el.setAttribute('data-language', language);
                 el.setAttribute('data-id', language);
-                el.innerHTML = isoLangs[language]["name"]+" ("+isoLangs[language]["nativeName"]+")"+"<span data-language='"+language+"' class='delete'>x</span>";
-                $("#languages").appendChild(el);
-                $("#languages li[data-language="+language+"] .delete").addEventListener('click', function() {
-                    $("#languages").removeChild($("li[data-language="+this.getAttribute("data-language")+"]"));
-                    print_list_modal();
-                });
+                el.innerHTML = isoLangs[language]['name'] + ' (' +
+                    isoLangs[language]['nativeName'] + ')' +
+                    '<span data-language=\'' + language +
+                    '\' class=\'delete\'>x</span>';
+                $('#languages').appendChild(el);
+                $('#languages li[data-language=' + language + '] .delete')
+                    .addEventListener('click', function() {
+                        $('#languages')
+                            .removeChild(
+                                $('li[data-language=' +
+                                  this.getAttribute('data-language') + ']'));
+                        printListModal();
+                    });
             }
         }
 
         // Initiate Sortable
-        sortable = new Sortable($("#languages"), {
-            animation: 150
-        });
+        sortable = new Sortable($('#languages'), {animation: 150});
 
         // Handling The Dialog
-        $("#languages_add").addEventListener('click', function() { $("dialog#languages_add_dialog").showModal(); $("#select_language").focus(); });
-        $("#languages_add_cancel").addEventListener('click', function() { $("dialog#languages_add_dialog").close(); });
-        $("#languages_add_ok").addEventListener('click', function() {
+        $('#languages_add').addEventListener('click', _ => {
+            $('dialog#languages_add_dialog').showModal();
+            $('#select_language').focus();
+        });
+
+        $('#languages_add_cancel').addEventListener('click', _ => {
+            $('dialog#languages_add_dialog').close();
+        });
+
+        $('#languages_add_ok').addEventListener('click', _ => {
             var el = document.createElement('li');
-            var language = $("#select_language").value;
+            var language = $('#select_language').value;
             if (inArray(language, sortable.toArray())) {
                 return;
             }
             el.setAttribute('data-language', language);
             el.setAttribute('data-id', language);
-            el.innerHTML = isoLangs[language]["name"]+" ("+isoLangs[language]["nativeName"]+")"+"<span data-language='"+language+"' class='delete'>x</span>";
-            $("#languages").appendChild(el);
-            var selection = $("#select_language option[value="+language+"]");
+            el.innerHTML = isoLangs[language]['name'] + ' (' +
+                isoLangs[language]['nativeName'] + ')' +
+                '<span data-language=\'' + language +
+                '\' class=\'delete\'>x</span>';
+            $('#languages').appendChild(el);
+            var selection =
+                $('#select_language option[value=' + language + ']');
             selection.parentNode.removeChild(selection);
-            $("#languages li[data-id="+language+"] .delete").addEventListener('click', function() {
-                $("#languages").removeChild($("li[data-language="+this.getAttribute("data-language")+"]"));
-                print_list_modal();
-            });
-            $("dialog").close();
+            $('#languages li[data-id=' + language + '] .delete')
+                .addEventListener('click', function() {
+                    $('#languages')
+                        .removeChild(
+                            $('li[data-language=' +
+                              this.getAttribute('data-language') + ']'));
+                    printListModal();
+                });
+            $('dialog').close();
         });
 
         // About credits...
-        var xhr = new XMLHttpRequest();
-        xhr.onreadystatechange = function() {
-            if (xhr.readyState == 4 && xhr.status == 200) {
-                var json = JSON.parse(xhr.responseText), printhtml = "";
-                for (var item in json) {
-                    printhtml += "<div>";
-                    if (json[item].url) {
-                        printhtml += "<a href='"+json[item].url+"' class='homepage' target='_blank'>"+chrome.i18n.getMessage("options_credits_homepage")+"</a>";
+        fetch('json/credits.json')
+            .then(res => res.json())
+            .then(json => {
+                var content = $('dialog#credits_dialog .content_area');
+                json.forEach(item => {
+                    var div = document.createElement('div');
+                    if (item.url) {
+                        var a = document.createElement('a');
+                        a.classList.add('homepage');
+                        a.href = item.url;
+                        a.target = '_blank';
+                        a.textContent =
+                            chrome.i18n.getMessage('options_credits_homepage');
+                        div.append(a);
                     }
-                    printhtml += "<h4>"+json[item].name+"</h4>";
-                    if (json[item].author) {
-                        printhtml += "<p class='author'>"+chrome.i18n.getMessage("options_credits_by")+" "+json[item].author;
-                    }
-                    if (json[item].license) {
-                        printhtml += " – "+json[item].license+"</p>";
-                    } else {
-                        printhtml += "</p>";
-                    }
-                    printhtml += "</div>";
-                }
-                $("dialog#credits_dialog .content_area").innerHTML = printhtml;
-                window.onhashchange = function() {
-                    if (location.hash == "#credits") {
-                        $("dialog#credits_dialog").showModal();
-                        $("#credits_ok").focus();
-                    }
-                }
-                if (location.hash == "#credits") {
-                    $("dialog#credits_dialog").showModal();
-                    $("#credits_ok").focus();
-                }
-                $("#credits_ok").addEventListener('click', function() { $("dialog#credits_dialog").close(); });
-                $("dialog#credits_dialog").addEventListener('close', function() { history.pushState("", document.title, window.location.pathname + window.location.search); });
-            }
-        }
-        xhr.open("GET", "json/credits.json", true);
-        xhr.send();
 
-        // Print language list in the modal dialog
-        print_list_modal();
+                    var h4 = document.createElement('h4');
+                    h4.textContent = item.name;
+                    div.append(h4);
+
+                    if (item.author) {
+                        var p = document.createElement('p');
+                        p.classList.add('author');
+                        p.textContent =
+                            chrome.i18n.getMessage('options_credits_by') + ' ' +
+                            item.author +
+                            (item.license ? ' - ' + item.license : '');
+                        div.append(p);
+                    }
+                    content.append(div);
+                });
+
+                window.onhashchange = function() {
+                    if (location.hash == '#credits') {
+                        $('dialog#credits_dialog').showModal();
+                        $('#credits_ok').focus();
+                    }
+                };
+
+                if (location.hash == '#credits') {
+                    $('dialog#credits_dialog').showModal();
+                    $('#credits_ok').focus();
+                }
+
+                $('#credits_ok').addEventListener('click', _ => {
+                    $('dialog#credits_dialog').close();
+                });
+                $('dialog#credits_dialog').addEventListener('close', _ => {
+                    history.pushState(
+                        '', document.title,
+                        window.location.pathname + window.location.search);
+                });
+
+                // Print language list in the modal dialog
+                printListModal();
+            })
+            .catch(err => console.log(err));
     });
 }
 
-function save_options() {
-    var languages = document.getElementById("languages");
-    var options = {"uniquetab": "", "translateinto": {}};
+function saveOptions() {
+    var languages = document.getElementById('languages');
+    var options = {
+        uniquetab: '',
+        translateinto: {},
+    };
 
-    options.uniquetab = radio_selected("uniquetab");
+    options.uniquetab = radioSelected('uniquetab');
 
     var selected_languages = sortable.toArray();
 
@@ -189,29 +209,19 @@
         background.translator_window = false;
         window.close();
     });
-
-    // We don't need the following code because the background.js is already listening to changes in chrome.sync ;-) Yeeey!
-    //chrome.extension.getBackgroundPage().createmenus(JSON.stringify(options));
 }
 
-function toObject(arr) {
-    var rv = {};
-    for (var i = 0; i < arr.length; ++i)
-        if (arr[i] !== undefined) rv[i] = arr[i];
-    return rv;
-}
-
-function radio_selected(a) {
+function radioSelected(a) {
     var elements = document.getElementsByName(a);
 
-    for (var i=0; i<elements.length; i++)
+    for (var i = 0; i < elements.length; i++)
         if (elements[i].checked) return elements[i].value;
 }
 
 function inArray(needle, haystack) {
     var length = haystack.length;
-    for(var i = 0; i < length; i++) {
-        if(haystack[i] == needle) return true;
+    for (var i = 0; i < length; i++) {
+        if (haystack[i] == needle) return true;
     }
     return false;
 }