/**
 *  ABook Viewer for WEB
 *  国際化（言語切替）対応共通処理
 *
 *  言語リソースファイルは、指定する言語に合わせて以下のファイルを修正する
 *   - 日本語：　lang-ja.json
 *   - 韓国語：　lang-ko.json
 *   - 英語　：　lang-en.json
 *
 *  Copyright (C) Agentec Co, Ltd. All rights reserved.
 */

//グローバルの名前空間用のオブジェクトを用意する
var I18N = {};

/**
 * 定数：言語ファイル配置場所
 */
I18N.avwsys_location = '';
I18N.avwsys_dir = '';
I18N.avwsys_storagekey = '';
I18N.avwsys_currLang = '';

/* 言語の初期化 */
$(function () {
    I18N.initi18n();
});

/** 言語リソース設定初期化 */
I18N.initi18n = function () {
    I18N.avwsys_location = '/common/json/lang';
    I18N.avwsys_dir = '/abweb';
    I18N.avwsys_storagekey = 'AVWUS_Lang';
    I18N.avwsys_currLang = 'AVW_CurrLang';

    // ログイン画面/直接アクセス対策
    var location = window.location.toString().toLowerCase();
    if (location.indexOf(I18N.avwsys_dir) < 0) {
        // I18N.avwsys_dirディレクトリ配下ではない場合は、I18N.avwsys_dirディレクトリをつける
        I18N.avwsys_location = '..' + I18N.avwsys_dir + I18N.avwsys_location;
    } else {
        // I18N.avwsys_dirディレクトリ配下の場合は、相対パスに変換
        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();
        }
    }
    // 言語ファイルを初期化する
    I18N.loadLanguage(lang);
};

/* ブラウザの言語設定を取得する */
I18N.getNavigatorLanguage = function () {
    var lang = navigator.browserLanguage || navigator.language || navigator.userLanguage;
    /* 対応言語 */
    var languages = ['ja', 'ko', 'en']; // 対応言語を増やす場合はここを変更する
    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'; // 対応言語が無ければ英語をデフォルトとする
    }
    return lang;
};

/* 言語リソースファイル読み込み */
I18N.loadLanguage = function (lang) {
    // 引数から言語ファイルを選択
    var langfile = 'lang-' + lang + '.json';

    // 言語ファイルを読み込む
    $.ajax({
        url: I18N.avwsys_location + '/' + langfile,
        async: false,
        dataType: 'json',
        cache: false,
        success: function (data) {
            // lang属性の書換え
            document.documentElement.lang = lang;

            // html の言語データを書換える
            var jsonLangData = data;
            I18N.replaceText(jsonLangData);

            // 言語設定、言語データをストレージにキャッシュしておく
            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);
        },
    });
};

/* ページ内のテキストをすべて言語に合わせて置換する */
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);
                    }
                }
            }
        }
    }
};

/* 現在設定されている言語でHTMLテキストを置き換える */
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);
        }
    }
};

/* キーから文字列を取得 */
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';
};

/* 言語データのキー値から文字列を取得 */
I18N.getLangText = function (jsonLangData, key) {
    if (jsonLangData) {
        var text = jsonLangData[key];
        return text;
    }
    return 'undefined.';
};

/* 言語データの切り替え */
I18N.changeLanguage = function (lang) {
    // 言語の切替を行った場合のみ選択言語をストアする
    var storage = window.localStorage;
    if (storage) {
        storage.setItem(I18N.avwsys_storagekey, lang);
    }

    // 言語ファイルを読み込み、テキスト文字列を変換する
    I18N.loadLanguage(lang);
};

/* 設定言語の保存 */
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);
    }
};
/* 設定言語の取得 */
I18N.getCurrentLanguage = function () {
    var lang;
    var storage = window.sessionStorage;
    if (storage) {
        lang = storage.getItem(I18N.avwsys_currLang);
    }
    if (!lang) {
        lang = I18N.getNavigatorLanguage();
    }
    return lang;
};
