/** * Плагин jQuery общего JS API. * * Внимание! Любые изменения в этом коде являются грубым нарушением * конвенции о взаимодействии с технологическим отделом. * Если у вас возникает необходимость в изменении или доработках, * обращайтесь в технологический отдел согласно правилам: * http://storm:2010/page/TechnoAlgorythm.aspx * Все несанкционированные изменения будут удалены * при очередном обновлении технологического слоя. * * @copyright Copyright (c) IIS. All rights reserved. */ ; (function ($, window, document, undefined) { // В обработчике window.onload иногда работает логика, завершения которой нужно дождаться прежде чем выполнять свою, // поэтому дополняем уже заданную логику window.onload вызовом соответствующего события. var originalOnloadMethod = window.onload; // Не используем window.onload = function() {} т.к. если в прикладном коде перезапишут window.onload, функция не вызовется. $(window).load(function () { if (typeof originalOnloadMethod === 'function') { originalOnloadMethod.apply(this, arguments); } window.onLoadIsFinished = true; $(window).trigger('onfinishload'); }); /* * Функция парсинга параметров. */ function parseQuery(query) { var Params = {}; if (!query) { return Params; } var decode = function (encodedString) { var decodedString; try { decodedString = (decodeURIComponent || unescape)(encodedString); } catch (exc) { decodedString = unescape(encodedString); } return decodedString; }; var Pairs = query.replace(/\+/g, ' ').split(/[;&]/); for (var i = 0; i < Pairs.length; i++) { var KeyVal = Pairs[i].split('='); if (!KeyVal || KeyVal.length != 2) { continue; } var key = decode(KeyVal[0]); var val = decode(KeyVal[1]); Params[key] = val; } return Params; } // 'use strict'; __doPostBack в FF не работает $.ics = $.extend($.ics, { // Диалоговые окна. dialog: { /** * Диалоговое окно для потверждения или отмены действия (YES / NO / Cancel) * * Для работы метода необходим jQueryUI. Используется метод $.dialog. * * @params {object} options Парметры метода. * @params {object} options.title Заголовок окна. * @params {object} options.callback Обработчик результата. В качестве параметра принимает строку со значениями: YES, NO, Cancel. * @params {object} options.yesButtonText Наименование первой кнопки. * @params {object} options.noButtonText Наименование второй кнопки. * @params {object} options.cancelButtonText Наименование третьей кнопки. */ dialog: function (options) { options = $.extend({ title: '', callback: undefined, yesButtonText: $.ics.configuration.dialog.yesButtonText, noButtonText: $.ics.configuration.dialog.noButtonText, cancelButtonText: $.ics.configuration.dialog.cancelButtonText }, options); var buttons = {}; buttons[options.yesButtonText] = function () { dialog.dialog('close'); options.callback('YES'); }; buttons[options.noButtonText] = function () { dialog.dialog('close'); options.callback('NO'); }; buttons[options.cancelButtonText] = function () { dialog.dialog('close'); options.callback('Cancel'); }; var dialog = $('
' + options.title + '
').dialog({ buttons: buttons }); }, /** * Метод для отображения окна подтверждения действия (OK / Cancel). * * Метод является асинхронным. Для проверки результата действия пользователя * нужно устаналивать callback. * * Для поддержки всех функцинальных возможностей должен быть подключен плагин * "jQuery.alerts". Если плагин не подключен то будут использованы встроенные * возможности браузера с урезанной функциональностью. * * @param options Параметры окна: текст сообщения, заголовок окна, функция обратного вызова, подписи кнопок. */ confirm: function (options) { options = $.extend({ message: '', title: '', callback: undefined, okButtonText: $.ics.configuration.dialog.okButtonText, cancelButtonText: $.ics.configuration.dialog.cancelButtonText }, options); if ($.ics.pluginExists('alerts') && window.jConfirm) { var oldOkButton = $.alerts.okButton, oldCancelButton = $.alerts.cancelButton; $.alerts.okButton = options.okButtonText; $.alerts.cancelButton = options.cancelButtonText; window.jConfirm(options.message, options.title, options.callback); $.alerts.okButton = oldOkButton; $.alerts.cancelButton = oldCancelButton; } else { $.ics.console.log('Плагин jQuery.alerts не подключен. Используются встроенные возможности браузера.'); setTimeout(function () { var answer = window.confirm(options.message); if ($.isFunction(options.callback)) { options.callback(answer); } }, 0); } }, /** * Метод для отображения информационного окна с произвольным содержимым. * * Метод является асинхронным. Для обработки события закрытия окна пользователем * нужно устаналивать callback. * * Для поддержки всех функцинальных возможностей должен быть подключен плагин * "jQuery.alerts". Если плагин не подключен то будут использованы встроенные * возможности браузера с урезанной функциональностью. * * @param {Object|string} options Текст сообщения или объект с расширенными параметрами окна: текст сообщение, заголовок окна, функция обратного вызова. */ alert: function (options) { if (typeof options == 'string' || options instanceof String) { options = { message: options }; } else { options = $.extend({ message: undefined, title: undefined, callback: undefined }, options); } if ($.ics.pluginExists('alerts') && window.jAlert) { window.jAlert(options.message || '', options.title || '', options.callback); } else { $.ics.console.log('Плагин jQuery.alerts не подключен. Используются встроенные возможности браузера.'); setTimeout(function () { window.alert(options.message || ''); if ($.isFunction(options.callback)) { options.callback(); } }, 0); } }, /** * Метод для отображения модального окна с произвольным содержимым. * * Метод является асинхронным. Для обработки события закрытия окна пользователем * нужно устаналивать callback. * * Для работы метода необходим jQueryUI. Используется метод $.dialog. * * @param options Параметры окна. * @returns {Object|undefined} Объект для управления модальным окном. */ modal: function (options) { options = $.extend({ href: undefined, content: undefined, inlineId: undefined, title: undefined, width: $.ics.configuration.dialog.width, height: $.ics.configuration.dialog.height, callback: undefined, autoOpen: false, modal: true, resizable: true, minWidth: 250, minHeight: 250, closeText: "Закрыть", onClose: undefined, closeOnEscape: true }, options); var modalContent = $("") var def = $.Deferred(); if (options.href) { var url = options.href; var queryString = url.replace(/^[^\?]+\??/, ''); var params = parseQuery(queryString); options = $.extend(options, params); // Передать заголовок формы, открывающийся по лукапу. if (options.FormCaption !== undefined) options.title = options.FormCaption; var iframe = $(""); modalContent.append(iframe).appendTo("body"); iframe.attr("src", options.href); } else if (options.inlineId) { modalContent.append($('#' + options.inlineId)).appendTo('body'); // Отобразить содержимого блока. modalContent.children().show(); } else { var uniqueId = $.ics.generateUniqueId('ics_dialog_modal_'); modalContent.html(options.content || '').attr('id', uniqueId).appendTo('body'); } var $dialogLoadingSpinner; var $dialog = modalContent.dialog(options, { open: function () { if ($dialogLoadingSpinner) { $dialogLoadingSpinner.remove(); } $('body').addClass('modal-open').attr('scroll', 'no'); modalContent.show(); return def.promise(); }, close: function () { $('body').removeClass('modal-open').removeAttr('scroll'); if (options.inlineId) { modalContent.children().appendTo('body').hide(); }; $('.ics-modal, .ics-modal-content, .ui-widget-overlay').remove(); if (options.onClose) options.onClose(); def.resolve(); }, resizeStop: function () { this.style.width = this.offsetParent.clientWidth.toString() + 'px'; this.style.height = (this.offsetParent.clientHeight - 50).toString() + 'px'; }, dialogClass: 'ics-modal', drag: function (event, ui) { // Функция необходима, когда скролл страницы не на нулевой позиции. var fixPix = $(document).scrollTop(); iObj = ui.position; if (iObj.top !== ui.offset.top) { iObj.top = iObj.top - fixPix; } ui.position = iObj; } }); // Для правильного позиционирования модального окна, и предотвращения его смещения после открытия, // открываем его только после того как завершится логика обработчика window.onload. // Например при включенной настройке MaintainScrollPositionOnPostBack в window.onload происходит восстановление прежних позиций скроллов на странице // (см. https://msdn.microsoft.com/en-us/library/system.web.ui.page.maintainscrollpositiononpostback(v=vs.110).aspx). if (window.onLoadIsFinished) { $dialog.dialog('open'); } else { $dialogLoadingSpinner = $('