/**
 *  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 = "/abvw";
	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);
					}
				} 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;
};