; (function() { function AdapterManager() { this.ADAPTABILITY_TYPE_PC = 'pc'; this.ADAPTABILITY_TYPE_TABLET = 'tablet'; this.ADAPTABILITY_TYPE_MOBILE = 'mobile370'; this.view_port = "editor"; this.site_width = 960; this.DEVICE_TABLET_CONTENT_MIN_WIDTH = 800; this.DEVICE_TABLET_POPUP_MIN_WIDTH = 400; this.DEVICE_MOBILE_CONTENT_MIN_WIDTH = 370; this.DEVICE_MOBILE_POPUP_MIN_WIDTH = 300; this.DEVICE_MOBILE_MAX_WIDTH = 500; this.DEVICE_TABLET_MAX_WIDTH = 800; this.MARGIN_VERSION_OLD = 1; this.MARGIN_VERSION_NEW = 2; this.processResizing = 0; this.own_slider_editor = new FAdapterSliderEditor(); this.types = []; this.nonPcClass = "non-pc"; this.data_empty = {}; this.states = {}; this.data = {}; this.hybridData = {}; this.$sections = []; this.$blocks = []; this.type = this.ADAPTABILITY_TYPE_PC; this.prev_type = this.ADAPTABILITY_TYPE_PC; this.blockTextPcContents = {}; this.resizeTimer = false; this.selectors = { $desktop: $(".responsive_menu .responsive_menu_item[version=pc]") }; this.$defaultScopeRoot = null; this.$scopeRoot = null; this.$scopeBlocks = null; this.is_ready = false; this.ready = function () { this.is_ready = true; FE.runAndClr('adapterManager/ready'); }; this.isReady = function () { return this.is_ready; }; this.isEditor = function () { return "editor" == adapterManager.view_port; }; this.isView = function () { return "view" == adapterManager.view_port; }; this.isPC = function () { return adapterManager.ADAPTABILITY_TYPE_PC == adapterManager.type; }; this.getDefaultScopeRoot = function () { if (!this.$defaultScopeRoot) { this.$defaultScopeRoot = $('#site_wrapper1'); } return this.$defaultScopeRoot; }; this.getScopeRoot = function () { return (this.$scopeRoot || this.getDefaultScopeRoot()); }; this.setScopeRoot = function ($scopeRoot) { this.$scopeRoot = $scopeRoot; }; this.getDefaultScopeBlocks = function () { return this.getScopeRoot(); }; this.getScopeBlocks = function () { return (this.$scopeBlocks || this.getDefaultScopeBlocks()); }; this.setScopeBlocks = function ($scopeBlocks) { this.$scopeBlocks = $scopeBlocks; }; this.setData = function (newData) { for (var type in newData) { if (!newData.hasOwnProperty(type)) { continue; } if (!this.data.hasOwnProperty(type)) { this.data[type] = newData[type]; continue; } for (var id in newData[type]) { if (!newData[type].hasOwnProperty(id) || this.data[type].hasOwnProperty(id)) { continue; } this.data[type][id] = newData[type][id]; } } }; this.setHybridData = function (newHybridData) { for (var type in newHybridData) { if (!newHybridData.hasOwnProperty(type)) { continue; } if (!this.hybridData.hasOwnProperty(type)) { this.hybridData[type] = newHybridData[type]; continue; } for (var id in newHybridData[type]) { if (!newHybridData[type].hasOwnProperty(id) || this.hybridData[type].hasOwnProperty(id)) { continue; } this.hybridData[type][id] = newHybridData[type][id]; } } }; this.setVersion = function (type, ops) { if ('undefined' == typeof ops) { ops = {}; } if ('undefined' == typeof ops.isEnableLockScreen) { // устанавливаем значение по умолчанию "true" ops.isEnableLockScreen = true; } else { // convert to bool ops.isEnableLockScreen = !!ops.isEnableLockScreen; } // для других булевых опций значение по умолчанию "false" ops.isDisableCloseEditor = !!ops.isDisableCloseEditor; ops.skipProcessingItems = !!ops.skipProcessingItems; if ('undefined' == typeof ops.$scopeRoot) { ops.$scopeRoot = adapterManager.getDefaultScopeRoot(); } adapterManager.setScopeRoot(ops.$scopeRoot); if ('undefined' == typeof ops.$scopeBlocks) { ops.$scopeBlocks = adapterManager.getDefaultScopeBlocks(); } adapterManager.setScopeBlocks(ops.$scopeBlocks); if (adapterManager.isEditor() && !ops.isDisableCloseEditor) { pages_editor.closeEditor(true); } adapterManager.prev_type = adapterManager.type; adapterManager.type = type; if ($.isEmptyObject(adapterManager.data)) { adapterManager.data = adapterManager.data_empty; } if ($.isEmptyObject(adapterManager.data[adapterManager.type])) { adapterManager.data[adapterManager.type] = {}; } if ($.isEmptyObject(adapterManager.data[adapterManager.prev_type])) { adapterManager.data[adapterManager.prev_type] = {}; } if (ops.skipProcessingItems) { adapterManager.setAdaptiveBodyClasses(); return; } if (ops.isEnableLockScreen && adapterManager.isEditor()) { var text; switch (type) { case adapterManager.ADAPTABILITY_TYPE_MOBILE: text = "Переход в мобильный редактор"; break; case adapterManager.ADAPTABILITY_TYPE_TABLET: text = "Переход в редактор для планшета"; break; case adapterManager.ADAPTABILITY_TYPE_PC: default: text = "Переход в редактор для ПК"; } var lock_id = lockScreen(text, { css_class: "locker-white", show_animation: true }); $('body').addClass("editor-hidden"); setTimeout(function () { adapterManager.processingItems(); $('body').removeClass("editor-hidden"); FE.run('adapter_manager/set_version/editor', {type: type}); unlockScreen(lock_id); }, 50); } else { adapterManager.processingItems(); } FE.run('adapter_manager/set_version', {type: type}); }; this.setAdaptiveBodyClasses = function () { var $body = $('body'); $body .removeClass(adapterManager.types.join(" ")) .removeClass(adapterManager.nonPcClass) .addClass(adapterManager.type); if (adapterManager.type !== adapterManager.ADAPTABILITY_TYPE_PC) { $body.addClass(adapterManager.nonPcClass); } }; this.initProcessingBlocks = function (adapter_type) { if (typeof (adapter_type) != "undefined") { if (adapter_type == adapterManager.ADAPTABILITY_TYPE_PC) { adapterManager.$sections = adapterManager.getScopeRoot().find('.blk_section:visible[adapter_type=' + adapter_type + '], .blk_section:visible:not([adapter_type])'); adapterManager.$blocks = adapterManager.getScopeBlocks().find('.blk:not(.skip-adapt):visible[adapter_type=' + adapter_type + '], .blk:not(.skip-adapt):visible:not([adapter_type])'); adapterManager.$containers = adapterManager.getScopeBlocks().find('.blk_container:not(.skip-adapt):visible[adapter_type=' + adapter_type + '], .blk_container:not(.skip-adapt):visible:not([adapter_type])'); } else { adapterManager.$sections = adapterManager.getScopeRoot().find('.blk_section:visible[adapter_type=' + adapter_type + ']'); adapterManager.$blocks = adapterManager.getScopeBlocks().find('.blk:not(.skip-adapt):visible[adapter_type=' + adapter_type + ']'); adapterManager.$containers = adapterManager.getScopeBlocks().find('.blk_container:not(.skip-adapt):visible[adapter_type=' + adapter_type + ']'); } } else { adapterManager.$sections = adapterManager.getScopeRoot().find('.blk_section:visible:not([adapter_type=' + adapterManager.type + '])'); adapterManager.$blocks = adapterManager.getScopeBlocks().find('.blk:not(.skip-adapt):visible:not([adapter_type=' + adapterManager.type + '])'); adapterManager.$containers = adapterManager.getScopeBlocks().find('.blk_container:not(.skip-adapt):visible:not([adapter_type=' + adapterManager.type + '])'); } }; this.savePC = function () { adapterManager.initProcessingBlocks(adapterManager.ADAPTABILITY_TYPE_PC); // до ресайза // обработка блоков adapterManager.processingBlocksBeforeResize(); // обработка контейнеров adapterManager.processingContainersBeforeResize(); // обработка секций if (!adapterManager.isView()) { adapterManager.processingSectionBeforeResize(); } }; /** * Меняет видимость слайдов в обычных секциях и скрытых элементов в MS-секциях * Используется при переключении адаптивности * * @param {boolean} isVisible */ this.setHiddenItemsVisibility = function (isVisible) { // класс .hidden-ms-item используется в шаблонах ms-секций для обозначения скрытого элемента со слотом внутри const hiddenItemsSelector = '.hidden-slide, .hidden-ms-item'; adapterManager .getScopeBlocks() .find(hiddenItemsSelector) .toggleClass('vis', isVisible); }; /** * Реинициализация всех секций и всех блоков при смене версии адаптивности * * Выполняется в редакторе, предпросмотре и опубликованном */ this.processingItems = function () { this.processResizing = 1; var block_settings = adapterManager.getSettings(adapterManager.type); adapterManager.setHiddenItemsVisibility(true); // установка видимости секций adapterManager.showHideSections(); adapterManager.savePC(); adapterManager.setAdaptiveBodyClasses(); FE.run('adapterManager/editor/processingAbsoluteSections'); adapterManager.initProcessingBlocks(); // установим ширину секции adapterManager.resizeContent(block_settings); // обработка всплывающих окон adapterManager.resizeWindowPopup(block_settings); // обработка секций adapterManager.processingSectionAfterResize(block_settings); // обработка контейнеров adapterManager.processingContainersAfterResize(block_settings); // обработка блоков adapterManager.processingBlocksAfterResize(); // обработка секций с фоном-картой adapterManager.processingMapSectionsAfterResize(); /* * Реинициализируем слайдер после того, как применены все настройки к блокам, так как в противном случае * к вспомогательным слайдам применяются не те настройки (т.е. при переключении в мобильную версию - настройки от ПК * и наоборот */ if (adapterManager.hasOwnProperty('slickOpt')) { adapterManager.reinitializeSlick(); } if (adapterManager.isEditor()) { adaptiveSettingsEditor.initContainersCells(block_settings); } adapterManager.setHiddenItemsVisibility(false); // Переключение блока в правой панели, чтобы при переходе в мобильную версию скрывались настройки if (adapterManager.isEditor() && edSidebarVue.isVisible) { edSidebarVue.setBlock(edSidebarVue.block); } this.processResizing = 0; FE.run('adapterManager/editor/afterResizingProcess'); }; this.showHideSections = function () { if (!adapterManager.isEditor()) { return; } var $sections = adapterManager.getScopeRoot().find('.blk_section'); $sections.each(function () { var $section = $(this); var adapter_type = $section.attr('adapter_type'); var block_id = $section.attr('id'); var data = typeof (adapterManager.data[adapterManager.type][block_id]) == "undefined" ? {} : adapterManager.data[adapterManager.type][block_id]; var hideSection = false; if (typeof (adapter_type) == "undefined" || adapterManager.ADAPTABILITY_TYPE_PC == adapter_type) { var data_pc = typeof (adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id]) == "undefined" ? {} : adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id]; data_pc["is_hidden"] = ($section.hasClass('is_hidden_on_pc') ? 1 : 0); adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id] = data_pc; } if (typeof (data['is_hidden']) != "undefined" && 1 == data['is_hidden']) { hideSection = true; } if (hideSection) { $section.addClass('is_hidden'); } else { $section.removeClass('is_hidden'); } }); }; this.resizeContent = function (block_settings) { if (!adapterManager.isEditor()) { return; } var widthFixElements = "#site_wrapper1"; if (adapterManager.isView()) { widthFixElements += ",body"; } $(widthFixElements).css('min-width', block_settings.min_width); var w_popup = block_settings.popup_section_inner === false ? false : block_settings.popup_section_inner; var $section = $(); adapterManager.$sections.each(function () { $section = $(this); if ($section.hasClass('section_popup') && w_popup !== false) { $section.find('.blk_section_inner:first').css({"width": w_popup}); } else { $section.find('.blk_section_inner:first').css({"width": block_settings.width}); } }); }; this.resizeWindowPopup = function (block_settings) { $('#btnPopupWnd').css("width", block_settings.window_popover_width); $('#j_lead_confirm').css("width", block_settings.window_popover_width); }; this.processingContainersBeforeResize = function () { adapterManager.$containers.each(function () { var $container = $(this); var adapter_type = $container.attr('adapter_type'); if (typeof (adapter_type) == "undefined") { adapter_type = adapterManager.ADAPTABILITY_TYPE_PC; } var v3 = $container.hasClass('v3'); var clsCell = v3 ? '.td_container_cell' : '.cell.container_cell'; var $cells = $container.find('.blk_container_cells:first>' + clsCell); var w_container_cells = $container.find('.blk_container_cells:first').outerWidth(); var count_cell_in_row = adapter_type == adapterManager.ADAPTABILITY_TYPE_PC || typeof($container.attr('count-cell-in-row')) == "undefined" ? $cells.length : $container.attr('count-cell-in-row'); var fix_width = 0; $cells.each(function () { var $this = $(this); var cellID = $this.attr(v3 ? 'cell_id' : 'id'); var padding = $this.css('padding'); /* Firefox хак: jQuery возвращает пустую строку, если получать css-свойства через сокращения */ var isFirefox = typeof InstallTrigger !== 'undefined'; if (isFirefox) { padding = $this.css('padding-top') + ' ' + $this.css('padding-left'); } fix_width = number_format((100 * $this.outerWidth() / w_container_cells).toFixed(3), 3, '.'); adapterManager.data[adapter_type][cellID] = {}; if (adapterManager.isEditor()) { adapterManager.data[adapter_type][cellID] = { 'width': fix_width, 'padding': padding, 'margin_left': parseInt($this.css('margin-left')) }; } }); var $not_first_cell = $container.find('.blk_container_cells:first ' + clsCell + ':not(:first):first'); adapterManager.data[adapter_type][$container.attr('id')] = { "cell_margin_horizontal": parseFloat($not_first_cell.css('margin-left')), "w_container_cells": w_container_cells, "count_cell_in_row": count_cell_in_row }; }); }; this.processingContainersAfterResize = function (block_settings) { adapterManager.$containers.each(function () { var $container = $(this); $container.attr('adapter_type', adapterManager.type); var container_data = typeof (adapterManager.data[adapterManager.type][$container.attr('id')]) != "undefined" ? adapterManager.data[adapterManager.type][$container.attr('id')] : false; var count_cell_in_row = parseInt(false == container_data || typeof (container_data.count_cell_in_row) == "undefined" ? block_settings.default_count_cell_in_row : container_data.count_cell_in_row); var v3 = $container.hasClass('v3'); if (adapterManager.isPC()) { if (adapterManager.isEditor() && v3) { $container.find('.blk_container_cells:first').css({'display': 'table'}); } if (adapterManager.isEditor() || !v3) { adapterManager.processingCellsInBlockOnPC($container); if (adapterManager.isEditor()) { var cellClass = v3 ? '.td_container_cell' : '.cell.container_cell'; var $cells = $container.find('.blk_container_cells:first>' + cellClass); adapterManager.setResizerPosition($cells); } } } else { if (adapterManager.isEditor() || !v3) { if (v3) { $container.find('.blk_container_cells:first').css({'display': 'flex', 'flex-flow': 'row wrap'}); } adapterManager.setCountColumn($container, count_cell_in_row); } } }); // Реинициализация только на предпросмотре (когда для менеджера заданы сохраняются настройки слайдера) if (adapterManager.hasOwnProperty('slickOpt')) { adapterManager.reinitializeSlick(); } }; this.removeSlickClasses = function ($where) { if (!$where.length) { return; } $where.removeClass('initSlick'); }; this.rebuildSlick = function ($where) { if (!$where.length) { return; } $where.each(function () { var $this = $(this); var blk = $this.closest('.blk_box_slider'); var slider = $this.children('.slider:first'); if (slider.get(0).slick != null) { // Уничтожение старого slider.slick('unslick'); // Создание нового со старыми опциями slider.slick(adapterManager.slickOpt[blk.attr('id')]); } }); }; // Реинициализация слайдера this.reinitializeSlick = function () { var $scopeRoot = this.getScopeRoot(); if (this.getScopeRoot().is('#popup_list')) { this.removeSlickClasses($scopeRoot.find('.initSlick')); } else { this.removeSlickClasses($scopeRoot.find('#popup_list .initSlick')); } this.rebuildSlick($scopeRoot.find('.blk_box_slider_self')); }; this.processingCellsInBlockOnPC = function ($container) { var v3 = $container.hasClass('v3'); if (adapterManager.isEditor() || !v3) { var clsCell = v3 ? '.td_container_cell' : '.cell.container_cell'; var $cells = $container.find('.blk_container_cells:first>' + clsCell); $container.find('.row-splitter').remove(); if (adapterManager.isEditor()) { $cells.each(function () { var $cell = $(this); var cell_id = $cell.attr(v3 ? 'cell_id' : 'id'); var cell_data = adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][cell_id]; $cell.css({ 'width': cell_data.width + '%', 'padding': cell_data.padding, 'margin-left': cell_data.margin_left }); }); } } processingBlockInCells($cells); }; this.processingSectionBeforeResize = function () { adapterManager.$sections.each(function () { var $section = $(this); var adapter_type = $section.attr('adapter_type'); if (typeof (adapter_type) == "undefined") { adapter_type = adapterManager.ADAPTABILITY_TYPE_PC; } var $blk_section_inner = $section.find('.blk_section_inner:first'); var data = typeof (adapterManager.data[adapter_type][$section.attr('id')]) == "undefined" ? {} : adapterManager.data[adapter_type][$section.attr('id')]; data["pad_top"] = $section.css('padding-top'); data["pad_bottom"] = $section.css('padding-bottom'); data["width"] = $blk_section_inner.css('width'); data["max-width"] = $blk_section_inner.css('max-width'); adapterManager.data[adapter_type][$section.attr('id')] = data; }); }; this.processingMapSectionsAfterResize = function () { adapterManager.$sections.each(function () { var $section = $(this); if ($section.hasClass('bg_type_map') || 'map' == $section.attr('bg_type')) { yandexMaps.reInitMap($section.attr('id'), $section.attr('data-map-latitude'), $section.attr('data-map-longitude')); } }); }; this.processingSectionAfterResize = function () { adapterManager.$sections.each(function () { var $section = $(this); $section.attr('adapter_type', adapterManager.type); if (!adapterManager.isEditor()) { return true; } var sectionId = $section.attr('id'); var data = typeof (adapterManager.data[adapterManager.type][sectionId]) == "undefined" ? {} : adapterManager.data[adapterManager.type][sectionId]; var isMsSection = $section.hasClass("blk-section--html") || $section.hasClass("blk-section--ms"); if (!isMsSection) { var css_section = {}; if (typeof (data['pad_top']) !== 'undefined') { css_section['padding-top'] = data['pad_top']; } if (typeof (data['pad_bottom']) !== 'undefined') { css_section['padding-bottom'] = data['pad_bottom']; } $section.css(css_section); } var css_inner = {}; if (typeof (data['width']) !== 'undefined') { css_inner['width'] = data['width']; } if (typeof (data['max-width']) !== 'undefined') { css_inner['max-width'] = data['max-width']; } $section.find('.blk_section_inner:first').css(css_inner); }); }; this.processingBlocksBeforeResize = function () { adapterManager.$blocks.each(function () { var $block = $(this); if ($block.closest('.slick-cloned').length > 0) { return true; } var blk_class = $block.attr('blk_class'); var adapter_type = $block.attr('adapter_type'); var blockId = $block.attr('id'); if (typeof (adapter_type) == "undefined") { adapter_type = adapterManager.ADAPTABILITY_TYPE_PC; } if ('blk_image_ext' === blk_class && adapterManager.isEditor()) { var $crop = $block.find('.img-crop:first'); var $img = $crop.find('img:first, .svg_container'); var $wrap = $block.find('.blk_image_data_wrap:first'); pages_editor.img_ext_list_w[blockId] = { 'crop_start_w': $crop.width(), 'crop_start_h': $crop.height(), 'prod_start_w': $img.width(), 'wrap_start_w': $wrap.width(), 'img_position_start': $img.length > 0 ? $img.position() : {top: 0, left: 0}, 'real_w': $img.attr('real_w'), 'real_h': $img.attr('real_h') }; } adapterManager.data[adapter_type][blockId] = adapterManager.getAdaptiveDataOfBlock($block); }); }; this.processingBlocksAfterResize = function () { adapterManager.$blocks.each(function () { $(this).attr('adapter_type', adapterManager.type); adapterManager.processingBlockAfterResize($(this)); }); }; this.getSrcImageMod = function (src, data, isRetina) { var ext = src.split('.').pop(); var filename = src.substring(0, src.indexOf('/-/')); //у гифки нет кропания, поэтому файлнейм выхватываем иначе if (ext == 'gif') { return src; } var url = isRetina ? '/-/scale/x2' : ''; if ( 'undefined' !== typeof data['offset_top'] && 'undefined' !== data['offset_left'] && 'undefined' !== data['crop_w'] && 'undefined' !== data['crop_h'] && 'undefined' !== data['real_w'] && 'undefined' !== data['real_h'] && 'undefined' !== data['prod_w'] && 'undefined' !== data['prod_h'] ) { var hRatio = data['prod_h'] / data['real_h']; var wRatio = data['prod_w'] / data['real_w']; var x = Math.ceil(Math.abs(data['offset_left'] || 0) / wRatio); var y = Math.ceil(Math.abs(data['offset_top'] || 0) / hRatio); var w = Math.ceil((data['crop_w'] || 0) / wRatio); var h = Math.ceil((data['crop_h'] || 0) / hRatio); url += "/-/crop/" + x + "x" + y + "x" + w + "x" + h; } if (data['crop_w']) { url += "/-/resize/" + data['crop_w']; } if (data['quality']) { url += "/-/quality/" + data['quality']; } url += '/file.' + ext; url = filename + url; return url; }; this.processingBlockAfterResize = function ($block) { var block_id = $block.attr('id'); var currentData = adapterManager.data[adapterManager.type][block_id]; var data = {}; var isPcData = adapterManager.isPC(); if (currentData == null) { currentData = adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id]; if (currentData != null) { data = currentData; isPcData = true; } } else { data = currentData; } adapterManager.setBlockData($block, data, isPcData); }; this.setBlockData = function ($block, data, isPcData) { var blk_class = $block.attr('blk_class'); var fileExt; isPcData = !!isPcData; if (!adapterManager.isEditor() && "blk_image_ext" == blk_class) { blk_class = "blk_image"; } switch (blk_class) { case 'blk_image': if ($block.find('.blk_image_data_wrap').hasClass('v2')) { // пропускаем обработку для картинок v2 (с lazyload) console.log('not using adapter manager for block_image.v2'); // todo: вырезать log после выката lazyload break; } var blk_image_img = $block.find('.img_container img:first:not(.magnify-icon), .svg_wrap'); var imgSrc = blk_image_img.attr("src"); var isAsyncImg = false; //если пустой блок (Без картинки ) то пропускаем его if ($block.has(".blk_image_data_wrap.empty").length || imgSrc == null || imgSrc == "") { imgSrc = blk_image_img.attr('data-src'); isAsyncImg = true; if (imgSrc == null || imgSrc == '') { break; } } if (typeof (data['align']) != "undefined") { var $blk_image_data_wrap = $block.find('.blk_image_data_wrap:first'); $blk_image_data_wrap.removeClass('l_text').removeClass('c_text').removeClass('r_text').addClass(data['align']); } fileExt = imgSrc.split('.').pop(); if (typeof (data['prod_w']) != "undefined" && adapterManager.isEditor()) { blk_image_img.css('width', data['prod_w']).attr('prod_w', data['prod_w']); blk_image_img.css('height', "auto"); } if (!adapterManager.isEditor()) { //для свг src не надо подменять, а только ресайзить при переключении мобилки / PC if (imgSrc != null && fileExt != 'svg') { var src = imgSrc; //если переключились в пк версию if (adapterManager.isPC()) { src = blk_image_img.attr('pc-adapt'); } else if (1 == data['has_crop_image']) { data['quality'] = blk_image_img.attr('data-quality'); var isRetina = false; if (blk_image_img.attr('pc-adapt')) { isRetina = blk_image_img.attr('pc-adapt').toString().indexOf("/scale/x2/") != -1; } //иначе выхватываем картинку , которая настроена для мобильной версии src = this.getSrcImageMod(src, data, isRetina); } blk_image_img.attr(isAsyncImg ? 'data-src' : 'src', src); } } break; case 'blk_slider': var $temp_fotorama = $block.find('.fotorama:first'); if ($temp_fotorama.hasClass("fotorama--is-ready") || $block.closest('.blk_section').hasClass('section_popup')) { adapterManager.own_slider_editor.reinitFotorama($temp_fotorama); } break; case 'blk_form': if (typeof (data['width']) !== "undefined" && adapterManager.isEditor()) { $block.find('.blk_form_wrap:not(.is_popover) form').css('width', data['width']); } if (typeof (data['align']) !== "undefined") { var $blk_form_wrap = $block.find('.blk_form_wrap:first'); $blk_form_wrap.removeClass('l_text').removeClass('c_text').removeClass('r_text').addClass(data['align']); } break; case 'blk_video': if (adapterManager.isEditor()) { blockManager.getBlock($block.attr('id'), true).applyToHtmlAdaptiveData(data); } break; case 'blk_image_ext': var $crop = $block.find('.img-crop:first'); var $img = $crop.find('img:first, .svg_container'); var img_position = $img.length > 0 ? $img.position() : {top: 0, left: 0}; var size_img_ext = { "crop_w": 0, "crop_h": 0, "offset_top": 0, "offset_left": 0, "prod_w": 0, "prod_h": 0 }; fileExt = ''; if ($img.attr('src')) { fileExt = $img.attr("src").split('.').pop(); } if (adapterManager.isEditor()) { pages_editor.setZoomImgExt($block.attr('id'), $img); } if (typeof (data['crop_w']) != "undefined") { size_img_ext.crop_w = data['crop_w']; } else { size_img_ext.crop_w = $crop.width(); } if (typeof (data['crop_h']) != "undefined") { size_img_ext.crop_h = data['crop_h']; } else { size_img_ext.crop_h = $crop.height(); } if (typeof (data['offset_top']) != "undefined") { size_img_ext.offset_top = data['offset_top']; } else { size_img_ext.offset_top = img_position.top; } if (typeof (data['offset_left']) != "undefined") { size_img_ext.offset_left = data['offset_left']; } else { size_img_ext.offset_left = img_position.left; } if (typeof (data['prod_w']) != "undefined") { size_img_ext.prod_w = data['prod_w']; } else { size_img_ext.prod_w = $img.width(); } if (typeof (data['prod_h']) != "undefined") { size_img_ext.prod_h = data['prod_h']; } else { size_img_ext.prod_h = $img.height(); } var blockWidth = $block.width(); var mobileCropWidth = size_img_ext.crop_w < blockWidth ? size_img_ext.crop_w : blockWidth; var mobileCropHeight = size_img_ext.crop_h; // Если картинка квадратная или круглая if (size_img_ext.crop_w === size_img_ext.crop_h) { mobileCropHeight = mobileCropWidth; } $crop.attr('crop_w', size_img_ext.crop_w).attr('crop_h', size_img_ext.crop_h).css({ width: adapterManager.isPC() ? size_img_ext.crop_w : mobileCropWidth, height: adapterManager.isPC() ? size_img_ext.crop_h : mobileCropHeight, }); $img.attr('prod_w', size_img_ext.prod_w).attr('prod_h', size_img_ext.prod_h); $img.attr('offset_top', size_img_ext.offset_top).attr('offset_left', size_img_ext.offset_left); if ('svg' === fileExt) { //свг не должна задаваться фиксированной шириной $img.css({ width: '100%' }); } else { $img.css({ width: size_img_ext.prod_w, top: size_img_ext.offset_top, left: size_img_ext.offset_left }); } if (typeof (data['align']) != "undefined") { $blk_image_data_wrap = $block.find('.blk_image_data_wrap:first'); $blk_image_data_wrap.removeClass('l_text').removeClass('c_text').removeClass('r_text').addClass(data['align']); } break; case 'blk_yandex_map': var $yandex_map_wrap = $block.find('.yandex_map_wrap:first'); var $blk_yandex_map_data_wrap = $block.find('.blk_yandex_map_data_wrap:first'); var css_yandex_map_wrap = {}; if (typeof (data['width']) != "undefined") { css_yandex_map_wrap['width'] = data['width']; $blk_yandex_map_data_wrap.attr('data-width', data['width']); } if (typeof (data['height']) != "undefined") { css_yandex_map_wrap['height'] = data['height']; $blk_yandex_map_data_wrap.attr('data-height', data['height']); } if (adapterManager.isEditor()) { $yandex_map_wrap.css(css_yandex_map_wrap); } var blockId = $block.attr('id'); var lat = $blk_yandex_map_data_wrap.attr('data-map-latitude'); var lon = $blk_yandex_map_data_wrap.attr('data-map-longitude'); yandexMaps.reInitMap(blockId, lat, lon); break; case 'blk_text': if (!adapterManager.isEditor()) { break; } var $blk_data = $block.children('.blk-data'); if ($blk_data.length > 1) { $blk_data = $blk_data.filter('.' + adapterManager.type + '--blk-data:first'); } var blockDataCss = {}; var fontSize = ''; var textAlign = ''; var lineHeight = 'normal'; var letterSpacing = '0px'; if (isset(data['body'])) { $blk_data.html(data['body']); } if (!adapterManager.isPC()) { fontSize = parseInt($blk_data.css('font-size')); textAlign = $blk_data.css('text-align'); lineHeight = $blk_data.get(0).style.lineHeight; letterSpacing = $blk_data.get(0).style.letterSpacing; } var isAbsoluteBlock = hybridManager.isAbsoluteBlock($block); if (!isAbsoluteBlock) { // Отступы текстового блока применяются только в обычной секции if (isset(data['padding_top'])) { blockDataCss['padding-top'] = data['padding_top']; } if (isset(data['padding_bottom'])) { blockDataCss['padding-bottom'] = data['padding_bottom']; } } blockDataCss['text-align'] = textAlign; if (isset(data['text_align'])) { blockDataCss['text-align'] = data['text_align']; } blockDataCss['font-size'] = fontSize; if (isset(data['font_size'])) { blockDataCss['font-size'] = data['font_size']; } const blockData = blockManager.getBlockData($block.attr('id')); const FONT_UNITS_MAP = ['px', '%']; const FONT_UNITS = { PX: 0, PERCENT: 1, }; let lineHeightUnits = data.line_height_units; if (lineHeightUnits == null || lineHeightUnits == undefined) { lineHeightUnits = blockData.line_height_units; } if (lineHeightUnits == null || lineHeightUnits == undefined) { lineHeightUnits = FONT_UNITS.PERCENT; } if (isPcData) { lineHeightUnits = blockData.line_height_units; if (lineHeightUnits == null || lineHeightUnits == undefined) { lineHeightUnits = FONT_UNITS.PERCENT; } } const lineHeightUnitsValue = FONT_UNITS_MAP[lineHeightUnits]; blockDataCss['line-height'] = lineHeight; if (data['line_height'] != null) { blockDataCss['line-height'] = data['line_height'] + lineHeightUnitsValue; } blockDataCss['letter-spacing'] = letterSpacing; if (data['letter_spacing'] != null) { blockDataCss['letter-spacing'] = data['letter_spacing'] + 'px'; } $blk_data.css(blockDataCss); break; case 'blk_divider': if (typeof (data['blc_height']) != "undefined" && adapterManager.isEditor()) { $block.find('.blk_divider_self:first').css('height', data['blc_height']); } break; case 'blk_button': case 'blk_button_popup': if (typeof (data['align']) != "undefined") { var $blk_button_data_wrap = $block.find('.blk_button_data_wrap:first'); $blk_button_data_wrap.removeClass('l_text').removeClass('c_text').removeClass('r_text').addClass(data['align']); } break; } }; this.updateCells = function ($container, row) { var add_filter = ""; if (typeof (row) != "undefined") { add_filter = "[row=" + row + "]"; } var version = $container.hasClass('v3') ? 3 : 2; var clsCell = version == 3 ? '.td_container_cell' : '.cell.container_cell'; if (0 != $container.length) { var $cells = $container.find(".blk_container_cells:first>" + clsCell + add_filter); var attr_row = 0; var $cell = $(); var $resizer = $(); $cells.each(function () { $cell = $(this); attr_row = parseInt($cell.attr('row')); }); $cells.each(function () { $cell = $(this); var cell_id = $cell.attr(version == 3 ? 'cell_id' : 'id'); $resizer = $("#cell-resizer-" + cell_id); if (0 != $resizer.length) { var cell_margin_horizontal = $resizer.attr('margin_horizontal'); $resizer.css({ "height": 40, "left": $cell.position().left + parseInt($cell.css('width')) + Math.floor(cell_margin_horizontal / 2) + parseInt(cell_margin_horizontal) }); } }); } }; /** * Выполняется в редакторе, предпросмотре и опубликованном * * @param {String} type */ this.getSettings = function (type) { var object = {}; switch (type) { case adapterManager.ADAPTABILITY_TYPE_PC: object = { 'min_width': adapterManager.site_width, 'width': adapterManager.site_width, 'popup_section_inner': false, // == adapterManager.site_width 'form_popover_width': 400, 'window_popover_width': 500, 'cell_margin_horizontal': false, 'default_count_cell_in_row': 1 }; break; case adapterManager.ADAPTABILITY_TYPE_TABLET: object = { 'min_width': adapterManager.DEVICE_TABLET_CONTENT_MIN_WIDTH, 'width': adapterManager.DEVICE_TABLET_CONTENT_MIN_WIDTH, 'popup_section_inner': adapterManager.DEVICE_TABLET_POPUP_MIN_WIDTH, 'form_popover_width': adapterManager.DEVICE_TABLET_POPUP_MIN_WIDTH, 'window_popover_width': 450, 'cell_margin_horizontal': 3, 'default_count_cell_in_row': 2 }; break; case adapterManager.ADAPTABILITY_TYPE_MOBILE: object = { 'min_width': adapterManager.DEVICE_MOBILE_CONTENT_MIN_WIDTH, 'width': adapterManager.DEVICE_MOBILE_CONTENT_MIN_WIDTH, 'popup_section_inner': adapterManager.DEVICE_MOBILE_POPUP_MIN_WIDTH, 'form_popover_width': adapterManager.DEVICE_MOBILE_POPUP_MIN_WIDTH, 'window_popover_width': 340, 'cell_margin_horizontal': 3, 'default_count_cell_in_row': 2, 'new_default_count_cell_in_row': 1 // для колонок, создаваемых после 24.12.19 }; break; case '': break; } return object; }; this.setCountColumn = function ($container, count_cell_in_row, manual) { if ($container.closest('.slick-cloned').length > 0) { return true; } $container.attr('count-cell-in-row', count_cell_in_row); var containerID = $container.attr('id'); var container_data_pc = adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][containerID]; if (adapterManager.isEditor()) { var block = blockManager.getBlock(containerID); block.data.countCellInRow = count_cell_in_row; } if (typeof (container_data_pc) == "undefined") { return; } var container_data = adapterManager.data[adapterManager.type][containerID]; var block_settings = adapterManager.getSettings(adapterManager.type); var cell_data = false; var prev_data = {}; var isV3 = $container.hasClass('v3'); var cellClass = isV3 ? '.td_container_cell' : '.cell.container_cell'; var $blkContainerCells = $container.find('.blk_container_cells:first'); var $cells = $blkContainerCells.children(cellClass); var w_container_cells = $container.width(); var w_container_cells_prev = container_data_pc.w_container_cells; var cell_margin_horizontal = typeof(container_data) == "undefined" || typeof (container_data.cell_margin_horizontal) == "undefined" ? block_settings.cell_margin_horizontal : container_data.cell_margin_horizontal; if (adapterManager.MARGIN_VERSION_NEW === window.marginVersion) { cell_margin_horizontal = 0; } var i = 0; var sum_width = 0; var cell_list = []; var temp_width_c = 0; var $cel = false; var row = 1; var control_sum = 0; var inSlider = $container.closest('.slide').length > 0; var p_1_px = 100 / w_container_cells; var p_1_px_prev = (100 / w_container_cells_prev).toFixed(3); var splitter_height = 0; //@todo поправить var cell_n = (inSlider && !manual) ? 2.8 : 0; $container.find('.row-splitter').remove(); $cells.each(function () { var $cell = $(this); if (adapterManager.isEditor()) { $cell.css({ 'padding-left': 0, 'padding-right': 0 }); } var cell_id = $cell.attr(isV3 ? 'cell_id' : 'id'); ++i; prev_data = adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][cell_id]; sum_width += parseFloat(prev_data.width); cell_list.push(cell_id); if (i % count_cell_in_row == 0 || i == $cells.length) { temp_width_c = (w_container_cells - cell_margin_horizontal * (cell_list.length + 1)); var sum_width_w = Math.floor(sum_width / p_1_px_prev); var fixed_prev_w = ""; if (!adapterManager.isPC()) { var $row_splitter = $('
'); $row_splitter.attr('owner-row', row); $cel = isV3 ? $blkContainerCells.children('.td_container_cell[cell_id=' + cell_list[0] + ']') : $('#' + cell_list[0]); if (isV3) { $row_splitter.css('display', 'table-row'); } $cel.before($row_splitter); } for (var j in cell_list) { $cel = isV3 ? $blkContainerCells.children('.td_container_cell[cell_id=' + cell_list[j] + ']') : $('#' + cell_list[j]); var temp_w = 0; cell_data = typeof (adapterManager.data[adapterManager.type][cell_list[j]]) == "undefined" ? false : adapterManager.data[adapterManager.type][cell_list[j]]; var cell_data_w = cell_data != false && typeof (cell_data.width) != "undefined" ? cell_data.width : false; prev_data = adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][cell_list[j]]; var temp_p = 0; if (cell_data_w == false) { var temp_ww = Math.floor((prev_data.width / p_1_px_prev)); temp_p = temp_ww * 100 / sum_width_w; temp_w = Math.round((temp_p - cell_n) / (100 / temp_width_c).toFixed(3)); fixed_prev_w = number_format((p_1_px * temp_w).toFixed(3), 3, '.'); } else { fixed_prev_w = cell_data_w; } if (adapterManager.isEditor()) { $cel.css({ "width": fixed_prev_w + "%", "margin-left": cell_margin_horizontal }); if (adapterManager.MARGIN_VERSION_NEW === window.marginVersion) { $cel.css({ "padding": "0px 10px" }); } } adapterManager.resetSizeImageExt($cel); processingBlockInCells($cel); $cel.attr('row', row); } adapterManager.updateCells($container, row); cell_list = []; sum_width = 0; control_sum = 0; ++row; splitter_height = 11; if (adapterManager.MARGIN_VERSION_NEW === window.marginVersion) { splitter_height = 20; } } }); adapterManager.setResizerPosition($cells, cell_margin_horizontal); }; // Корректирует отступ у ресайзера (в зависимости от вида) this.setResizerPosition = function ($cells, cell_margin_horizontal) { cell_margin_horizontal = cell_margin_horizontal || 0; var $resizerContainer = $cells.find('.blk-container__resize-inner').removeAttr('style'); if (!adapterManager.isPC()) { var resizerLeft = parseInt($resizerContainer.css('left'), 10); $resizerContainer.css('left', resizerLeft - (cell_margin_horizontal / 2).toFixed(0)); } }; this.resetSizeImageExt = function ($root) { var $list = $root.hasClass('blk_image_ext') ? $root : $root.find('.blk.blk_image_ext:not(.skip-adapt)'); if (typeof (adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC]) != "undefined") { $list.each(function () { var $block = $(this); var block_id = $block.attr('id'); var data = typeof (adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id]) == "undefined" ? {} : adapterManager.data[adapterManager.ADAPTABILITY_TYPE_PC][block_id]; adapterManager.setBlockData($block, data); }); } }; /** * Инициализация опубликованного сайта */ this.initView = function () { adapterManager.initFotorama(); }; /** * Инициализация ресайза сайта (выполняется на опубликованном сайте и предпросмотре) * @param {object} adaptiveSettings */ this.initResize = function (adaptiveSettings) { var onResize = function (ops) { if (!ops) { ops = {}; } var width = $(window).width(); var type = adapterManager.ADAPTABILITY_TYPE_PC; for (var adaptiveName in adaptiveSettings) { var adaptiveSetting = adaptiveSettings[adaptiveName]; if (width >= adaptiveSetting.min && width <= adaptiveSetting.max) { type = adaptiveSetting.name; } } if (adapterManager.type != type) { adapterManager.setVersion(type, ops); } }; $(window).resize(function () { clearTimeout(adapterManager.resizeTimer); adapterManager.resizeTimer = setTimeout(onResize, 100); }); FE.add('show_section_popup', function (e) { var ops = {}; if (isset(e.section_id)) { ops.$scopeBlocks = $("#" + e.section_id); ops.$scopeRoot = $("#popup_list"); } onResize(ops); adapterManager.setScopeRoot(adapterManager.getDefaultScopeRoot()); adapterManager.setScopeBlocks(adapterManager.getDefaultScopeBlocks()); }); onResize(); }; /** * Возвращает данные настроек адаптивности блока * * Выполняется в редакторе, предпросмотре и опубликованном * * @param {jQuery} $block */ this.getAdaptiveDataOfBlock = function ($block) { if (adapterManager.isEditor()) { return blockManager.getBlock($block.attr('id'), true).getAdaptiveDataFromHtml(); } var data = {}; var blkClass = $block.attr('blk_class'); if ('blk_image_ext' === blkClass) { blkClass = 'blk_image'; } switch (blkClass) { case 'blk_text': var $blkData = $block.find('.blk-data:first'); data.body = $blkData.html(); data.text_align = $blkData.css('text-align'); data.font_size = parseInt($blkData.css('font-size')); data.padding_top = parseInt($blkData.css('padding-top')); data.padding_bottom = parseInt($blkData.css('padding-bottom')); data.padding_left = parseInt($blkData.css('padding-left')); data.padding_right = parseInt($blkData.css('padding-right')); data.is_padding_split = 1; if (data.padding_top === data.padding_bottom && data.padding_top === data.padding_left && data.padding_left === data.padding_right ) { data.is_padding_split = 0; } break; case 'blk_image': data.prod_w = $block.find('.img_container img').css('width'); data.prod_h = $block.find('.img_container img').css('height'); var $imgWrap = $block.find('.blk_image_data_wrap:first'); if ($imgWrap.hasClass('l_text')) { data.align = 'l_text'; } else if ($imgWrap.hasClass('r_text')) { data.align = 'r_text'; } else if ($imgWrap.hasClass('c_text')) { data.align = 'c_text'; } break; case 'blk_image_ext': var $crop = $block.find('.img-crop:first'); var $img = $crop.find('img:first, .svg_container'); var img_position = $img.length > 0 ? $img.position() : {top: 0, left: 0}; var $wrap = $block.find('.blk_image_data_wrap:first'); data = { "crop_w": $crop.width(), "crop_h": $crop.height(), "offset_top": img_position.top, "offset_left": img_position.left, "prod_w": $img.width(), "prod_h": $img.height() }; if ($wrap.hasClass('l_text')) { data.align = 'l_text'; } else if ($wrap.hasClass('r_text')) { data.align = 'r_text'; } else if ($wrap.hasClass('c_text')) { data.align = 'c_text'; } break; case 'blk_button': case 'blk_button_popup': var $btnWrap = $block.find('.blk_button_data_wrap:first'); if ($btnWrap.hasClass('l_text')) { data.align = 'l_text'; } else if ($btnWrap.hasClass('r_text')) { data.align = 'r_text'; } else if ($btnWrap.hasClass('c_text')) { data.align = 'c_text'; } break; case 'blk_form': var $frmWrap = $block.find('.blk_form_wrap:first'); if ($frmWrap.hasClass('l_text')) { data.align = 'l_text'; } else if ($frmWrap.hasClass('r_text')) { data.align = 'r_text'; } else if ($frmWrap.hasClass('c_text')) { data.align = 'c_text'; } var width = $frmWrap.children('form:first').css('width'); data.width = (width === '100%') ? null : parseInt(width); break; case 'blk_video': var $iframe = $block.find('iframe:first'); data.width = $iframe.width(); data.height = $iframe.height(); break; case 'blk_yandex_map': var $mapWrap = $block.find('.yandex_map_wrap:first'); data.width = $mapWrap.width(); data.height = $mapWrap.height(); break; case 'blk_divider': data.blc_height = $block.find('.blk_divider_self:first').height(); break; } return data; }; /** * Выполняется в редакторе, предпросмотре и опубликованном */ this.initFotorama = function () { var runFotoramaBlock = function ($fotorama) { $fotorama .on('fotorama:load', function () { $(this).addClass('fotorama--is-ready'); }) .fotorama(); }; adapterManager.getScopeBlocks().find('.blk_slider_data_wrap > .fotorama, .blk-data > .fotorama').each(function () { var $fotorama = $(this); if (0 == $fotorama.find('.fotorama__wrap').length) { // Fotorama is NOT inited var $section = $fotorama.closest('.blk_section'); var sectionIndex = $section.index(); var isSectionPopup = $section.hasClass('section_popup'); var isAbsolute = $section.hasClass('is_absolute'); if (isAbsolute) { var height = $fotorama.closest('.blk.blk_slider').height(); $fotorama.attr('data-height', height); } // Запустить инициализацию слайдера сразу var runFotoramaImmediately = true; if ( (isSectionPopup || sectionIndex >= 2) && document.readyState !== "complete" && // Документ еще загружен, стадия onload не прошла !adapterManager.isEditor() ) { // В привью и готовом сайте загружаем сразу только слайдеры первых двух секций, // загрузку остальных слайдеров откладываем на этап onload runFotoramaImmediately = false; } if (runFotoramaImmediately) { runFotoramaBlock($fotorama); } else { FE.add('onload', function () { runFotoramaBlock($fotorama); }); } } else { // Fotorama is auto inited $fotorama.addClass('fotorama--is-ready'); } }); }; this.initInPreview = function () { adapterManager.initFotorama(); FE.add('show_section_popup', function (e) { var ops = {}; if (e.section_id) { ops.$scopeBlocks = $("#" + e.section_id); ops.$scopeRoot = $("#popup_list"); } adapterManager.setVersion(adapterManager.type, ops); }); }; /** * Выполняется в редакторе, предпросмотре и опубликованном */ this.initStates = function (states) { for (var typeName in states) { if (!states.hasOwnProperty(typeName)) continue; adapterManager.states[typeName] = states[typeName] ? 1 : 0; adapterManager.types.push(typeName); adapterManager.data_empty[typeName] = {}; } }; } function FAdapterSliderEditor() { this.$wnd_slider_empty = null; this.$wnd_slider = null; this.$wnd_slider_images = null; this.$block_fotorama = null; this.$block_data_encoded = null; this.$block_wrap = null; this.$block_loading = null; this.smart_block = null; } sliderEditorExtend(FAdapterSliderEditor); FE.runOnReady(function () { window.adapterManager = new AdapterManager(); window.adapterManager.ready(); }); })();