window.NextelTracking = {"googleSiteTrackId":"UA-103676552-1","siteId":134,"projectId":189,"needGoogleClientId":true,"roistatConnected":false,"dynamicTracking":true,"tactic":"LAST_CLICK","apiUrl":"cstat.nextel.com.ua:8444","removeElements":["c|*|ex-phone|*|"],"firstUrlFilter":[],"currentUrlFilter":[],"refererFilter":[],"blackUrlFilter":[]};

(function () {
    let googleClientId;
    let urlRequest;
    let referer;
    let roistatVisitId;
    let ip;
    const currentUrl = window.location.href;
    const ELEMENTS_DELIMITER = "|*|";

    //@formatter:off
    if (window.NextelTracking.needGoogleClientId){(function(){(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)};i[r].l=1*new Date();a=s.createElement(o);m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');ga('create',window.NextelTracking.googleSiteTrackId,'auto');if(window.ga){ga(function(tracker){googleClientId=tracker.get('clientId')})}})();}
    detectUrlAndReferer();
    function detectUrlAndReferer() {
        let refererKey = "referer-" + window.NextelTracking.siteId;
        let urlRequestKey = "url_request-" + window.NextelTracking.siteId;
        referer=readFromLocalStorage(refererKey);
        urlRequest=readFromLocalStorage(urlRequestKey);
        if (referer===null){saveToLocalStorage(refererKey,referer=getRefererFromBrowser())}
        if (urlRequest==null){saveToLocalStorage(urlRequestKey,urlRequest = getUrlFromBrowser())}
        if (window.NextelTracking.tactic==='LAST_CLICK'){
            let currentReferer = getRefererFromBrowser();
            let currentUrlRequest = getUrlFromBrowser();
            const newRefererNow = currentReferer !== null && referer !== currentReferer && !currentUrlRequest.includes(currentReferer);
            const newPaidAdvertising = urlRequest !== currentUrlRequest && isPaidAdvertising(currentUrlRequest);
            if (newRefererNow||newPaidAdvertising) {
                saveToLocalStorage(refererKey,referer=currentReferer);
                saveToLocalStorage(urlRequestKey,urlRequest=currentUrlRequest);
            }
        }
    }
    function isPaidAdvertising(url){return url.includes('gclid')||url.includes('fbclid')||url.includes('yclid')||url.includes('utm_')}
    function saveToLocalStorage(key,value){localStorage.setItem(key,value)}
    function readFromLocalStorage(key){return localStorage.getItem(key)}
    function getUrlFromBrowser(){return decodeURIComponent(window.location.href)}
    function get_browser_info() {var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];if (/trident/i.test(M[1])) {tem = /\brv[ :]+(\d+)/g.exec(ua) || [];return {name: 'IE ', version: (tem[1] || '')};}if (M[1] === 'Chrome') {tem = ua.match(/\bOPR\/(\d+)/);if (tem != null) {return {name: 'Opera', version: tem[1]};}}M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];if ((tem = ua.match(/version\/(\d+)/i)) != null) {M.splice(1, 1, tem[1]);}return {name: M[0], version: M[1]};}
    function get_browser_name() {if (navigator.userAgent.search(/YaBrowser/) > 0) {return 'Yandex';}if ((!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0) {return 'Opera';}if (typeof InstallTrigger !== 'undefined') {return 'Firefox';}if (Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0) {return 'Safari';}if (!!document.documentMode) {return 'Internet Explorer';}if (!(!!document.documentMode) && !!window.StyleMedia) {return 'Edge';}if (!!window.chrome && !!window.chrome.webstore) {return 'Chrome';}}
    function detectIp() {const x = new XMLHttpRequest();x.open("GET", 'https://api.ipify.org', true);x.onload = function () {ip = x.responseText;};x.send();}
    function getCookie(name){let value = "; " + document.cookie;let parts = value.split("; " + name + "=");if (parts.length === 2) return parts.pop().split(";").shift();}
    function waitUntilTrue(functionWithBoolean, limit, callback) {if (functionWithBoolean() && limit >= 0) {limit = limit - 100;setTimeout(function () {waitUntilTrue(functionWithBoolean, limit, callback)}, 100);} else {callback()}}
    function getRefererFromBrowser() {
        let referer = document.referrer;
        if (referer) {
            if (referer.indexOf("http://") === 0) {referer = referer.substring(7)}
            else if (referer.indexOf("https://") === 0){referer = referer.substring(8)}
            if (referer.includes('/')) {referer = referer.substring(0, referer.indexOf('/'))}
            if (referer.includes(':')) {referer = referer.substring(0, referer.lastIndexOf(':'))}
            if (referer.indexOf('www.') === 0) {referer = referer.substring(4)}
        }
        if (referer) {referer = referer.trim()}
        return referer ? referer : null;
    }

    detectIp();

    if (document.readyState !== "loading") start();
    else document.addEventListener("DOMContentLoaded", start);

    function start() {
        if (!isFiltersOk(urlRequest, referer)) {return}
        waitUntilTrue(function () {
            roistatVisitId = getCookie('roistat_visit');
            return (roistatVisitId === undefined && window.NextelTracking.roistatConnected)||(googleClientId === undefined && window.NextelTracking.dynamicTracking)||ip === undefined;}, 7000, startWs);
    }
    //@formatter:on

    let ws;
    let wsOpenCount = 0;
    let wsMessageCount = 0;
    let wsCloseCount = 0;
    let blockedClient = false;
    let completeUrl = "wss://" + window.NextelTracking.apiUrl + "/tracking/trackingWs/" + window.NextelTracking.projectId + "/" + window.NextelTracking.siteId;

    function startWs(reconnect) { // булеан вырубает проверку на наличие второго скрипта
        //@formatter:off
        try {if (ip.indexOf("77.111.") >= 0) {console.log("Nextel: opera vpn не поддерживается");return;}} catch (e) {}
        if (googleClientId === undefined && window.NextelTracking.dynamicTracking) {console.log("UniTalk: не получен googleId.");return;}
        //@formatter:on

        if (!reconnect && window.NextelWs) {
            console.log("UniTalk: обнаружен конфликт с другим calltracking. Возможно на странице подключено несколько скриптов.");
            window.NextelWsNeedClose = true;
            window.NextelWs.close();
            return;
        }
        ws = new WebSocket(completeUrl);
        window.NextelWs = ws;
        ws.sendObject = function (obj) {
            wsMessageCount++;
            this.send(JSON.stringify(obj))
        };
        ws.onopen = function () {
            console.log("UniTalk: Соединение установлено.");
            wsOpenCount++;
            let browserName = get_browser_name();
            if (browserName === undefined) {
                browserName = get_browser_info().name;
            }
            ws.sendObject({
                firstUrl: urlRequest.toLowerCase(),
                currentUrl: currentUrl.toLowerCase(),
                roistatVisitId: roistatVisitId,
                googleId: googleClientId,
                cdid: getCookie('cr_tracking_id'),
                facebookClientId: getCookie('_fbp'),
                ip: ip,
                referer: referer === 'null' ? null : referer,
                clientInfo: '|' + browserName + ' v' + get_browser_info().version + '|open=' + wsOpenCount + ' send=' + (wsMessageCount + 1) + ' close=' + wsCloseCount + '|block=' + blockedClient + " needClose=" + window.NextelWsNeedClose + '|'
            });
        };
        ws.onmessage = function (event) {
            let text = event.data;
            if (text === 'ping') {
                return;
            }
            let message = JSON.parse(text);

            console.log('UniTalk OK', message);
            onIncomingMessageFromSocket(message);
        };
        ws.onclose = function () {
            wsCloseCount++;
            if (wsCloseCount > 4) {
                console.log("UniTalk: соединение не стабильно. Завершение работы.");
                return;
            }

            if (!window.NextelWsNeedClose) {
                let delay = 5000 * wsCloseCount;
                console.log("UniTalk: соединение прервалось. Повторная попытка через " + (delay / 1000) + " секунд..");
                setTimeout(function () {
                    startWs(true)
                }, (delay));
            }
        };
    }


    function onIncomingMessageFromSocket(message) {
        if (message.error != null) {
            console.log(message.error)
        } else {
            let phonesAndSettings = message.phonesAndSettings;
            if (phonesAndSettings != null) {
                hideAllNecessaryBlocksWithPhoneNumbers();
                showNumbersOnPage(phonesAndSettings);

            } else {
                console.log("UniTalk: прекращение работы. Код 404");
                closeWs();
                return;
            }
            let classesToHide = message.classesToHide;

            if (classesToHide != null) {
                hideClasses(classesToHide);
            }
        }
        if (message.blocked) {
            console.log("UniTalk: прекращение работы. Код 403");
            blockedClient = true;
            closeWs();
        }
    }

    function closeWs() {
        window.NextelWsNeedClose = true;
        ws.close();
    }

    function showNumbersOnPage(phonesAndSettings) {
        let allElements = {};

        //сначала ищем все элементы
        for (let phone in phonesAndSettings) {
            if (phonesAndSettings.hasOwnProperty(phone)) {
                let settings = phonesAndSettings[phone];

                for (let j = 0; j < settings.length; j++) {
                    let element = settings[j].element;
                    allElements[element] = getElementsByIdentifier(element);
                }
            }
        }

        //и только когда нашли все элементы на странице - начинаем их изменять
        for (let phone in phonesAndSettings) {
            if (phonesAndSettings.hasOwnProperty(phone)) {
                let settings = phonesAndSettings[phone];

                for (let j = 0; j < settings.length; j++) {
                    let sett = settings[j];
                    const removeParts = sett.element.split(ELEMENTS_DELIMITER);
                    const type = removeParts[0];
                    const value = removeParts[1];

                    const elements = allElements[sett.element];

                    for (let i = 0; i < elements.length; ++i) {
                        let element = elements[i];
                        if (element.style.display === 'none') {
                            element.style.display = null;
                        }
                        let convertedContent = convertPhone(phone, sett);
                        if (type === 'p') { // частичная замена текста
                            element.innerHTML = element.innerHTML.replace(value, convertedContent);

                        } else {
                            element.innerHTML = convertedContent;
                        }
                    }
                }
            }
        }
    }

    function getElementsByIdentifier(identifier) {
        if (identifier == null) {
            return [];
        }

        const removeParts = identifier.split(ELEMENTS_DELIMITER);
        const type = removeParts[0];
        const value = removeParts[1];

        if (type === 'c') { //класс
            return document.getElementsByClassName(value);

        } else if (type === 'x') { //xPath
            let elementByXpath = getElementByXpath(value);

            if (elementByXpath != null) {
                return new Array(elementByXpath);
            } else {
                return [];
            }

        } else if (type === 'i') { //id
            let elementById = document.getElementById(value);

            if (elementById != null) {
                return new Array(elementById);
            } else {
                return [];
            }

        } else if (type === 't') { //поиск по тексту (полное совпадение)
            let allElementsInBody = document.getElementsByTagName("*");

            let elementsByText = [];

            for (let i = 0; i < allElementsInBody.length; i++) {
                let elem = allElementsInBody[i];

                if (elem.innerHTML === value) {
                    elementsByText.push(elem);
                }
            }

            return elementsByText;

        } else if (type === 's') { //css селектор
            try {
                return document.querySelectorAll(value);
            } catch (e) {
                console.log('UniTalk: css селектор "' + value + '" неправильный. Проверьте, пожалуйста настройки.')
            }

        } else if (type === 'p') { //замена текста
            return getElementsByTextContain(value);

        } else { //неизвестный тип
            console.log('UniTalk: неизвестный тип идентификатора: ' + identifier);
            return [];
        }
    }

    function hideClasses(classesToHide) {
        for (let j = 0; j < classesToHide.length; j++) {
            const elements = getElementsByIdentifier(classesToHide[j]);

            for (let i = 0; i < elements.length; ++i) {
                elements[i].style.display = 'none'
            }
        }
    }

    function hideAllNecessaryBlocksWithPhoneNumbers() {
        for (let j = 0; j < window.NextelTracking.removeElements.length; j++) {
            let identifier = window.NextelTracking.removeElements[j];
            const elements = getElementsByIdentifier(identifier);

            for (let i = 0; i < elements.length; ++i) {
                elements[i].style.display = 'none';
            }
        }
    }

    function isFiltersOk(url, referer) {
        url = url.toLowerCase();
        let firstUrlFilterOk = isFilterOk(url, true, window.NextelTracking.firstUrlFilter);
        if (!firstUrlFilterOk) {
            console.log("UniTalk: first url filter fail: " + url);
        }
        let currentUrlFilterOk = isFilterOk(currentUrl, true, window.NextelTracking.currentUrlFilter);
        if (!currentUrlFilterOk) {
            console.log("UniTalk: current url filter fail: " + currentUrl);
        }
        let refererFilterOk = isFilterOk(referer, true, window.NextelTracking.refererFilter);
        if (!refererFilterOk) {
            console.log("UniTalk: referer filter fail: " + referer);
        }
        let blackUrlFilterOk = isFilterOk(url, false, window.NextelTracking.blackUrlFilter);
        if (!blackUrlFilterOk) {
            console.log("UniTalk: black url filters fail: " + url);
        }
        return (firstUrlFilterOk && refererFilterOk && blackUrlFilterOk);
    }

    function isFilterOk(line, positive, filters) {
        if (line === null) {
            line = "";
        }

        if (filters == null || filters.length === 0) {
            return true;
        }

        let allFiltersIsEmpty = true;
        for (let i = 0; i < filters.length; i++) {
            if (filters[i] == null || filters[i].length > 0) {
                allFiltersIsEmpty = false;
            }
        }
        if (allFiltersIsEmpty) {
            return true;
        }

        for (let i = 0; i < filters.length; i++) {
            let currentFilters = filters[i];
            let allCurrentFiltersComplete = true;

            for (let j = 0; j < currentFilters.length; j++) {
                let filterItem = currentFilters[j];

                if (filterItem != null) {
                    if (filterItem.startsWith("+") && !line.includes(filterItem.substring(1))) {
                        allCurrentFiltersComplete = false;
                    }
                    if (filterItem.startsWith("-") && line.includes(filterItem.substring(1))) {
                        allCurrentFiltersComplete = false;
                    }

                    if (!filterItem.startsWith("+") && !filterItem.startsWith("-")) { //такого случиться не должно
                        console.log('Неверный элемент фильтра ' + filterItem);
                        allCurrentFiltersComplete = false;
                    }
                }
            }

            if (allCurrentFiltersComplete) {
                return positive;
            }
        }

        return !positive;
    }

    function convertPhone(phone, sett) {
        let pattern = sett.pattern;
        if (pattern == null) {
            pattern = "XX (XXX) XXX-XX-XX"
        }

        for (let i = phone.length - 1; i >= 0; i--) {
            pattern = replaceLastX(pattern, phone[i]);
        }

        if (sett.link) {
            return `<a href="tel:+${phone}">${pattern}</a>`;
        } else {
            return pattern;
        }
    }

    function replaceLastX(htmlPattern, digit) {
        let a = htmlPattern.split("");
        if (htmlPattern.lastIndexOf('X') !== -1) {
            for (let i = htmlPattern.lastIndexOf('X'); i < htmlPattern.lastIndexOf('X') + 1; i++) {
                if (i === htmlPattern.lastIndexOf('X')) {
                    a[i] = digit;
                } else {
                    delete a[i];
                }
            }
        }

        return a.join("");
    }

    function getElementByXpath(path) {
        return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    }

    function getElementsByTextContain(text) {
        let elementsWithText = [];
        if (document.body.innerHTML.indexOf(text) > -1) {
            elementsWithText.push(document.body)
        }

        findAllChildElementswithText(text);

        function findAllChildElementswithText(text) {
            let newElementsWasFounded = false;

            let newFoundedElements = [];

            for (let i = 0; i < elementsWithText.length; i++) {
                const previousParentElement = elementsWithText[i]; // предыдущий элемент который содержал искомый текст
                // теперь надо пройтись по его детях и найти кто из них содержит этот текст
                let children = previousParentElement.children;

                // теперь нужно обработать исключения, так как например скрипт находит сам себя.
                const filteredChildren = [];
                for (let j = 0; j < children.length; j++) {
                    const child = children[j];
                    if ('SCRIPT' !== child.tagName) {
                        filteredChildren.push(child)
                    }
                }
                children = filteredChildren;


                if (children.length === 0) { // у него нет детей. Записываем в массив родителя обратно.
                    newFoundedElements.push(previousParentElement);
                    continue
                }

                // теперь если хоть у одного ребёнка был найден текст - то родителя уже не поместим в массив
                let foundedChildWithText = false;
                for (let j = 0; j < children.length; j++) {
                    const childNode = children[j]; // по каждому ребёнку
                    if (childNode.innerHTML.indexOf(text) > -1) { // ребёнок содержит искомый текст
                        newElementsWasFounded = foundedChildWithText = true;
                        newFoundedElements.push(childNode);
                    }
                }
                if (!foundedChildWithText) { // если ни один из детей не содержит текст - то снова вставляем в массив родителя
                    newFoundedElements.push(previousParentElement)
                }
            }
            elementsWithText = newFoundedElements;

            // если новые элементы были найдены - то надо попробовать поискать глубже
            if (newElementsWasFounded) {
                findAllChildElementswithText(text)
            }
        }

        return elementsWithText;
    }
})();

window.NextelSettings = {"projectId":189,"siteId":134,"location":null,"b":[{"name":"конфигурация для всех пользователей","css":{"pos-top":"auto","pos-bot":"5%","pos-left":"auto","pos-right":"5%","scale-factor":"0.78","pulse-button-color":"#f01616","pulse-button-color-hover":"#f78800","mobile-bg-color":"#91ddf2","close-btn-color-hover":"#000000","phone-icon-color":"#fafafa","btn-text-color":"#ffffff","text-color":"#010105","bg-color":"255,255,255","bg-footer-left":"#00c8ff","bg-footer-right":"#b5f1f7","bg-color-opacity":"0.00","mob-pos-top":"9%","mob-pos-bot":"auto","mob-pos-left":"auto","mob-pos-right":"0%","pulse-animation":"nextel-c2c-pulse-hard","pulse-duration":"1s"},"settings":{"desktopMode":"popup","showButton":"show","showAfterScroll":"10","showAfterSec":"10","askName":"true","askEmail":"false","locale":"ru","timer":"30","textWorkTime":"Перезвоним бесплатно за 30 секунд!","textCallingNow":"Мы уже Вам звоним..","textNotWorkTime":"Выберите удобное для Вас время, и мы перезвоним","textCallButton":"Жду звонка","mask":"+38(___)___-__-__","textTomorrow":"Завтра","textErrorHappen":"Извините, произошла ошибка","nameInputFieldPlaceholder":"Имя","textWeWillCallYouAt":"Спасибо! Мы Вам позвоним %s","textPhone":"Ваш телефон","textWeWillCallSoon":"Спасибо! Мы Вам позвоним в ближайшее время","mobileAsLink":"","textToday":"Сегодня"},"firstUrlFilter":[],"currentUrlFilter":null,"refererFilter":[],"geoFilter":[],"geoPositive":false,"displayOpened":false,"mobileAnim":[{"name":"pulse-hard","duration":1.0,"interval":0.1,"count":1}],"desktopAnim":[{"name":"pulse-hard","duration":1.0,"interval":0.1,"count":1}]}],"apiUrl":"https://cstat.nextel.com.ua:8443","templateUrl":"https://my.unitalk.cloud","googleTrackId":"UA-103676552-1","listenEventsOfSpecifiedForms":false,"listenEventsOfAllForms":false,"dontPauseScript":false,"key":"8014ae01ee"};
let sc=document.createElement("script");sc.src ='https://my.unitalk.cloud/widget/widget.min.js';sc.charset='utf-8';document.head.appendChild(sc);

