/** * 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; } } // Событие - нажатие клавиши. 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; } } } 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); } } } } // выполняет скрипты из полученного ответа от сервера 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*\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)); } } } // 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) { // Отключаем связь с редакторами DisableTinyMCE(); 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; } } } } //Отправка формы методом 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, в который поместим текст + скрипт. // Если перед