/**
* HostCMS
*
* @author Hostmake LLC, http://www.hostcms.ru/
* @version 5.x
*/

if (typeof HostcmsEscape == 'undefined')
{
	// Сохраняем стандартную функцию escape()
	//var escapeOrig = window.escape;

	// Переопределяем функцию escape()
	//window.escape = function(str)
	function HostcmsEscape(str)
	{
		// Инициализируем таблицу перевода
		var trans = [];

		for (var i = 0x410; i <= 0x44F; i++)
		{
			trans[i] = i - 0x350; // А-Яа-я
		}

		trans[0x401] = 0xA8; // Ё
		trans[0x451] = 0xB8; // ё
		
		var ret = [];
		// Составляем массив кодов символов, попутно переводим кириллицу
		for (var i = 0; i < str.length; i++)
		{
			var n = str.charCodeAt(i);

			if (typeof trans[n] != 'undefined')
			{
				n = trans[n];
			}
			if (n <= 0xFF)
			{
				ret.push(n);
			}
		}

		var res = escape(String.fromCharCode.apply(null, ret)).replace('+','%2B').replace(':','%3A').replace('/','%2F').replace('?','%3F').replace('=','%3D').replace('&','%26').replace('@','%40').replace('#','%23').replace('$','%24').replace(';','%3B');

		return res;
	}
}

function function_exists(function_name)
{
	if (typeof function_name == 'string')
	{
		return (typeof window[function_name] == 'function');
	}
	else
	{
		return (function_name instanceof Function);
	}
}

// Событие - нажатие клавиши.
document.onkeydown = DoKeyDown;

// Пользовательский обработчик события нажатия клавиш,
// для обработки Ctrl + стрелка.
function DoKeyDown(event)
{
	if (!document.getElementById)
	{
		return;
	}

	if (window.event)
	{
		event = window.event;
	}

	if (event.ctrlKey)
	{
		var Element = null;

		switch (event.keyCode ? event.keyCode : event.which ? event.which : null)
		{
			case 0x25: // Назад
			Element = document.getElementById ('id_prev');
			break;

			case 0x27: // Вперед
			Element = document.getElementById ('id_next');
			break;
		}

		if (Element && Element.href)
		{
			// Редирект на нужную страницу.
			document.location = Element.href;
		}
	}
}

// Пользовательский обработчик события нажатия клавиш,
// для обработки нажатия Enter у фильтра.
function DoKeyDownFilter(event)
{
	if (!document.getElementById)
	{
		return;
	}

	el = document.getElementById('admin_forms_apply_button');

	switch (event.keyCode ? event.keyCode : event.which ? event.which : null)
	{
		case 13: // Ввод
		el.click();
		break;
	}
}

// Функция устанавливает checkbox редактирования у указанного элемента.
function DoModification(ACheckboxId)
{
	cbItem = document.getElementById(ACheckboxId);
	if (!cbItem)
	{
		return false;
	}

	cbItem.checked = true;
	return true;
}

// Установка или снятие всех флажков для checkbox'ов элементов.
function SelectAllItems(ASelect)
{
	element_array = document.getElementsByTagName("input");
	if (element_array.length > 0)
	{
		for (var i = 0; i < element_array.length; i++)
		{
			if (element_array[i].name.search("check_") != -1 &&
			element_array[i].name.search("_fv_") == -1)
			//element_array[i].name.search("field_value") == -1)
			{
				var reg = /check_(\d+)_(\S+)/;
				var arr = reg.exec(element_array[i].name);

				// arr[1] - ID источника
				// arr[2] - ID элемента

				// Устанавливаем checked
				element_array[i].checked = ASelect;

				// Подсвечиваем строчку
				RowHighlight('row_' + arr[1] + '_' + arr[2]);
			}
		}
	}
}

// Функция проверяет, установлены ли все checkbox'ы, если уcтановлены - устанавливает и главный,
// если не установлены, снимает флажок с главного.
function SetTopCheckbox()
{
	var bChecked = true;
	element_array = document.getElementsByTagName("input");
	if (element_array.length > 0)
	{
		for (var i = 0; i < element_array.length; i++)
		{
			if (element_array[i].name.search("check_") != -1 &&
			element_array[i].name.search("_fv_") == -1)
			//element_array[i].name.search("field_value") == -1)
			{
				if (!element_array[i].checked)
				{
					bChecked = false;
					break;
				}
			}
		}
	}

	document.getElementById('id_admin_forms_all_check').checked	= bChecked;
}

// Функция выделят строку таблицы
// RowId - идентификатор строки
function RowHighlight(RowId)
{
	var oRow = document.getElementById(RowId);

	if (oRow)
	{
		var reg = /row_(\d+)_(\S+)/;
		var arr = reg.exec(RowId);

		// arr[1] - ID источника
		// arr[2] - ID элемента

		// Получим элемент ckeckbox
		var SelectedCheckbox = document.getElementById('id_check_' + arr[1] + '_' + arr[2]);

		// Строку подсвечиваем, только если она ранее не выбрана
		if (SelectedCheckbox != null)
		{
			if (SelectedCheckbox.checked)
			{
				switch (oRow.className)
				{
					case "row_table_odd":
					{
						classname = "Highlight_row_table_odd";
						break;
					}
					case "row_table_over_odd":
					{
						classname = "Highlight_row_table_odd";
						break;
					}
					case "row_table_over":
					{
						classname = "Highlight_row_table";
						break;
					}
					case "row_table":
					{
						classname = "Highlight_row_table";
						break;
					}
					default:
					{
						classname = false;
					}
				}

				if (classname)
				{
					oRow.className = classname;
				}

			}
			else
			{
				switch (oRow.className)
				{
					case "Highlight_row_table_odd":
					{
						classname = "row_table_odd";
						break;
					}
					case "Highlight_row_table":
					{
						classname = "row_table";
						break;
					}
					default:
					{
						classname = false;
					}
				}

				if (classname)
				{
					oRow.className = classname;
				}
			}
		}
	}
}

