/**
 *	Функционал для последовательное выполнение AJAX запросов
 *
 *	Зависимости: jquery
 *	Автор: Артем Иванов
 *	Пример:
 *	<script>
 *		Query.init();
 *		Query.add( string url, object params, function callback[, loadertoshow] );
 *	</script>
 */
var Query = function () {
	var running = false;
	var queries = [];

	/**
	 * Загрузить URL
	 * @param url
	 * @param params
	 * @param callback
	 * @param loader
	 */
	function run(url, params, callback, loader) {
		running = true;
		loader = typeof loader === 'string' ? jQuery(loader) : loader;

		if (loader) {
			loader.show('fast');
		}

		jQuery.ajax({
			url:  url,
			type: "POST",
			data: params,
			error: function () {
				running = false;

				if (loader) {
					loader.hide('fast');
				}

				next();
			},
			success: function (response) {
				callback(response);

				running = false;

				if (loader) {
					loader.hide('fast');
				}

				next();
			}
		});
	}

	function add_query(args) {
		queries.push(args);
	}

	function next() {
		var query = queries.shift();

		if (query) {
			run.apply(null, query);
		}
	}

	return {
		init: function() {
		},
		/**
		 * Добавить URL на загрузку
		 * Если что то загружается он будет поставлен в очередь
		 * @param url
		 */
		add: function(url) {
			var params, callback, loader;

			if (typeof arguments[1] === 'function') {
				params   = {};
				callback = arguments[1];
				loader   = arguments[2] || false;
			}
			else {
				params   = arguments[1] || {};
				callback = arguments[2] || function () {};
				loader   = arguments[3] || false;
			}

			// Если что то ещё загружаем, добавим в очередь
			if (running === true) {
				add_query([url, params, callback, loader]);
			} else {
				run(url, params, callback, loader);
			}
		}
	};
}();
