/*
DESCRIPTION	"Ядро для остальных модулей. Содержит небольшой набор общих функций"
AUTHOR		"Berserker"
*/

// [DESC] Убеждается, что условие истинно, иначе вызывает исключение TypeError.
function Assert (Cond)
{
	if (!Cond) (null).Assert();
} // .function Assert

// [DESC] Возвращает знак числа (-1 или +1)
function Sign (Value)
{
	if (Value < 0) return -1; else return 1;
} // .function Sign

// [DESC] Осуществляет целочисленное деление одного числа на другое
function DIV (Value, By)
{
	return Math.floor(Value / By);
} // .function DIV

// [DESC] Создаёт временную функцию обратного вызова, переходник к функции указанного объекта
function Call (Obj, Method)
{
	var	Func = function ()
		{
			var	Me = arguments.callee,
				Obj = Me.Obj,
				Method = Me.Method;
			Method.apply(Obj, arguments);
		};
	Func.Obj = Obj;
	Func.Method = Method;
	return Func;
} // .function Call

Core = {}

/*
[DESC] Возвращает число, вписанное в указанный диапазон
[ARG Value] Исходное число
[Arg Min, Max] Границы диапазона
*/
Core.ToRange = function (Value, Min, Max)
{
	return Math.max(Min, Math.min(Value, Max));
} // .function Core.ToRange

// [DESC] Проверяет, находится ли значение в указанном диапазоне
Core.InRange = function (Value, Min, Max)
{
	return ((Value >= Min) && (Value <= Max));
} // .function Core.InRange

// [DESC] Возвращает первый аргумент, если он отличался от undefined, иначе второй
Core.GetValue = function (OrigValue, DefValue)
{
	if (OrigValue === undefined)
	{
		return DefValue;
	}
	else
	{
		return OrigValue;
	}
} // .function Core.GetValue

// [DESC] Генерирует случайное числов  указанном диапазоне
Core.Random = function (From, To)
{
	From = Number(From);
	To = Number(To);
	return Math.floor(Math.random() * (To - From + 1) + From);
} // .function Core.Random

// [DESC] Выполняет указанную функцию после окончания работы текущего кода и обновления экрана
Core.ExecAfterRedraw = function (Func)
{
	setTimeout(Func, 0);
} // .function Core.ExecAfterRedraw

// [DESC] Заменяет в строке формальные параметры на фактические
Core.MakeStr = function (Template, TemplChar, Args)
{
	var	NumArgs = Args.length,
		result = Template.split(TemplChar),
		i = -1;
	Assert(NumArgs === (result.length - 1));
	for (i = 0; i < NumArgs; i++)
	{
		result[i] = result[i] + String(Args[i]);
	}
	return result.join('');
} // .function Core.MakeStr