// Функция выполняет событие, убирает выделение всех checkbox'ов кроме нужного.
// AAction - относительный адрес файла, который будет запрошен
// AAdditionalParams - внешние переметры, передаваемые в строку запроса. Должны начинаться с &
// AOperation - название события
// AItemName - кодовое имя элемента, над которым производится действие
// AAdminFromsId - идентификатор формы
// ALimit - текущая страница
// AOnPage - число элементов на страницу
// AOrderFieldId - ID поля, по которому идет сортировка
// AOrderDirection - направление сортировки, 1 - по возрастанию, 2 - по убыванию
function TrigerSingleAction(AAction, AAdditionalParams, AOperation, AItemName, AAdminFromsId, ALimit, AOnPage, AOrderFieldId, AOrderDirection)
{
	var ElementID = 'id_' + AItemName;

	cbItem = document.getElementById(ElementID);

	if (cbItem)
	{
		// Получаем все input-ы
		element_array = document.getElementsByTagName("input");

		// Если получили хотя бы один
		if (element_array.length > 0)
		{
			// Проходимся по списку
			for (var i = 0; i < element_array.length; i++)
			{
				if (element_array[i].getAttribute('name') == null)
				{
					continue;
				}

				if (element_array[i].getAttribute('name').search("check_") != -1
				&& element_array[i].getAttribute('name').search("_fv_") == -1)
				//&& element_array[i].getAttribute('name').search("field_value") == -1)
				{
					element_array[i].checked = false;
				}
			}
		}
		cbItem.checked = true;
	}
	else
	{
		// Получим ID источника и ID элемента
		var reg = /id_check_(\d+)_(\S+)/;
		var arr = reg.exec(ElementID);

		// arr[1] - ID источника
		// arr[2] - ID элемента

		// Для элемена с ID = 0 создадим чекбокс "на лету"
		//if (arr[2] == 0)
		//{
		// Создадим скрытый див
		var ElementDiv = document.createElement("div");
		ElementDiv.setAttribute("style", "display: none");

		// Добавим скрытый div к div-у с загружаемыми данными
		//var DivNode = document.getElementById('id_form_' + AAdminFromsId).appendChild(ElementDiv);
		var DivNode = document.getElementById('id_content').appendChild(ElementDiv);

		// Создадим чекбокс
		var ElementCheckbox = null;

		// Попытка создать элемент в стиле "$%&*@#" IE 6-7.
		try {
			ElementCheckbox = document.createElement('<input name="'+AItemName+'" type="checkbox" checked="">');
		} catch (e) {
		}

		if (!ElementCheckbox)
		{
			ElementCheckbox = document.createElement("input");
			ElementCheckbox.setAttribute("type", "checkbox");
			ElementCheckbox.setAttribute("name", AItemName);
			ElementCheckbox.setAttribute("checked", true);
			ElementCheckbox.setAttribute("value", "1");  //
		}

		// Добавим чекбокс к скрытому div-у
		var ElementNode = DivNode.appendChild(ElementCheckbox);
		//}
	}

	var admin_forms_all_check = document.getElementById('id_admin_forms_all_check');

	// Если элемент выбора всех чекбоксов существует
	if (admin_forms_all_check != undefined)
	{
		admin_forms_all_check.checked = false;
	}

	// Если для действия был указан 0, то устанавливаем в false, чтобы не передавать явно limit в DoLoadAjax()
	if (ALimit == 0)
	{
		ALimit = false;
	}

	DoLoadAjax(AAction, AAdditionalParams, AAdminFromsId, AOperation, ALimit, AOnPage, AOrderFieldId, AOrderDirection);
}

// Вызов групповой операции.
// AAction - относительный адрес файла, который будет запрошен
// AAdditionalParams - внешние переметры, передаваемые в строку запроса. Должны начинаться с &
function CallGroupOperation(AAction, AAdditionalParams, AAdminFromsId, ALimit, AOnPage, AOrderFieldId,
AOrderDirection)
{
	cbGroupOperation = document.getElementById('id_admin_forms_group_operation');
	if (cbGroupOperation)
	{
		sOperation = cbGroupOperation.options[cbGroupOperation.selectedIndex].value;
		if (sOperation != '')
		{
			// Вызываем тригер операции.
			DoLoadAjax(AAction, AAdditionalParams, AAdminFromsId, sOperation, ALimit, AOnPage, AOrderFieldId, AOrderDirection);

			return true;
		}
	}
	return false;
}

//function appendData(data_str, parent_node, mode)
function appendData(data_str, parent_node, mode)
{
	// заводим уникальный идентификатор для меток
	var milisec = new Date;
	milisec = milisec.getTime();

	// Получаем контент между тегами script
	var js_reg = /<script.*?>(.|[\r\n])*?<\/script>/ig;

	var js_str = js_reg.exec(data_str);

	if (js_str != null)
	{
		var js_arr = new Array(js_str.shift());

		while(js_str)
		{
			js_str = js_reg.exec(data_str);
			if (js_str != null) js_arr.push(js_str.shift());
		}

		// В js_content_arr получили полный список скриптов из документа
		var js_content_reg = /<script.*?>((.|[\r\n])*?)<\/script>/ig;

		for (var i = 0; i < js_arr.length; i++ )
		{
			// Получаем содержимое между тегами script
			js_content_reg.lastIndex = 0;
			var js_content = js_content_reg.exec(js_arr[i]);

			var script = document.createElement("script");
			//script.setAttribute("src", url);
			script.setAttribute("type", "text/javascript");

			head = document.getElementsByTagName("head")[0];
			var script_node = head.appendChild(script);
			script_node.appendChild(document.createTextNode(js_content[1]));
		}
	}

	if (mode == 'rewrite')
	{
		parent_node.innerHTML = data_str;
	}
	else if (mode == 'append')
	{
		parent_node.innerHTML += data_str;
	}

	return data_str;
}

// выполняет скрипты из полученного ответа от сервера
function runScripts(scripts)
{
	if (!scripts)
	{
		return false;
	}

	for (var i = 0; i < scripts.length; i++)
	{
		var thisScript = scripts[i];
		var text;

		if (thisScript.src)
		{
			var newScript = document.createElement("script");
			newScript.type = thisScript.type;
			newScript.language = thisScript.language;

			newScript.src = thisScript.src;
			document.getElementsByTagName('head')[0].appendChild(newScript);

			// Получаем объект, к которому применим ребенка
			//var obj = document.getElementsByTagName('body')[0];
			//var obj = document.getElementById('id_form_' + AAdminFromsId);
			//obj.appendChild(newScript);
		}
		else if (text = (thisScript.text || thisScript.innerHTML))
		{
			var text = (""+text).replace(/^\s*<!\-\-/, '').replace(/\-\->\s*$/, '');

			var newScript = document.createElement("script");
			newScript.setAttribute("type", "text/javascript");
			newScript.text = text;

			var script_node = document.getElementsByTagName('head')[0].appendChild(newScript);

			// Не работает в IE, в нем работает newScript.text = text;
			//script_node.appendChild(document.createTextNode(text));
		}
	}
}

