/**
 *  ABook Viewer for WEB
 *  Common processing for internationalization (language switching)
 *
 *  For language resource files, modify the following files according to the language you specify
 *   - ja: lang-ja.json
 *   - ko: lang-ko.json
 *   - en : lang-en.json
 *
 *  Copyright (C) Agentec Co, Ltd. All rights reserved.
 */

//Prepare objects for the global namespace
var I18N = {};

/**
 * Constant: Language file location
 */
I18N.avwsys_location = '';
I18N.avwsys_dir = '';
I18N.avwsys_storagekey = '';
I18N.avwsys_currLang = '';

/* Language initialization */
$(function () {
    I18N.initi18n();
});

/** Initialization of language resource settings */
I18N.initi18n = function () {
    I18N.avwsys_location = '/common/json/lang';
    I18N.avwsys_dir = '/abweb';
    I18N.avwsys_storagekey = 'AVWUS_Lang';
    I18N.avwsys_currLang = 'AVW_CurrLang';

    // Login screen/direct access measures
    var location = window.location.toString().toLowerCase();
    if (location.indexOf(I18N.avwsys_dir) < 0) {
        // If not under I18N.avwsys_dir directory, add I18N.avwsys_dir directory
        I18N.avwsys_location = '..' + I18N.avwsys_dir + I18N.avwsys_location;
    } else {
        // If under I18N.avwsys_dir directory, convert to relative path
        I18N.avwsys_location = '..' + I18N.avwsys_location;
    }

    var lang = 'en';
    var storage = window.localStorage;
    if (storage) {
        var lang = storage.getItem(I18N.avwsys_storagekey);
        if (!lang) {
            lang = I18N.getNavigatorLanguage();
        }
    }
    // Initialize language files
    I18N.loadLanguage(lang);
};

/* Retrieve browser language settings */
I18N.getNavigatorLanguage = function () {
    var lang = navigator.browserLanguage || navigator.language || navigator.userLanguage;
    /* Languages Supported */
    var languages = ['ja', 'ko', 'en']; // Change here if you want to add more supported languages
    if (lang.match(/ja|ko|en/g)) {
        for (var i = 0; i < languages.length; i++) {
            var index = lang.indexOf(languages[i]);
            if (index >= 0) {
                lang = lang.substring(index, 2);
                break;
            }
        }
    } else {
        lang = 'en'; // If there is no supported language, English is the default.
    }
    return lang;
};

/**
 * Language resource file loading
 * @param {*} lang
 */
I18N.loadLanguage = function (lang) {
    // Select language file from arguments
    var langfile = 'lang-' + lang + '.json';

    // Read the language file
    $.ajax({
        url: I18N.avwsys_location + '/' + langfile,
        async: false,
        dataType: 'json',
        cache: false,
        success: function (data) {
            // Rewriting the lang attribute
            document.documentElement.lang = lang;

            // Rewrite html language data
            var jsonLangData = data;
            I18N.replaceText(jsonLangData);

            // Cache language settings and language data in storage
            I18N.storeCurrentLanguage(lang, jsonLangData);
        },
        error: function (xhr, txtStatus, errorThrown) {
            var error = 'Could not load a language file ' + langfile + '. please check it.';
            error += '\n' + xhr.status + ' ' + txtStatus + ' ' + errorThrown + ' : ' + langfile;
            alert(error);
        },
    });
};

/**
 * Replace all text on the page with the language
 * @param {*} jsonLangData
 */
I18N.replaceText = function (jsonLangData) {
    var itemCount = $('.lang').length;
    if (itemCount > 0) {
        for (var i = 0; i < itemCount; i++) {
            var obj = $('.lang:eq(' + i + ')');
            var langId = obj.attr('lang');
            if (langId) {
                var langText = I18N.getLangText(jsonLangData, langId);
                var tn = obj.get()[0].localName;
                if (tn == 'input') {
                    if (obj.attr('type') == 'button' || obj.attr('type') == 'submit') {
                        obj.val(langText);
                    } else {
                        obj.text(langText);
                    }
                    const attr = obj.attr('placeholder');
                    if (typeof attr !== 'undefined' && attr !== false) {
                        obj.attr('placeholder', langText);
                    }
                } else {
                    if (obj.attr('type') == 'image') {
                        obj.attr('alt', langText);
                        obj.attr('title', langText);
                    } else {
                        obj.text(langText);
                    }
                }
            }
        }
    }
};

/* Replace HTML text with the currently set language */
I18N.i18nReplaceText = function () {
    var storage = window.sessionStorage;
    if (storage) {
        var value = storage.getItem(I18N.avwsys_storagekey);
        if (value) {
            var json = JSON.parse(value);
            I18N.replaceText(json);
        }
    }
};

/**
 * Get string from key
 * @param {*} key
 * @returns
 */
I18N.i18nText = function (key) {
    var storage = window.sessionStorage;
    if (storage) {
        var value = storage.getItem(I18N.avwsys_storagekey);
        if (value) {
            var json = JSON.parse(value);
            return I18N.getLangText(json, key);
        }
    }
    return 'undefined';
};

/**
 * Obtain strings from key values of language data
 * @param {*} jsonLangData
 * @param {*} key
 * @returns
 */
I18N.getLangText = function (jsonLangData, key) {
    if (jsonLangData) {
        var text = jsonLangData[key];
        return text;
    }
    return 'undefined.';
};

/**
 * Switching Language Data
 * @param {*} lang
 */
I18N.changeLanguage = function (lang) {
    // Store the selected language only when switching languages
    var storage = window.localStorage;
    if (storage) {
        storage.setItem(I18N.avwsys_storagekey, lang);
    }

    // Reads language files and converts text strings
    I18N.loadLanguage(lang);
};

/**
 * Save language settings
 * @param {*} lang
 * @param {*} langData
 */
I18N.storeCurrentLanguage = function (lang, langData) {
    var ss = window.sessionStorage;
    if (ss) {
        // language data
        ss.setItem(I18N.avwsys_storagekey, JSON.stringify(langData));
        // current language
        ss.setItem(I18N.avwsys_currLang, lang);
    }
};
/* Retrieving the setting language */
I18N.getCurrentLanguage = function () {
    var lang;
    var storage = window.sessionStorage;
    if (storage) {
        lang = storage.getItem(I18N.avwsys_currLang);
    }
    if (!lang) {
        lang = I18N.getNavigatorLanguage();
    }
    return lang;
};