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

/**
 * 定数：言語ファイル配置場所
 */
var avwsys_location = "/common/json/lang";
var avwsys_dir = "/abvw";
var avwsys_storagekey = "AVWUS_Lang";
var avwsys_currLang = "AVW_CurrLang";

/* 言語の初期化 */
$(function() {
	// ログイン画面/直接アクセス対策
	var location = window.location.toString().toLowerCase();
	if (location.indexOf(avwsys_dir) < 0) {
		// avwsys_dirディレクトリ配下ではない場合は、avwsys_dirディレクトリをつける
		avwsys_location = "." + avwsys_dir + avwsys_location;
	} else {
		// avwsys_dirディレクトリ配下の場合は、相対パスに変換
		avwsys_location = "." + avwsys_location;
	}

	var lang = "en";
	var storage = window.localStorage;
	if(storage) {
		var lang = storage.getItem(avwsys_storagekey);
		if(!lang) {
			lang = getNavigatorLanguage();
		}
	}
	// 言語ファイルを初期化する
	loadLanguage(lang);
});
/* ブラウザの言語設定を取得する */
function getNavigatorLanguage() {
	var lang = (navigator.browserLanguage || navigator.language || navigator.userLanguage);			
	/* 対応言語 */
	var languages = ['ja','ko','en','th','in'];		// 対応言語を増やす場合はここを変更する
	if(lang.match(/ja|ko|en|th|in/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;
};

/* 言語リソースファイル読み込み */
function loadLanguage(lang) {
	
	// 引数から言語ファイルを選択
	var langfile = "lang-" + lang + ".json";
	
	// 言語ファイルを読み込む
	$.ajax({
			url: avwsys_location + "/" + langfile,
			async: false,
			dataType: 'json',
			cache: false,
			success: function(data) {
				// lang属性の書換え
				document.documentElement.lang = lang;
				
				// html の言語データを書換える
				var jsonLangData = data;
				replaceText(jsonLangData);
				
				// 20130508 change language selector
				var languageSelector = $('#changeLanguage');
				if ( languageSelector ) {
					languageSelector.val('language-' + lang);
				}

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

/* ページ内のテキストをすべて言語に合わせて置換する */
function replaceText(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 = 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テキストを置き換える */
function i18nReplaceText() {
	var storage = window.sessionStorage;
	if(storage) {
		var value = storage.getItem(avwsys_storagekey);
		if(value) {
			var json = JSON.parse(value);
			replaceText(json);
		}
	}
};
/* キーから文字列を取得 */
function i18nText(key) {
	var storage = window.sessionStorage;
	if(storage) {
		var value = storage.getItem(avwsys_storagekey);
		if(value) {
			var json = JSON.parse(value);
			return getLangText(json, key);
		}
	}
	return "undefined";
};

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

/* 言語データの切り替え */
function changeLanguage(lang) {
	
	// 言語の切替を行った場合のみ選択言語をストアする
	var storage = window.localStorage;
	if(storage) {
		storage.setItem(avwsys_storagekey, lang);
	}
	
	// 言語ファイルを読み込み、テキスト文字列を変換する
	loadLanguage(lang);
};

/* 設定言語の保存 */
function storeCurrentLanguage(lang, langData) {
	var ss = window.sessionStorage;
	if(ss) {
		// language data
		ss.setItem(avwsys_storagekey, JSON.stringify(langData));
		// current language
		ss.setItem(avwsys_currLang, lang);
	}
};
/* 設定言語の取得 */
function getCurrentLanguage() {
	var lang;
	var storage = window.sessionStorage;
	if(storage) {
		lang = storage.getItem(avwsys_currLang);
	}
	if(!lang) {
		lang = getNavigatorLanguage();
	}
	return lang;
};