function DisableTinyMCE()
{
	// Работу с визуальным редактором ведём, если пришли данные для form_html
	if (typeof tinyMCE != 'undefined')
	{
		textarea_array = document.getElementsByTagName("textarea");

		for (var i=0; i < textarea_array.length; i++)
		{
			var elementId = textarea_array[i].id;

			if (tinyMCE.getInstanceById(elementId) != null)
			{
				textarea_array[i].disabled = true;
				tinyMCE.execCommand('mceRemoveControl', false, elementId);
			}
		}
	}
}

// Отправка формы методом Get или Post
// AAction - относительный адрес файла, который будет запрошен
// AAdditionalParams - внешние переметры, передаваемые в строку запроса. Должны начинаться с &
// ButtonObject - Объект нажатой кнопки
// AAdminFromsId - идентификатор формы центра администрирования
function doSendForm(AAction, AAdditionalParams, ButtonObject, AAdminFromsId, AOperation, ALimit, AOnPage)
{
	// Объект родительской формы по умолчанию
	var FormNode = ButtonObject.parentNode;

	// Пока родительская форма не является формой
	while (FormNode.nodeName.toLowerCase() != 'form')
	{
		var FormNode = FormNode.parentNode;
	}

	// Получим ID формы (не путать с ID формы центра администрирования)
	FormID = FormNode.id;

	// Пытаемся получить скрытый объект для input-а
	var HiddenInput = document.getElementById(ButtonObject.name);

	// Элемента нет, добавим его
	if (null == HiddenInput && undefined == HiddenInput || HiddenInput.type != 'hidden')
	{
		// Создадим скрытй input, т.к. нажатый не передается в форму
		var ElementInput = document.createElement("input");
		ElementInput.setAttribute("type", "hidden");
		ElementInput.setAttribute("id", ButtonObject.name);
		ElementInput.setAttribute("name", ButtonObject.name);

		// Добавим скрытый Input к форме
		var InputNode = FormNode.appendChild(ElementInput);
	}

	// Сохраним из визуальных редакторов данные
	if (typeof tinyMCE != 'undefined')
	{
		tinyMCE.triggerSave();
	}

	var JsHttpRequestSendForm = new JsHttpRequest();

	// Код вызывается, когда загрузка завершена
	JsHttpRequestSendForm.onreadystatechange = function ()
	{
		if (JsHttpRequestSendForm.readyState == 4)
		{
			// Возвращаем обычный курсор
			document.body.style.cursor = '';

			// Убираем затемнение.
			HideLoadingScreen();

			if (typeof JsHttpRequestSendForm.responseJS != 'undefined')
			{
				// Выводим результат ошибки в переменную.
				if (typeof JsHttpRequestSendForm.responseJS.error != 'undefined')
				{
					var div_id_message = document.getElementById('id_message');

					if (div_id_message)
					{
						// Создадим скрытый SPAN для IE, в который поместим текст + скрипт.
						// Если перед <script> не будет текста, нехороший IE не увидит SCRIPT
						var span = document.createElement("span");
						span.style.display = 'none';
						span.innerHTML = "Stupid IE. " + JsHttpRequestSendForm.responseJS.error;

						runScripts(span.getElementsByTagName('SCRIPT'));

						// Занесем текст сообщения только после выполнения скрипта
						div_id_message.innerHTML = JsHttpRequestSendForm.responseJS.error;
					}
				}

				// Title.
				if (typeof JsHttpRequestSendForm.responseJS.title != 'undefined' && JsHttpRequestSendForm.responseJS.title != '')
				{
					document.title = JsHttpRequestSendForm.responseJS.title;
				}

				// Данные записываем только тогда, если они есть и не пустые.
				if (typeof JsHttpRequestSendForm.responseJS.form_html != 'undefined' && JsHttpRequestSendForm.responseJS.form_html != '')
				{
					// Отключаем связь с редакторами
					DisableTinyMCE();

					html = JsHttpRequestSendForm.responseJS.form_html;

					document.getElementById('id_content').innerHTML = html;

					// Выполняем скрипты из полученного с сервера HTML-а
					runScripts(document.getElementById('id_content').getElementsByTagName('SCRIPT'));
				}
			}
			return true;
		}
	}

	// Определим action у формы
	//var FormAction = FormNode.getAttribute('action');
	// fix bug with IE 6 and getAttribute('') return [object]
	var FormAction = FormNode.attributes['action'].value;

	// Определим метод формы
	var FormMethod = FormNode.getAttribute('method');

	// Добавим обязательно передаваемые данные, конкатенация через ? или &
	/*
	FormAction += (FormAction.indexOf('?') >= 0 ? '&' : '?') + 'hostcmsAAction=' + HostcmsEscape(AAction) +
	'&hostcmsAAdditionalParams=' + HostcmsEscape(AAdditionalParams);
	*/

	if (AOnPage)
	{
		sOnPage = '&admin_forms_on_page=' + AOnPage;
	}
	else
	{
		sOnPage = '';
	}

	// Текущая страница.
	if (ALimit == 0)
	{
		ALimit = '';
	}
	else
	{
		ALimit = '&limit=' + ALimit;
	}

	// передача параметров AAdditionalParams сделана явно, а не через hostcmsAAdditionalParams
	// 20-12-2007
	FormAction += (FormAction.indexOf('?') >= 0 ? '&' : '?') + 'hostcmsAAction=' + HostcmsEscape(AAction) +
	'&hostcmsAAdditionalParams=' + HostcmsEscape(AAdditionalParams) + AAdditionalParams +
	'&operation=' + AOperation + ALimit + sOnPage;

	// Prepare request object (automatically choose GET or POST).
	//req.open(null, FormAction, true);
	JsHttpRequestSendForm.open(FormMethod, FormAction, true);

	// Отправляем запрос в backend.
	JsHttpRequestSendForm.send( { query: FormNode } );

	// Очистим поле для сообщений
	var div_id_message = document.getElementById('id_message');

	if (div_id_message)
	{
		div_id_message.innerHTML = '';
	}

	// Курсор ставим на часики.
	document.body.style.cursor = "wait";

	// Отображаем экран загрузки
	ShowLoadingScreen();

	return false;
}

