/**
 * Зацикленный вызов функций по очереди
 */
var TimeQueue = function () {
	// TODO: переделать под prototype
	// TODO: overall_time, params
	var _started,
		_function_array,
		_interval_time,
		_overall_time,
		_params,
		_finish_flag = false,
		_iteration,
		_interval;

	return {
		/**
		 * Начинает циклический вызов функций. Если параметры неопределены, то они берутся из предыдущего запуска
		 *
		 * @param function_array - очередь функций
		 * @param interval_time - интервал между вызовами
		 * @param overall_time - общее время итерации
		 * @param params - параметры для вызова функций
		 */
		start : function (function_array, interval_time, overall_time, params) {
			// console.log('queue start', function_array, interval_time, overall_time, params);
			_finish_flag = false;
			if (_started) {
				return;
			}
			_started = true;

			// Переопределяем параметры, если надо
			_function_array = (function_array != undefined) ? function_array : _function_array;
			_interval_time  = (interval_time  != undefined) ? interval_time  : _interval_time;
			_overall_time   = (overall_time   != undefined) ? overall_time   : _overall_time;
			_params         = (params         != undefined) ? params         : _params;

			_iteration = -1;

			var self = this;
			_interval = setInterval(
				function () {
					//var param = (params !== undefined && j in params) ? params[j] : undefined;
					if (++_iteration < _function_array.length) {
						_function_array[_iteration]();
					} else {
						_iteration = -1;
						if (_finish_flag) {
							self.stop();
						}
					}

				},
				_interval_time
			);
		},

		/**
		 * Останавливает вызовы после после последнего в очереди
		 */
		finish : function () {
			_finish_flag = true;
		},

		/**
		 * Немедленно останавливает очередь
		 */
		stop : function (magic) {
			// console.log('queue stop');
			if (!_started) {
				return;
			}
			_started = false;

			// хакахакахк
			if (magic && !(_iteration % 2)) {
				_function_array[_iteration + magic]();
			}

			clearInterval(_interval);
		}
	};
};

