PageSourceSearch

https://www.6262.com.ua/assets/a58aeeab/js/cisBannersService.js?v=1789825603

js 6262.com.ua collected 2026-10-02 10:50:21 UTC 12,397 bytes, 328 lines download raw bytes

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.