// action - адрес страницы для запрос
// method - GET, POST, null - автоматическое определение
// callback_function - функция обратного вызова, которая будет вызвана после получения ответа от backenad-а
function sendRequest(action, method, callback_function)
{
	var req = new JsHttpRequest();
	
	// Отображаем экран загрузки
	ShowLoadingScreen();

	// Этот код вызовется автоматически, когда загрузка данных завершится.
	req.onreadystatechange = function()
	{
		if (req.readyState == 4)
		{
			// Возвращаем обычный курсор
			document.body.style.cursor = '';

			// Убираем затемнение.
			HideLoadingScreen();

			if (typeof callback_function != 'undefined')
			{
				callback_function(req.responseJS);
			}

			return true;
		}
	}

	req.open(method, action, true);

	// Отсылаем данные в обработчик.
	req.send(null);

	// Курсор ставим на часики.
	document.body.style.cursor = "wait";
}

// Загрузка формы
// AAction - относительный адрес файла, который будет запрошен
// AAdditionalParams - внешние переметры, передаваемые в строку запроса. Должны начинаться с &
// AAdminFromsId - идентификатор формы центра администрирования
// AOperation - имя события
// ALimit - текущая страница, false - не отправлять страницу
// AOnPage - число элементов на страницу
// AOrderFieldId - ID поля, по которому идет сортировка
// AOrderDirection - направление сортировки, 1 - по возрастанию, 2 - по убыванию
function DoLoadAjax(AAction, AAdditionalParams, AAdminFromsId, AOperation, ALimit, AOnPage, AOrderFieldId, AOrderDirection)
{
	if (AOperation == '')
	{
		return false;
	}

	// Если поле сортировки было указано - передадим поле и направление сортировки
	if (AOrderFieldId != 0)
	{
		sOrder = '&order_field_id=' + AOrderFieldId +
		'&order_field_direction=' + AOrderDirection;
	}
	else
	{
		sOrder = '';
	}

	// Чисто элеменов на страницу.
	cbOnPage = document.getElementById('id_on_page');

	if (AOnPage)
	{
		sOnPage = '&admin_forms_on_page=' + AOnPage;
	}
	else
	{
		if (cbOnPage)
		{
			sOnPage = '&admin_forms_on_page=' + cbOnPage.options[cbOnPage.selectedIndex].value;
		}
		else
		{
			sOnPage = '';
		}
	}

	// Строка запроса с выбранными элементами и их значениями.
	sElements = '';
	sFilter = '';

	// Для определния принадлежности поля фильтру
	reg_filter = /admin_form_filter_.+/;

	element_array = document.getElementsByTagName("input");
	if (element_array.length > 0)
	{
		for (var i = 0; i < element_array.length; i++)
		{

			element_name = element_array[i].getAttribute('name');

			if (element_name == undefined)
			{
				continue;
			}

			// Определяем выбрана ли запись для редактирования.
			if (element_name.search("check_") != -1 &&
			element_name.search("_fv_") == -1)
			//element_name.search("field_value") == -1)
			{
				if (element_array[i].checked)
				{
					sElements = sElements + '&' + element_name + '=1';

					// Ищем значения записей.
					value_element_array = document.getElementsByTagName("input");
					if (value_element_array.length > 0)
					{
						for (var j = 0; j < value_element_array.length; j++)
						{
							value_element_name = value_element_array[j].name;

							if (typeof value_element_name == 'undefined')
							{
								continue;
							}

							// Проверяем, содержит ли в себе имя чекбокса для записи.
							//if (value_element_name.search("field_value") != -1 &&
							if (value_element_name.search("_fv_") != -1 &&
							value_element_name.search(element_name) != -1)
							{
								if (value_element_array[j].getAttribute('type') == 'text')
								{
									sElements = sElements + '&' + value_element_name +
									'=' + value_element_array[j].value;
								}
								else if (value_element_array[j].getAttribute('type') == 'checkbox')
								{

									if (value_element_array[j].checked)
									{

										sElements = sElements + '&' + value_element_name + '=1';
									}
									else
									{

										sElements = sElements + '&' + value_element_name + '=0';
									}
								}
							}
						}
					}

					// Ищем значения записей для select-ов
					value_element_array = document.getElementsByTagName("select");
					if (value_element_array.length > 0)
					{
						for (var j = 0; j < value_element_array.length; j++)
						{
							value_element_name = value_element_array[j].name;

							if (typeof value_element_name == 'undefined')
							{
								continue;
							}

							// Проверяем, содержит ли в себе имя чекбокса для записи.
							//if (value_element_name.search("field_value") != -1 &&
							if (value_element_name.search("_fv_") != -1 &&
							value_element_name.search(element_name) != -1)
							{
								sElements = sElements + '&' + value_element_name +
								'=' + HostcmsEscape(value_element_array[j].options[value_element_array[j].selectedIndex].value);
							}
						}
					}
				}
			}

			// Может быть это элемент фильтра?
			if (reg_filter.test(element_name))
			{
				// Дописываем к передаваемым данным, только если значение фильтра до 255 символов
				if (element_array[i].value.length < 256)
				{
					sFilter = sFilter + '&' + element_name + '=' + HostcmsEscape(element_array[i].value);
				}
			}
		}
	}

	// Select-ы из фильтра
	element_array = document.getElementsByTagName("select");
	if (element_array.length > 0)
	{
		for (var i = 0; i < element_array.length; i++)
		{
			element_name = element_array[i].getAttribute('name');

			// Может быть это элемент фильтра?
			if (reg_filter.test(element_name))
			{
				// Дописываем к передаваемым данным
				sFilter = sFilter + '&' + element_name + '=' + HostcmsEscape(element_array[i].value);
			}
		}
	}

	// Данные которые всегда нужно передавать в запрос.
	sParams = AAdditionalParams;

	// Текущая страница.
	//ALimit = '&limit=' + ALimit;

	//if (ALimit == 0)
	if (ALimit === false)
	{
		ALimit = '';
	}
	else
	{
		ALimit = '&limit=' + ALimit;
	}

	cmsrequest = AAction + '?admin_forms_id=' + AAdminFromsId +
	'&hostcmsAAction=' + HostcmsEscape(AAction) +
	'&hostcmsAAdditionalParams=' + HostcmsEscape(AAdditionalParams) +
	'&operation=' + AOperation + ALimit + sOnPage + sFilter +
	sElements + sOrder + sParams;

	if (cmsrequest.length < 2000)
	{
		method = 'get';
	}
	else
	{
		method = 'post';
	}

	// Отправляем запрос backend-у
	sendRequest(cmsrequest, method, callbackfunction_DoLoadAjax);
}

