var Sender = (function () {
	var module = {};

	/**
	 * Выполнить POST запрос
	 * @param {Function} callback Функция обработчик результата запроса
	 * @param {String} uri Ресурс запроса
	 * @param {Object} params Параметры, передаваемые на сервер
	 * @param {Object} callbackParams Параметры, которые необходимо передать в функцию callback
	 * @param {Boolean} isAsinc Использовать ли асинхронный запрос (по умолчанию true)
	 */
	module.Go = function (callback, uri, params, callbackParams, isAsinc = true) {
		if (uri == null || typeof uri != "string") {
			console.warn("URI не был передан");
			return;
		}

		if (params == null || typeof params != "object") {
			params = {};
		}

		var xhr = new XMLHttpRequest();

		// * Обработка результата запроса
		xhr.onload = function (event) {
			var data;

			try {
				data = JSON.parse(this.response);
			} catch (error) {
				Notify.Show(error);
				data = null;
			} finally {
				if (typeof callback == "function") {
					var nerror = data || data.Error || data.Error === null || data.Error === "null";

					if (nerror) {
						callback(data, callbackParams);
					} else {
						Notify.Show("Произошла ошибка в процессе выполнения запроса");
					}
				}
			}
		};

		xhr.onabort = function (event) {
			Notify.Show("Выполнение запроса было прервано...");
		};

		xhr.onerror = function (event) {
			Notify.Show("Выполнение запроса завершилось неудачей. Перезагрузите страницу и повторите попытку. Если проблема сохраняется, пожалуйста, сообщите об этом администратору admin@ktk-45.ru");
		};

		xhr.ontimeout = function (event) {
			Notify.Show("Время ожидания запроса истекло... Проверьте соединение с интернетом");
		};

		xhr.open("POST", uri, isAsinc);

		xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
		xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

		xhr.send(JSON.stringify(params));
	};

	return module;
})();