	
	var cmsAjax_count = 0;
	
	cmsPreload(["/admin/ui/loading_ajax.gif"]);

	// -- INIT --------------------------------------------------------------------------------------------------------------------------------------------------------//
	
	var loading = "<div><img src='/admin/ui/loading_ajax.gif' class='iconLoading'>Загрузка, ждите...</div>";
	var loadingAjax = "<img src='/admin/ui/loading_ajax.gif' class='iconLoading'>";
	var loadingBG = "<div class='menuStrX'><img src='/admin/ui/loading_ajax.gif' class='iconLoading'><span class='menuStrSpn'>Загрузка, ждите...</span></div>";
	
	document.write("<div id='ajaxloader' style='display: none'></div>");
	document.write("<div id='cmsAjax_loader' style='display: none'><img src='/admin/ui/loading_upload.gif'></div>");
	
	// -- FUNCTIONS ---------------------------------------------------------------------------------------------------------------------------------------------------//
	
	cmsAjax = function(url, params, callback, debug) {
		
		cmsAjax_count++;
		
		var count = cmsAjax_count; // переназываем, т.к. в процессе значение может поменяться…
		
		cmsAjax_show();
		var date1 = new Date();
		
		params = {"json" : JSON.stringify(params)}
		
		$.ajax({
			type: "post",
			url: url,
			async: true,
			cache: false,
			data: params,
			success: function(data) {
				
				try {
					
					eval("data = " + data); 
					
				} catch(e) { 
					
					cmsConsole_error(
						"<div><b>cmsAJAX[" + count + "]</b>: Не удалось интерпретировать ответ от скрипта <b>" + url + "</b> (Ошибка JS: " + e + "): <a href='#' onclick='$(\"#cmsAjax_report_" + count + "_error\").toggle()'>Показать/скрыть</a></div>" + 
						//"<div>" + data.replace(/<.*?>/ig, "").replace(/\n/, "<br>") + "</div>"
						"<div id='cmsAjax_report_" + count + "_error' style='display: none'>" + data + "</div>"
					);
					
				}
				
				if (data.js) {
					
					var date2 = new Date();
					
					cmsConsole_warning("<b>cmsAJAX[" + count + "]</b>: Запрос к <b>" + url + "</b> успешно выполнен (<b>" + (date2.getTime() - date1.getTime()) + " мс</b>)");
					
					if (data.text) cmsConsole_notice(
						"<div><b>cmsAJAX[" + count + "]</b>: Ответ скрипта: <a href='#' onclick='$(\"#cmsAjax_report_" + count + "\").toggle()'>Показать/скрыть</a></div>" + 
						"<div id='cmsAjax_report_" + count + "' style='display: none'>" + data.text + "</div>" //.replace(/<.*?>/ig, "")
					);
					
					if (callback) callback(data.js);
					
				}
				
			},
			error: function(data, textStatus, errorThrown) {
				
				cmsConsole_error(
					"<div><b>cmsAJAX[" + count + "]</b>: Критическая ошибка в Backend <b>" + url + "</b>:</div>" + 
					"<div>" + data.responseText + "</div>"
				); //.replace(/<.*?>/ig, ""));
				
			},
			complete: function() {
				
				cmsAjax_hide();
				
			}
		});
		
		return this;
		
	}
	
	// ----------------------------------------------------------------------------------------------------------------------------------------------------------------//
	
	function cmsEvent(x, y) { return {"clientX" : x, "clientY" : y}; }
	
	// ----------------------------------------------------------------------------------------------------------------------------------------------------------------//
	
	function cmsAjax_show() { $("#cmsAjax_loader").show(); }
	function cmsAjax_hide() { $("#cmsAjax_loader").hide(); }
	
	function cmsAjax_loading(loaded, e) {
		
		var obj = $('#cmsAjax_hover');
		
		if (loaded) {
			
			obj.hide()
			
		} else {
			
			x = e.clientX - 7 + document.body.scrollLeft;
			y = e.clientY - 7 + document.body.scrollTop;
			
			obj.css("left", x).css("top", y).show();
			
		}
		
	}
	
	// ----------------------------------------------------------------------------------------------------------------------------------------------------------------//