// Функция обратного вызова для DoLoadAjax
function callbackfunction_DoLoadAjax(responseJS)
{
	// Результат принят
	sended_request = false;

	//if (typeof responseJS != 'undefined')
	if (responseJS != null)
	{
		if (typeof responseJS.error != 'undefined')
		{
			var div_id_message = document.getElementById('id_message');

			if (div_id_message)
			{
				div_id_message.innerHTML = responseJS.error;
			}
		}

		// Данные.
		if (typeof responseJS.form_html != 'undefined')
		{
			// Указываем текущий путь
			// Меняем Location только при DoLoadAjax, если вернулись назад - не меняем
			if (cmsrequest != ''
			&& function_exists('getCmsUrl')
			&& getCmsUrl() != cmsrequest)
			{
				setLocation(cmsrequest);
			}

			if (function_exists('saveLocation'))
			{
				// Сохраняем текущий путь всегда
				saveLocation(getCmsUrl());
			}

			// Отключаем связь с редакторами
			DisableTinyMCE();

			html = responseJS.form_html;

			document.getElementById('id_content').innerHTML = html;

			// Выполняем скрипты из полученного с сервера HTML-а
			runScripts(document.getElementById('id_content').getElementsByTagName('SCRIPT'));

			// Сбрасываем cmsrequest
			cmsrequest = '';
		}

		// Title.
		if (typeof responseJS.title != 'undefined' && responseJS.title != '')
		{
			document.title = responseJS.title;
		}

		// Редирект.
		if (typeof responseJS.redirect != 'undefined')
		{
			if (responseJS.redirect != '')
			{
				ShowLoadingScreen();
				location = responseJS.redirect;
			}
		}
	}
}

// Удаляет дочерние элементы элемента с ID, равным node_id
function deleteChildNodes(node_id)
{
	var node = document.getElementById(node_id);

	if (typeof node != 'undefined')
	{
		if (node.hasChildNodes())
		{
			while (node.firstChild)
			{
				node.removeChild(node.firstChild);
			}
		}
	}
}

// Отображение экрана загрузки AJAX.
// Для корректной работы необходимо, чтобы на форме присутствовал
function ShowLoadingScreen()
{
	var fade_div = document.getElementById('id_admin_forms_fade');

	if (fade_div == null)
	{
		// Создаем div
		var fade_div = document.createElement("div");
		var body = document.getElementsByTagName("body")[0];
		body.appendChild(fade_div);

		fade_div.id = "id_admin_forms_fade";

		fade_div.style.zIndex = 999;

		fade_div.className = "shadowed";

		fade_div.style.position = 'absolute';
		fade_div.style.left = '50%';
		fade_div.style.top = '50%';

		var fade_div_img = document.createElement("img");
		fade_div_img.id = 'id_fade_div_img';
		fade_div_img.src = '/hostcmsfiles/images/ajax_loader.gif';
		fade_div_img.align = 'left';
		fade_div.appendChild(fade_div_img);
		
		var text_div = document.createElement("span");
		text_div.id = 'id_text_div';
		text_div.style.padding = '0px 0 0 10px';
		fade_div.appendChild(text_div);

		var shadowed_tl = document .createElement("div");
		shadowed_tl.className = "tl";
		fade_div.appendChild(shadowed_tl);

		var shadowed_t = document.createElement("div");
		shadowed_t.className = "t";
		fade_div.appendChild(shadowed_t);

		var shadowed_tr = document.createElement("div");
		shadowed_tr.className = "tr";
		fade_div.appendChild(shadowed_tr);

		var shadowed_l = document.createElement("div");
		shadowed_l.className = "l";
		fade_div.appendChild(shadowed_l);

		var shadowed_r = document.createElement("div");
		shadowed_r.className = "r";
		fade_div.appendChild(shadowed_r);

		var shadowed_bl = document.createElement("div");
		shadowed_bl.className = "bl";
		fade_div.appendChild(shadowed_bl);

		var shadowed_b = document.createElement("div");
		shadowed_b.className = "b";
		fade_div.appendChild(shadowed_b);

		var shadowed_br = document.createElement("div");
		shadowed_br.className = "br";
		fade_div.appendChild(shadowed_br);

		// получаем ширину выпадающего блока и устанавливаем её для верхней и нижней границы
		groupChildElements = fade_div.children;

		if (groupChildElements != undefined)
		{
			for (i = 0; i < groupChildElements.length; i++)
			{
				if(groupChildElements[i].className == 'b' | groupChildElements[i].className == 't')
				{
					groupChildElements[i].style.width = fade_div.clientWidth + 'px';
				}

				if(groupChildElements[i].className == 'r' | groupChildElements[i].className == 'l')
				{
					groupChildElements[i].style.height = fade_div.clientHeight + 'px';
				}
			}
		}

		fade_div.style.display = 'none';
	}

	// Убираем текст
	
	if (!text_div) var text_div = document.getElementById('id_text_div');
	text_div.style.display = 'none';
	
	// Отображаем div
	fade_div.style.display = 'block';

	var arrayPageSize = getPageSize();

	// 0 - pageWidth, 1 - pageHeight, 2 - windowWidth, 3 - windowHeight
	var arrayPageSize = getPageSize();

	// 0 - scrOfX, 1 - scrOfY
	var arrayScrollXY = getScrollXY();

	// Отображаем до определения размеров div-а
	var clientHeight = fade_div.clientHeight;
	fade_div.style.top = ((arrayPageSize[3] - clientHeight) / 2 + arrayScrollXY[1]) + 'px';

	var clientWidth = fade_div.clientWidth;
	fade_div.style.left = ((arrayPageSize[2] - clientWidth) / 2 + arrayScrollXY[0]) + 'px';
}

