He.Bootstrap('He.Framework.Lang');
He.Bootstrap('He.Framework.Lang.lookUp');

He.Framework.Lang.gather = true;
He.Framework.Lang.lang = He.Application.Common.UserLang || 'en';
He.IncludeJavascript('/He/Application/Lang/' + He.Framework.Lang.lang + '/i18n.js');

He.Framework.Lang.SubstArgs = function(_str, _params)
{
	var p = 0;
	var n = _params.lenght; 	
	
	for (var i; i < n; ++i)
	{
		var param = _params[i];
		var index = '%' + ++p; 
		
		_str = _str.replace(Regexp('/' + index + '/g'), param);
	}
	
	return _str;
}	

He.Framework.Lang.DeleteKey = function(_key)
{
	delete He.Framework.Lang.lookUp[_key];
}

He.Framework.Lang.UpdateKey = function(_key, _newValue)
{
	He.Framework.Lang.lookUp[_key] = _newValue;
}

He.Framework.Lang.FeedDB = function(_key, _str, _lang)
{
	if (He.IsNumber(_str))
	{
		return;
	}
	
	He.Framework.Lang.UpdateKey(_key, _str);
	He.Framework.Ajax.Request('/qsb.php',{cmd:'FeedLangDB',key: _key, str : _str, lang: _lang});
}

He.Framework.Lang.Localize = function(_str)
{
	var params = Array.prototype.slice.call(arguments);
	params.shift();

	if (!_str || He.IsNumber(_str))
	{
		return _str;
	}
	
	var key = _str.toUpperCase();
	
	if (!He.IsUndefined(He.Framework.Lang.lookUp[key]))
	{
		_str = He.Framework.Lang.lookUp[key];
	}
	else if (He.Framework.Lang.gather)
	{
		He.Framework.Lang.FeedDB.defer(key, _str, He.Framework.Lang.lang);
	}

	if(_str == '##EMPTY##')
	{
		return '';
	}
	
	if (params.length)
	{
		_str = He.Framework.Lang.SubstArgs(_str, params);
	}
	
	return _str;
}

He.Framework.Lang.Localize_P = function(_str, _plural, _count)
{
	_count = _count ? _count : 1;
	_plural = _plural ? _plural : '';
		
	var params = Array.prototype.slice.call(arguments);
	params.shift();
	params.shift();
	params.shift();
	
	if (_count == 1)
	{
		params.unshift(_str);
	}
	else
	{
		params.unshift(_plural);
	}
	
	_str = He_Framework_Lang.Localize.apply(this, _params);
	
	return _str.replace(/%d/g, _count);
}


function _T(_str)
{
	var args = Array.prototype.slice.call(arguments);
	return He.Framework.Lang.Localize.apply(this, args);
}

function _Ts(_str, _plural, _count)
{
	var args = Array.prototype.slice.call(arguments);
	return He.Framework.Lang.Localize_P.apply(this, args);
}