1/** 2 * @typedef {"desktop"|"mobile"} DeviceState 3 */ 4/** 5 * @typedef {Object} InitBannerItem 6 * @property {string} wrapperId 7 * @property {string} bannerUrl 8 * @property {boolean} isMobile 9 * @property {boolean} isLazyLoaded 10 * @property {function=} onLoad 11 */ 12/** 13 * @typedef {Object} CodeBannerItem 14 * @property {number|null} id 15 * @property {string} content 16 * @property {string|null} token 17 * @property {Array.<{src: string, [key: string]: string}>} libraryScripts 18 * @property {Object.<string,string>|null} headScript 19 */ 20/** 21 * @typedef {Object} ClickOnPlaceInfo 22 * @property {string} url 23 * @property {string} target 24 * @property {string} rel 25 * @property {string} bannerPlace 26 * @property {number} bannerId 27 */ 28jQuery(function ($) { 29 var $window = $(window); 30 /** @type {Map<string, true>} */ 31 var libraryScripts = new Map(); 32 /** @type {Map<string, true>} */ 33 var headScripts = new Map(); 34 /** @type {Map<string, function>} */ 35 var onBannersPlaceLoadedResolves = new Map(); 36 37 /** 38 * @returns {boolean} 39 * @private 40 */ 41 function _isMobile() { 42 return $window.width() <= 1024; 43 } 44 45 /** 46 * @param {string} wrapperId 47 * @param {number|null} bannerId 48 * @private 49 */ 50 function _updateActualBannerId(wrapperId, bannerId) { 51 var bannerElement = document.getElementById(wrapperId); 52 if (null !== bannerElement) { 53 if (null !== bannerId) { 54 bannerElement.dataset.bannerId = bannerId.toString(); 55 } else { 56 delete bannerElement.dataset.bannerId; 57 }
58 if (onBannersPlaceLoadedResolves.has(wrapperId)) { 59 onBannersPlaceLoadedResolves.get(wrapperId)(); 60 } 61 } 62 } 63 64 /** 65 * @param {string} wrapperId 66 * @param {CodeBannerItem[]} bannersInfo 67 * @private 68 */ 69 function _replaceWithCodeBanner(wrapperId, bannersInfo) { 70 var bannerElement = document.getElementById(wrapperId); 71 if (null === bannerElement) { 72 return; 73 } 74 if (0 === bannersInfo.length) { 75 _removeBannersPlaceWrapper(wrapperId); 76 return; 77 } 78 var anchor = bannerElement.querySelector("[data-banner-anchor]"); 79 if (null === anchor) { 80 return; 81 } 82 var scaledBox = bannerElement.querySelector("[data-scaled-box]"); 83 if (null !== scaledBox) { 84 scaledBox.removeAttribute("style"); 85 } 86 var isSingleBanner = 1 === bannersInfo.length; 87 var $container = $(anchor.parentElement).empty(); 88 if (!isSingleBanner) { 89 $container = $("<div>", {"class": "b-carousel"}) 90 .hide() 91 .appendTo($container); 92 } 93 bannersInfo.forEach(function (bannerInfo) { 94 bannerInfo.libraryScripts.forEach(function (script) { 95 if (libraryScripts.has(script.src)) { 96 return; 97 } 98 libraryScripts.set(script.src, true); 99 var scriptElement = document.createElement("script"); 100 scriptElement.type = "text/javascript"; 101 scriptElement.async = true; 102 Object.keys(script).forEach(function (key) { 103 scriptElement.setAttribute(key, script[key]); 104 }); 105 document.head.append(scriptElement); 106 }); 107 if (null !== bannerInfo.headScript) { 108 Object.keys(bannerInfo.headScript).forEach(function (scriptKey) { 109 if (headScripts.has(scriptKey)) { 110 return; 111 } 112 headScripts.set(scriptKey, true); 113 var scriptElement = document.createElement("script"); 114 scriptElement.textContent = bannerInfo.headScript[scriptKey]; 115 document.head.append(scriptElement); 116 }); 117 } 118 $container.append($.parseHTML(bannerInfo.content, true)); 119 }); 120 if (isSingleBanner) { 121 _updateActualBannerId(wrapperId, bannersInfo[0].id); 122 } else { 123 $container 124 .on("init", function () { 125 var $this = $(this); 126 var $activeSlide = $(".slick-active", $this); 127 var bannerId = $activeSlide.data("currentBannerId"); 128 _updateActualBannerId(wrapperId, undefined !== bannerId ? Number(bannerId) : null); 129 $this.show(); 130 }) 131 .slick({ 132 rows: false, 133 autoplay: true, 134 autoplaySpeed: 20000, 135 prevArrow: '<button type="button" class="slick-arrow slick-prev"><svg width="24" height="24"><use xlink:href="#svg-arrow-back"></use></svg></button>', 136 nextArrow: '<button type="button" class="slick-arrow slick-next"><svg width="24" height="24"><use xlink:href="#svg-arrow-next"></use></svg></button>', 137 infinite: true, 138 draggable: false, 139 dots: true, 140 fade: true, 141 pauseOnHover: false 142 }) 143 .on("afterChange", function (slick, currentSlide) { 144 var $activeSlide = $(".slick-active", currentSlide.$slider); 145 var bannerId = $activeSlide.data("currentBannerId"); 146 _updateActualBannerId(wrapperId, undefined !== bannerId ? Number(bannerId) : null); 147 var $iFrame = $activeSlide.find("iframe"); 148 if ($iFrame.length > 0) { 149 $iFrame[0].contentWindow.postMessage("startPlay", "*"); 150 } 151 }); 152 } 153 } 154 155 /** 156 * @param {string} wrapperId 157 * @private 158 */ 159 function _removeBannersPlaceWrapper(wrapperId) { 160 var bannerElement = document.getElementById(wrapperId); 161 if (null !== bannerElement) { 162 bannerElement.remove();
163 if (onBannersPlaceLoadedResolves.has(wrapperId)) { 164 onBannersPlaceLoadedResolves.get(wrapperId)(); 165 } 166 } 167 } 168 169 /** 170 * @param {ClickOnPlaceInfo} clickInfo 171 * @private 172 */ 173 function _clickOnBannersPlace(clickInfo) { 174 var element = document.createElement("a"); 175 element.href = clickInfo.url; 176 element.target = clickInfo.target; 177 if ("" !== clickInfo.rel) { 178 element.rel = clickInfo.rel; 179 } 180 if ("_blank" === element.target) { 181 if (undefined !== window.dataLayer) { 182 window.dataLayer.push({ 183 gaBannersPlace: clickInfo.bannerPlace, 184 gaBannerId: clickInfo.bannerId.toString(), 185 event: "clickOnBannersPlace" 186 }); 187 } 188 } else { 189 element.dataset.placeName = clickInfo.bannerPlace; 190 element.dataset.currentBannerId = clickInfo.bannerId.toString(); 191 element.style.display = "none"; 192 document.body.prepend(element); 193 } 194 element.click(); 195 } 196 197 /** 198 * @param {InitBannerItem[]} initQueue 199 * @constructor 200 */ 201 var CisBannersService = function (initQueue) { 202 /** @type {InitBannerItem[]} */ 203 this.desktopBanners = []; 204 /** @type {InitBannerItem[]} */ 205 this.mobileBanners = []; 206 /** @type {DeviceState} */ 207 this.actualDeviceState = undefined; 208 209 this._separateBannerItems(initQueue); 210 211 $window 212 .on("message", function (event) { 213 event = /** MessageEvent */ event.originalEvent; 214 if (event.data.type !== "cisBannersService") { 215 return; 216 } 217 switch (event.data.action) { 218 case "updateActualBannerId": 219 _updateActualBannerId(event.data.wrapperId, event.data.bannerId); 220 break; 221 case "replaceWithCodeBanner": 222 _replaceWithCodeBanner(event.data.wrapperId, event.data.bannersInfo); 223 break; 224 case "removeBannersPlaceWrapper": 225 _removeBannersPlaceWrapper(event.data.wrapperId); 226 break; 227 case "clickOnBannersPlace": 228 _clickOnBannersPlace({ 229 url: event.data.url, 230 target: event.data.target, 231 rel: event.data.rel, 232 bannerPlace: event.data.bannerPlace, 233 bannerId: event.data.bannerId 234 }); 235 break; 236 } 237 }) 238 .on("resize", (function () { 239 this._updateDeviceState(); 240 }).bind(this)); 241 242 this._updateDeviceState(); 243 }; 244 $.extend(CisBannersService.prototype, { 245 /** 246 * @param {InitBannerItem} item 247 */ 248 push: function (item) { 249 this._separateBannerItems([item]); 250 if ( 251 (item.isMobile && "mobile" === this.actualDeviceState) || 252 (!item.isMobile && "desktop" === this.actualDeviceState) 253 ) { 254 this._processBanners(this.actualDeviceState); 255 } 256 }, 257 /** 258 * @param {InitBannerItem[]} items 259 * @private 260 */ 261 _separateBannerItems: function (items) { 262 items.forEach(function (item) { 263 if (item.isMobile) { 264 this.mobileBanners.push(item); 265 } else { 266 this.desktopBanners.push(item); 267 } 268 }, this); 269 }, 270 /** 271 * @private 272 */ 273 _updateDeviceState: function () { 274 var state = _isMobile() ? "mobile" : "desktop"; 275 if (this.actualDeviceState !== state) { 276 this.actualDeviceState = state; 277 if ( 278 ("mobile" === state && this.mobileBanners.length > 0) || 279 ("desktop" === state && this.desktopBanners.length > 0) 280 ) { 281 this._processBanners(this.actualDeviceState); 282 } 283 } 284 }, 285 /** 286 * @param {DeviceState} type 287 * @private 288 */ 289 _processBanners: function (type) { 290 var banners = "mobile" === type ? this.mobileBanners : this.desktopBanners;
291 banners.forEach(function (item) { 292 var bannerElement = document.getElementById(item.wrapperId); 293 if (null !== bannerElement && !onBannersPlaceLoadedResolves.has(item.wrapperId)) { 294 var anchor = bannerElement.querySelector("[data-banner-anchor]"); 295 if (null !== anchor) { 296 var iFrame = document.createElement("iframe"); 297 iFrame.style.height = "100%"; 298 iFrame.style.width = "100%"; 299 iFrame.style.border = "none"; 300 iFrame.src = item.bannerUrl; 301 if (item.isLazyLoaded) { 302 iFrame.loading = "lazy"; 303 } 304 iFrame.dataset.bannerAnchor = ""; 305 iFrame.dataset.bannerPlaceholder = ""; 306 (new Promise(function (resolve) { 307 onBannersPlaceLoadedResolves.set(item.wrapperId, resolve); 308 })).then(function () { 309 onBannersPlaceLoadedResolves.delete(item.wrapperId); 310 delete iFrame.dataset.bannerPlaceholder; 311 if (undefined !== item.onLoad) { 312 item.onLoad.call(window); 313 } 314 }); 315 anchor.parentElement.replaceChild(iFrame, anchor); 316 } 317 } 318 }); 319 if ("mobile" === type) { 320 this.mobileBanners = []; 321 } else { 322 this.desktopBanners = []; 323 } 324 } 325 }); 326 327 window.cisBannersService = new CisBannersService(window.cisBannersService || []); 328});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.