// Отображение экрана загрузки AJAX.
// Для корректной работы необходимо, чтобы на форме присутствовал
function ShowLoadingScreen2(text)
{
	var fade_div = document.getElementById('id_admin_forms_fade');

	img1=new Image();
	img1.src="/hostcmsfiles/images/ajax_loader.gif";
	
	img2=new Image();
	img2.src="/hostcmsfiles/images/shadow-b.png";
	
	img3=new Image();
	img3.src="/hostcmsfiles/images/shadow-l.png";
	
	img4=new Image();
	img4.src="/hostcmsfiles/images/shadow-lb.png";
	
	img5=new Image();
	img5.src="/hostcmsfiles/images/shadow-rb.png";
	
	img6=new Image();
	img6.src="/hostcmsfiles/images/shadow-lt.png";
	
	img7=new Image();
	img7.src="/hostcmsfiles/images/shadow-rt.png";
	
	if (fade_div == null)
	{
		// Создаем div
		var fade_div = document.createElement("div");
		var body = document.getElementsByTagName("body")[0];
		body.appendChild(fade_div);

		fade_div.id = "id_admin_forms_fade";

		fade_div.style.zIndex = 999;

		fade_div.className = "shadowed";

		fade_div.style.position = 'absolute';
		fade_div.style.left = '50%';
		fade_div.style.top = '50%';

		var fade_div_img = document.createElement("img");
		fade_div_img.id = 'id_fade_div_img';
		fade_div_img.align = 'left';
		fade_div_img.src = '/hostcmsfiles/images/ajax_loader.gif';
		fade_div.appendChild(fade_div_img);
		
		var text_div = document.createElement("span");
		text_div.id = 'id_text_div';
		text_div.style.padding = '0px 0 0 10px';
		fade_div.appendChild(text_div);

		var shadowed_tl = document .createElement("div");
		shadowed_tl.className = "tl";
		fade_div.appendChild(shadowed_tl);

		var shadowed_t = document.createElement("div");
		shadowed_t.className = "t";
		fade_div.appendChild(shadowed_t);

		var shadowed_tr = document.createElement("div");
		shadowed_tr.className = "tr";
		fade_div.appendChild(shadowed_tr);

		var shadowed_l = document.createElement("div");
		shadowed_l.className = "l";
		fade_div.appendChild(shadowed_l);

		var shadowed_r = document.createElement("div");
		shadowed_r.className = "r";
		fade_div.appendChild(shadowed_r);

		var shadowed_bl = document.createElement("div");
		shadowed_bl.className = "bl";
		fade_div.appendChild(shadowed_bl);

		var shadowed_b = document.createElement("div");
		shadowed_b.className = "b";
		fade_div.appendChild(shadowed_b);

		var shadowed_br = document.createElement("div");
		shadowed_br.className = "br";
		fade_div.appendChild(shadowed_br);

		// получаем ширину выпадающего блока и устанавливаем её для верхней и нижней границы
		groupChildElements = fade_div.children;

		if (groupChildElements != undefined)
		{
			for (i = 0; i < groupChildElements.length; i++)
			{
				if(groupChildElements[i].className == 'b' | groupChildElements[i].className == 't')
				{
					groupChildElements[i].style.width = fade_div.clientWidth + 'px';
				}

				if(groupChildElements[i].className == 'r' | groupChildElements[i].className == 'l')
				{
					groupChildElements[i].style.height = fade_div.clientHeight + 'px';
				}
			}
		}

		fade_div.style.display = 'none';
	}
	
	// Вставляем текст
	
	if (!text_div) var text_div = document.getElementById('id_text_div');
	text_div.style.display = 'inline';
	text_div.innerHTML = text;

	// Отображаем div
	fade_div.style.display = 'block';

	var arrayPageSize = getPageSize();

	// 0 - pageWidth, 1 - pageHeight, 2 - windowWidth, 3 - windowHeight
	var arrayPageSize = getPageSize();

	// 0 - scrOfX, 1 - scrOfY
	var arrayScrollXY = getScrollXY();

	// Отображаем до определения размеров div-а
	var clientHeight = fade_div.clientHeight;
	fade_div.style.top = ((arrayPageSize[3] - clientHeight) / 2 + arrayScrollXY[1]) + 'px';

	var clientWidth = fade_div.clientWidth;
	fade_div.style.left = ((arrayPageSize[2] - clientWidth) / 2 + arrayScrollXY[0]) + 'px';
	
	sleep(200);
}

// Скрытие экрана загрузки AJAX.
function HideLoadingScreen()
{
	// Убераем затемнение.
	fade_div = document.getElementById('id_admin_forms_fade');

	if (typeof fade_div != 'undefined')
	{
		fade_div.style.display = "none";
	}
}

// Функция обратного вызова, вызываемая при получении ответа на удаление изображений
function callback_function_exec_from_return(responseJS)
{
	// Выполняем присланные данные
	if (typeof responseJS != 'undefined')
	{
		// Данные.
		if (typeof responseJS.result != 'undefined')
		{
			var temp_div = document.createElement('div');
			temp_div.style.display = 'none';
			temp_div.innerHTML = responseJS.result;

			// Выполняем скрипты из полученного с сервера HTML-а
			runScripts(temp_div.getElementsByTagName('SCRIPT'));
		}
	}
}

