	
	var cmsAjax_count = 0;
	
	cmsPreload(["/ui/loading_ajax.gif"]);

	// -- INIT --------------------------------------------------------------------------------------------------------------------------------------------------------//
	
	var loading = "<div><img src='/ui/loading_ajax.gif' class='iconLoading'>Загрузка, ждите...</div>";
	var loadingAjax = "<img src='/ui/loading_ajax.gif' class='iconLoading'>";
	var loadingBG = "<div class='menuStrX'><img src='/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='/ui/loading_upload.gif'></div>");
	
	// -- FUNCTIONS ---------------------------------------------------------------------------------------------------------------------------------------------------//
	
	cmsAjax = function(url, params, callback, debug) {
		
		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[" + cmsAjax_count + "]</b>: Не удалось интерпретировать ответ от скрипта <u>" + url + "</u> (Ошибка JS: " + e + "):</div>" + 
						"<div>" + data.replace(/<.*?>/ig, "") + "</div>"
					);
					
				}
				
				if (data.js) {
					
					var date2 = new Date();
					
					cmsConsole_warning("<b>cmsAJAX[" + cmsAjax_count + "]</b>: Запрос к <u>" + url + "</u> успешно выполнен (<b>" + (date2.getTime() - date1.getTime()) + " мс</b>)");
					
					if (data.text) cmsConsole_notice(
						"<div><b>cmsAJAX[" + cmsAjax_count + "]</b>: Ответ скрипта: <a href='#' onclick='$(\"#cmsAjax_report_" + cmsAjax_count + "\").toggle()'>Показать/скрыть</a></div>" + 
						"<div id='cmsAjax_report_" + cmsAjax_count + "' style='display: none'>" + data.text.replace(/<.*?>/ig, "") + "</div>"
					);
					
					if (callback) callback(data.js);
					
				}
				
			},
			error: function(data, textStatus, errorThrown) {
				
				cmsConsole_error(
					"<div><b>cmsAJAX[" + cmsAjax_count + "]</b>: Критическая ошибка в Backend <u>" + url + "</u>:</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();
			
		}
		
	}
	
	// ----------------------------------------------------------------------------------------------------------------------------------------------------------------//
