Ext.namespace('Voyeur.Localization');

/**
 * @class Voyeur.Localization
 */
Voyeur.Localization = function(lang) {	
	this.lang = lang ? lang : 'en';
	this.bundle = new Ext.util.MixedCollection();
	this.langCodesStore = new Ext.data.JsonStore({
		root: 'languages',
		fields: ['lang', 'code'],
		idProperty: 'code',
		data: {languages: [
		    {lang: 'Afrikaans', code: 'af'},
			{lang: 'Albanian', code: 'sq'},
			{lang: 'Arabic', code: 'ar'},
			{lang: 'Belarusian', code: 'be'},
			{lang: 'Bulgarian', code: 'bg'},
			{lang: 'Catalan', code: 'ca'},
			{lang: 'Chinese Simplified', code: 'zh-CN'},
			{lang: 'Chinese Traditional', code: 'zh-TW'},
			{lang: 'Croatian', code: 'hr'},
			{lang: 'Czech', code: 'cs'},
			{lang: 'Danish', code: 'da'},
			{lang: 'Dutch', code: 'nl'},
			{lang: 'English', code: 'en'},
			{lang: 'Estonian', code: 'et'},
			{lang: 'Filipino', code: 'tl'},
			{lang: 'Finnish', code: 'fi'},
			{lang: 'French', code: 'fr'},
			{lang: 'Galician', code: 'gl'},
			{lang: 'German', code: 'de'},
			{lang: 'Greek', code: 'el'},
			{lang: 'Haitian Creole', code: 'ht'},
			{lang: 'Hebrew', code: 'iw'},
			{lang: 'Hindi', code: 'hi'},
			{lang: 'Hungarian', code: 'hu'},
			{lang: 'Icelandic', code: 'is'},
			{lang: 'Indonesian', code: 'id'},
			{lang: 'Irish', code: 'ga'},
			{lang: 'Italian', code: 'it'},
			{lang: 'Japanese', code: 'ja'},
			{lang: 'Latvian', code: 'lv'},
			{lang: 'Lithuanian', code: 'lt'},
			{lang: 'Macedonian', code: 'mk'},
			{lang: 'Malay', code: 'ms'},
			{lang: 'Maltese', code: 'mt'},
			{lang: 'Norwegian', code: 'no'},
			{lang: 'Persian', code: 'fa'},
			{lang: 'Polish', code: 'pl'},
			{lang: 'Portuguese', code: 'pt'},
			{lang: 'Romanian', code: 'ro'},
			{lang: 'Russian', code: 'ru'},
			{lang: 'Serbian', code: 'sr'},
			{lang: 'Slovak', code: 'sk'},
			{lang: 'Slovenian', code: 'sl'},
			{lang: 'Spanish', code: 'es'},
			{lang: 'Swahili', code: 'sw'},
			{lang: 'Swedish', code: 'sv'},
			{lang: 'Thai', code: 'th'},
			{lang: 'Turkish', code: 'tr'},
			{lang: 'Ukrainian', code: 'uk'},
			{lang: 'Vietnamese', code: 'vi'},
			{lang: 'Welsh', code: 'cy'},
			{lang: 'Yiddish', code: 'yi'}
		]}
	});
}

Voyeur.Localization.prototype = {
	
	/**
	 * Load the values from the passed object into the resource bundle.
	 * @param {Object} json
	 */
	load : function(json) {
		this.bundle.addAll(json);
	},
	
	/**
	 * Retrieve the localized object from the specified key and language (if no
	 * lang parameter is specified, the default one for this instance is used).
	 * @param {String} key the key
	 * @param {String} lang (optional) override the default language
	 */
	get : function(key,lang) {
		lang = lang ? lang : this.lang;
		var vals = this.bundle.get(key);
		if (!vals) {return key;} // key value doesn't exist, return key
		if (vals.lang) {return vals.lang;} // key value returns for lang, return it
		if (vals.en) {return vals.en;} // key value returns for English, return it
		for (var k in vals) {return vals[k]} // return the first value that exists
	}
	
	/**
	 * Get the current two-letter language code.
	 */
	,getLang: function() {
		return this.lang;
	}
	
	/**
	 * Get the language name for a code.
	 * @params {String} code The lang code. If unspecified, the current lang code is used.
	 */
	,getLangName: function(code) {
		code = code || this.lang;
		var name = '';
		var entry = this.langCodesStore.getById(code);
		if (entry) name = entry.get('lang');
		return name;
	}
}

Voyeur.localization = new Voyeur.Localization();