function AddLoadFileField(container_id, inpit_prefix)
{
	cbItem = document.getElementById(container_id);

	if (cbItem)
	{
		// Получаем все input-ы
		element_array = cbItem.getElementsByTagName("input");

		count_input = element_array.length;

		/*
		<br/>
		<input size="15px" name="attachment_1" type="file" title="Прикрепить файл"/>
		&#xA0;<a href="javascript:AddLoadFileField()">Еще файл &#8230;</a>
		*/

		// <br/>
		var ElementBr = document.createElement("br");
		cbItem.appendChild(ElementBr);

		//<input
		var ElementInput = document.createElement("input");
		ElementInput.setAttribute("size", "30");
		ElementInput.setAttribute("name", inpit_prefix + (count_input + 1));
		ElementInput.setAttribute("type", "file");
		ElementInput.setAttribute("title", "Прикрепить файл");
		//ElementInput.setAttribute("style", "margin-bottom: 20px");
		cbItem.appendChild(ElementInput);

		/*
		// пробел
		var ElementSpan = document.createElement("span");
		ElementSpan.innerHTML = " ";
		cbItem.appendChild(ElementSpan);

		// <a
		var ElementA = document.createElement("a");
		ElementA.setAttribute("href", "javascript:AddLoadFileField()");
		cbItem.appendChild(ElementA);

		// Еще файл ...
		var ElementSpan2 = document.createElement("span");
		ElementSpan2.text = "Еще файл &#8230;";
		ElementA.appendChild(ElementSpan);
		*/
	}
}

/**
* Добавление полей для спец.цены
* container_id - div, в который добавляются элементы
*/
function AddSpecialPricesFields(container_id)
{
	cbItem = document.getElementById(container_id);

	if (cbItem)
	{
		// Получаем все input-ы
		element_array = cbItem.getElementsByTagName("input");

		count_input = element_array.length / 3 + 1;

		// <div style="clear: both;"/>
		var element_div = document.createElement("div");
		element_div.setAttribute("style", "clear: both;");
		cbItem.appendChild(element_div);

		// Создаем div
		var element_div = document.createElement("div");
		element_div.setAttribute("class", "item_div");
		element_div.setAttribute("style", "float: left;");
		cbItem.appendChild(element_div);

		var element_span = document.createElement("span");
		element_span.setAttribute("class", "caption");
		element_div.appendChild(element_span);

		var element_acronym = document.createElement("acronym");
		element_acronym.setAttribute("title", "Минимальное количество товара, которое нужно купить за один раз, чтобы задействовать цену");
		element_acronym.innerHTML = "Количество товара от";
		element_span.appendChild(element_acronym);

		//<input Количество товара от
		var ElementInput = document.createElement("input");
		ElementInput.setAttribute("id", "shop_special_prices_from_" + count_input);
		ElementInput.setAttribute("type", "text");
		ElementInput.setAttribute("onblur", "FieldCheck(this)");
		ElementInput.setAttribute("onkeyup", "FieldCheck(this)");
		ElementInput.setAttribute("onkeydown", "FieldCheck(this)");
		ElementInput.setAttribute("value", "");
		ElementInput.setAttribute("name", "shop_special_prices_from_js_" + count_input);
		ElementInput.setAttribute("style", "width: 120px; background-image: url(/admin/images/bullet_green.gif); background-position: right center; background-repeat: no-repeat;");
		element_div.appendChild(ElementInput);

		fieldType["shop_special_prices_from_" + count_input] = {'maxlen' : 11,
		'reg' : /^[0-9]*$/};
		fieldMessage["shop_special_prices_from_" + count_input] = {'reg' : "Значение поля не соответствует формату."};

		//<div id="_error" class="div_message_error"/>
		var element_div_error = document.createElement("div");
		element_div_error.setAttribute("class", "div_message_error");
		element_div_error.setAttribute("id", "shop_special_prices_from_" + count_input + "_error");
		element_div.appendChild(element_div_error);


		// Создаем div
		var element_div = document.createElement("div");
		element_div.setAttribute("class", "item_div");
		element_div.setAttribute("style", "float: left;");
		cbItem.appendChild(element_div);

		var element_span = document.createElement("span");
		element_span.setAttribute("class", "caption");
		element_div.appendChild(element_span);

		var element_acronym = document.createElement("acronym");
		element_acronym.setAttribute("title", "Максимальное количество товара, которое нужно купить за один раз, чтобы задействовать цену");
		element_acronym.innerHTML = "Количество товара до";
		element_span.appendChild(element_acronym);

		//<input Количество товара до
		var ElementInput = document.createElement("input");
		ElementInput.setAttribute("id", "shop_special_prices_to_" + count_input);
		ElementInput.setAttribute("type", "text");
		ElementInput.setAttribute("onblur", "FieldCheck(this)");
		ElementInput.setAttribute("onkeyup", "FieldCheck(this)");
		ElementInput.setAttribute("onkeydown", "FieldCheck(this)");
		ElementInput.setAttribute("value", "");
		ElementInput.setAttribute("name", "shop_special_prices_to_js_" + count_input);
		ElementInput.setAttribute("style", "width: 120px; background-image: url(/admin/images/bullet_green.gif); background-position: right center; background-repeat: no-repeat;");
		element_div.appendChild(ElementInput);

		fieldType["shop_special_prices_to_" + count_input] = {'maxlen' : 11,
		'reg' : /^[0-9]*$/};
		fieldMessage["shop_special_prices_to_" + count_input] = {'reg' : "Значение поля не соответствует формату."};

		//<div id="_error" class="div_message_error"/>
		var element_div_error = document.createElement("div");
		element_div_error.setAttribute("class", "div_message_error");
		element_div_error.setAttribute("id", "shop_special_prices_to_" + count_input + "_error");
		element_div.appendChild(element_div_error);


		// Создаем div
		var element_div = document.createElement("div");
		element_div.setAttribute("class", "item_div");
		element_div.setAttribute("style", "float: left;");
		cbItem.appendChild(element_div);

		var element_span = document.createElement("span");
		element_span.setAttribute("class", "caption");
		element_div.appendChild(element_span);

		var element_acronym = document.createElement("acronym");
		element_acronym.setAttribute("title", "Цена за единицу товара, купленного в определенном количестве");
		element_acronym.innerHTML = "Цена";
		element_span.appendChild(element_acronym);

		//<input Цена
		var ElementInput = document.createElement("input");
		ElementInput.setAttribute("id", "shop_special_prices_price_" + count_input);
		ElementInput.setAttribute("type", "text");
		ElementInput.setAttribute("onblur", "FieldCheck(this)");
		ElementInput.setAttribute("onkeyup", "FieldCheck(this)");
		ElementInput.setAttribute("onkeydown", "FieldCheck(this)");
		ElementInput.setAttribute("value", "");
		ElementInput.setAttribute("name", "shop_special_prices_price_js_" + count_input);
		ElementInput.setAttribute("style", "width: 120px; background-image: url(/admin/images/bullet_green.gif); background-position: right center; background-repeat: no-repeat;");
		element_div.appendChild(ElementInput);

		fieldType["shop_special_prices_price_" + count_input] = {'reg' : /^[0-9.]*$/};
		fieldMessage["shop_special_prices_price_" + count_input] = {'reg' : "Значение поля не соответствует формату."};

		//<div id="_error" class="div_message_error"/>
		var element_div_error = document.createElement("div");
		element_div_error.setAttribute("class", "div_message_error");
		element_div_error.setAttribute("id", "shop_special_prices_price_" + count_input + "_error");
		element_div.appendChild(element_div_error);
	}
}

// -----------------------------------------------------------------------------
// Модуль "Структура сайта"
// -----------------------------------------------------------------------------
function SetViewStructure(ASelectedItem, structure_id, lib_dir_id, lib_id)
{
	document.getElementById("templates_id").style.display = "none";
	document.getElementById("module_id").style.display = "none";
	document.getElementById("module_config_id").style.display = "none";

	document.getElementById("documents_dir_list_id").style.display = "none";
	document.getElementById("documents_list_id").style.display = "none";
	document.getElementById("structure_external_link_id").style.display = "none";

	document.getElementById("lib_dir_id").style.display = "none";
	document.getElementById("lib_id").style.display = "none";
	document.getElementById("lib_properties").style.display = "none";

	switch (ASelectedItem)
	{
		case 0: // Страница.
		document.getElementById("documents_dir_list_id").style.display = "";
		document.getElementById("documents_list_id").style.display = "";
		document.getElementById("structure_external_link_id").style.display = "";

		break;

		case 1: // Динамическая страница.
		document.getElementById("templates_id").style.display = "";
		document.getElementById("module_id").style.display = "";
		document.getElementById("module_config_id").style.display = "";

		break;

		case 2: // Типовая дин. страница.

		document.getElementById("templates_id").style.display = "";
		document.getElementById("lib_dir_id").style.display = "";
		document.getElementById("lib_id").style.display = "";
		document.getElementById("lib_properties").style.display = "";

		// Загружаем список типовых страниц.
		DoLoadLibs(lib_dir_id, lib_id);

		// Получаем свойства для выбранной типовой динамической страницы.
		DoLoadLibProperties(lib_id, structure_id);
		break;
	}
}


// Скрипт для заполнения списка типовых дин. страниц
function DoLoadLibs(ALibDirId, ALibId)
{
	// Этот код вызовется автоматически, когда загрузка данных завершится.
	function callbackfunction(responseJS)
	{
		if (typeof responseJS != 'undefined')
		{
			// Выводим результат в переменную.
			html = responseJS.lib_html;
		}
		else
		{
			html = '';
		}

		document.getElementById('id_lib_id').innerHTML = html;
	}

	// Отправляем запрос backend-у
	sendRequest('/admin/structure/structure.php?ajax_structure=1&get_libs=1&lib_dir_id=' + ALibDirId +
	'&lib_id=' + ALibId, 'get', callbackfunction);
}

function DoLoadXSL(AXslName, AXslDirId, APropertyId)
{
	// Этот код вызовется автоматически, когда загрузка данных завершится.
	function callbackfunction(responseJS)
	{
		if (typeof responseJS != 'undefined')
		{
			// Выводим результат в переменную
			html = responseJS.property_xsl_html;
		}
		else
		{
			html = '';
		}
		document.getElementById('id_xls_tamplate_' + APropertyId).innerHTML = html;
	}

	// Отправляем запрос backend-у
	sendRequest('/admin/structure/structure.php?ajax_structure=1&get_xsl=' + HostcmsEscape(AXslName) +
	'&property_id=' + APropertyId + '&xsl_dir_id=' + AXslDirId, 'get', callbackfunction);
}

// Скрипт для заполнения списка свойств
function DoLoadLibProperties(ALibId, structure_id)
{
	// Этот код вызовется автоматически, когда загрузка данных завершится.
	function callbackfunction(responseJS)
	{
		if (typeof responseJS != 'undefined')
		{
			// Выводим результат в переменную.
			html = responseJS.lib_properties_html;

			if (responseJS.java_script != '')
			{
				eval(responseJS.java_script);
			}
		}
		else
		{
			html = '';
		}

		document.getElementById('lib_properties').innerHTML = html;
	}

	// Отправляем запрос backend-у
	sendRequest('/admin/structure/structure.php?ajax_structure=1&get_lib_properties_id=' + ALibId +
	'&structure_id=' + structure_id, 'get', callbackfunction);
}

// -----------------------------------------------------------------------------
// / Модуль "Структура сайта"
// -----------------------------------------------------------------------------

function SetViewField(ASelectedItem)
{
	var oPercent = document.getElementById("affiliate_values_percent_id");
	var oValue = document.getElementById("affiliate_values_value_id");

	if (oPercent != 'undefined' && oValue != 'undefined')
	{
		oPercent.style.display = "none";
		oValue.style.display = "none";

		switch (ASelectedItem)
		{
			case 0: // Процент.
			{
				oPercent.style.display = '';
				break;
			}
			case 1: // Сумма.
			{
				oValue.style.display = '';
				break;
			}
		}
	}
}

// action - адрес страницы для запрос
// method - GET, POST, null - автоматическое определение
// callback_function - функция обратного вызова, которая будет вызвана после получения ответа от backenad-а
function sendBackgroundRequest(action, method, callback_function)
{
	var req = new JsHttpRequest();

	// Этот код вызовется автоматически, когда загрузка данных завершится.
	req.onreadystatechange = function()
	{
		if (req.readyState == 4)
		{
			// Возвращаем обычный курсор
			document.body.style.cursor = '';

			if (typeof callback_function != 'undefined')
			{
				callback_function(req.responseJS);
			}

			return true;
		}
	}

	req.open(method, action, true);

	// Отсылаем данные в обработчик.
	req.send(null);

	// Курсор ставим на часики.
	document.body.style.cursor = "wait";
	
	ShowLoadingScreen();
}
