PageSourceSearch

https://siticard.ru/local/templates/citicard/js/common.js?1788533964106742

js siticard.ru collected 2026-09-25 05:00:00 UTC 106,742 bytes, 2,280 lines download raw bytes

1"use strict";
2
3//remove
4(function () {
5    var arr = [window.Element, window.CharacterData, window.DocumentType];
6    var args = [];
7    arr.forEach(function (item) {
8        if (item) {
9            args.push(item.prototype);
10        }
11    });
12
13    (function (arr) {
14        arr.forEach(function (item) {
15            if (item.hasOwnProperty('remove')) {
16                return;
17            }
18
19            Object.defineProperty(item, 'remove', {
20                configurable: true,
21                enumerable: true,
22                writable: true,
23                value: function remove() {
24                    this.parentNode.removeChild(this);
25                }
26            });
27        });
28    })(args);
29})(); //includes
30
31if (!String.prototype.includes) {
32    String.prototype.includes = function (search, start) {
33        'use strict';
34
35        if (typeof start !== 'number') {
36            start = 0;
37        }
38
39        if (start + search.length > this.length) {
40            return false;
41        } else {
42            return this.indexOf(search, start) !== -1;
43        }
44    };
45} //foreach
46
47
48if (window.NodeList && !NodeList.prototype.forEach) {
49    NodeList.prototype.forEach = function (callback, thisArg) {
50        thisArg = thisArg || window;
51
52        for (var i = 0; i < this.length; i++) {
53            callback.call(thisArg, this[i], i, this);
54        }
55    };
56} //prepend
57
58
59(function (arr) {
60    arr.forEach(function (item) {
61        if (item.hasOwnProperty('prepend')) {
62            return;
63        }
64
65        Object.defineProperty(item, 'prepend', {
66            configurable: true,
67            enumerable: true,
68            writable: true,
69            value: function prepend() {
70                var argArr = Array.prototype.slice.call(arguments),
71                    docFrag = document.createDocumentFragment();
72                argArr.forEach(function (argItem) {
73                    var isNode = argItem instanceof Node;
74                    docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
75                });
76                this.insertBefore(docFrag, this.firstChild);
77            }
78        });
79    });
80})([Element.prototype, Document.prototype, DocumentFragment.prototype]); //entries
81
82
83if (!Object.entries) {
84    Object.entries = function (obj) {
85        var ownProps = Object.keys(obj),
86            i = ownProps.length,
87            resArray = new Array(i); // preallocate the Array
88
89        while (i--) {
90            resArray[i] = [ownProps[i], obj[ownProps[i]]];
91        }
92
93        return resArray;
94    };
95}
96"use strict";
97
98var extensionStep = "\n\t<form action=\"\" method=\"post\" id=\"form-extension-finish\" class=\"form-action\">\n\t\t<article class=\"text more-text\"><img src=\"/upload/iblock/5af/Nizhniy_Karta-SHkolnika_2.png\" alt=\"\" class=\"pic\" />\n\t\t\t<p> Для оформления дистанционной заявки на продления срока действия персональной транспортной карты студента / школьника, пожалуйста, прикрепите в форме, расположенной ниже, файл с изображением оборотной стороны карты студента / школьника, содержащей фотографию пользователя, а также изображение документа, подтверждающего обучение. Для студентов таким документом является студенческий билет с отметкой учебного заведения о переводе на следующий курс, а для школьника 9 - го или 10 - го класса – справка из школы.\n\t\t\t</p>\n\t\t\t<p>
98Файлы документов, указанных в форме, должны быть <b class=\"text-uppercase\">только в формате Jpeg</b> </p>\n\t\t</article>\n\t\t<div class=\"card-extension__file\">\n\t\t\t<p class=\"card-extension__file-name\"> Оборотная сторона карты\n\t\t\tстудента / школьника с фотографией\n\t\t\tпользователя</p>\n\t\t\t<div class=\"form-add\">\n\t\t\t\t<ul></ul> <label class=\"add-file\" for=\"scn_fld_374\"> <input type=\"file\" id=\"scn_fld_374\" class=\"required\"\n\t\t\t\t\t\tname=\"scn_fld_374\" accept=\"image/jpeg\">\n\t\t\t\t\t<p class=\"btn-add\"><span class=\"add-file__icon\"></span><span>Прикрепить документ</span></p>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"card-extension__file\">\n\t\t\t<p class=\"card-extension__file-name\"> Разворот студенческого билета /\n\t\t\t\tсправка из школы</p>\n\t\t\t<div class=\"form-add\">\n\t\t\t\t<ul></ul> <label class=\"add-file\" for=\"scn_fld_415\"> <input type=\"file\" id=\"scn_fld_415\" class=\"required\"\n\t\t\t\t\t\tname=\"scn_fld_415\" accept=\"image/jpeg\">\n\t\t\t\t\t<p class=\"btn-add\"><span class=\"add-file__icon\"></span><span>Прикрепить документ</span></p>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"card-extension__control\" >\n\t\t\t<button class=\"btn btn_size_l\">Завершить и отправить</button>\n\t\t</div>\n\t</form>\n";
99
100var extensionSuccess = "\n\t<div class=\"call-message\">\n\t\t<h4>\u0412\u0430\u0448 \u0437\u0430\u043F\u0440\u043E\u0441 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D</h4>\n\t\t<article class=\"text\">\n\t\t\t<p>\u0412\u044B \u043E\u0444\u043E\u0440\u043C\u0438\u043B\u0438 \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0440\u043E\u0434\u043B\u0435\u043D\u0438\u0435 \u0441\u0440\u043E\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u044B \u0441\u0442\u0443\u0434\u0435\u043D\u0442\u0430/\u0448\u043A\u043E\u043B\u044C\u043D\u0438\u043A\u0430 \u043D\u0430 \u043D\u0430\u0448\u0435\u043C \u0441\u0430\u0439\u0442\u0435 <a href=\"//siticard.ru\">www.siticard.ru</a></p>\n\t\t\t<p>\u0412\u0430\u0448\u0435 \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u043D\u044F\u0442\u043E \u0432 \u0440\u0430\u0431\u043E\u0442\u0443. \u041F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043F\u0440\u0435\u0434\u044A\u044F\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0443\u044E \u043F\u043E\u0447\u0442\u0443 \u0412\u0430\u043C \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0440\u043E\u0434\u043B\u0435\u043D\u0438\u044F.</p>\n\t\t\t<p>\u0421\u043F\u0430\u0441\u0438\u0431\u043E, \u0447\u0442\u043E \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B\u0438\u0441\u044C \u0441\u0435\u0440\u0432\u0438\u0441\u043E\u043C \u043F\u0440\u043E\u0434\u043B\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442 \u0441\u0442\u0443\u0434\u0435\u043D\u0442\u0430/\u0448\u043A\u043E\u043B\u044C\u043D\u0438\u043A\u0430 \"\u0421\u0438\u0442\u0438\u043A\u0430\u0440\u0434\".</p>\n\t\t</article>\n\t\t<a href=\"/\" class=\"btn btn_size_xl\">\u043D\u0430 \u0413\u043B\u0430\u0432\u043D\u0443\u044E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443</a>\n\t</div>";
101
102const extendStepYO = '<form action="" method="post" id="form-extension-finish" class="form-action"><article class="text more-text"><p> Для оформления дистанционной заявки на продления срока действия персональной транспортной карты школьника/льготной карты, пожалуйста, прикрепите в форме, расположенной ниже, файл с изображением оборотной стороны транспортной карты школьника/льготной карты, содержащей фотографию пользователя, а также изображение док
102умента, подтверждающего обучение, льготу. Для школьников таким документом является– справка из школы, для льготников - справка из ГКУ РМЭ «Центр предоставления мер социальной поддержки населению в г. Йошкар-Ола Республики Марий Эл», подтверждающую льготу.</p><p>Файлы документов, указанных в форме, должны быть <b class="text-uppercase">только в формате Jpeg</b> </p><p>Размер каждого из файлов не должен превышать 1 Мб.</p></article><div class="card-extension__file"><p class="card-extension__file-name">Оборотная сторона транспортной карты школьника/льготной карты с фотографией пользователя</p><div class="form-add"><ul></ul> <label class="add-file" for="scn_fld_374"> <input type="file" id="scn_fld_374" class="required" name="scn_fld_374" accept="image/jpeg"><p class="btn-add"><span class="add-file__icon"></span><span>Прикрепить документ</span></p></label></div></div><div class="card-extension__file"><p class="card-extension__file-name"> Справка из школы / из органа соц. защита для льготников</p><div class="form-add"><ul></ul> <label class="add-file" for="scn_fld_415"> <input type="file" id="scn_fld_415" class="required" name="scn_fld_415" accept="image/jpeg"><p class="btn-add"><span class="add-file__icon"></span><span>Прикрепить документ</span></p></label></div></div><div class="card-extension__control"><button class="btn btn_size_l">Завершить и отправить</button></div></form>'
103
104const extensionSuccessYO = '<div class="call-message">		<h4>Ваш запрос обработан</h4>		<article class="text">			<p>Вы оформили заявление на продление срока действия персональной транспортной карты школьника/льготной карты, на нашем сайте <a href="//siticard.ru">www.siticard.ru</a></p>			<p>Ваше заявление принято в работу. После проверки предъявленных документов на электронную почту Вам будет отправлено сообщение о статусе операции продления.</p>			<p>Спасибо, что воспользовались сервисом продления карт студента/школьника "Ситикард".</p>		</article>		<a href="/" class="btn btn_size_xl">на Главную страницу</a>	</div>'
105//add-file
106
107$(document).on("change", ".add-file", function (e) {
108    var file = e.target.files;
109    if ($(this).parents('.register-card__step').length != 0) {
110        if (file[0].type == 'image/jpeg') {
111            $(this).parent('.form-add').find('ul').append("<li><span>".concat(file[0].name, "</span><button class=\"clear-form\">\u0423\u0434\u0430\u043B\u0438\u0442\u044C</button></li>"));
112            $(this).find('.btn-add').hide();
113        }
114    } else if ($(this).parents('.card-extension__file').length != 0) {
115        if (file[0].type == 'image/jpeg') {
116            $(this).parent('.form-add').find('ul').append("<li><span>".concat(file[0].name, "</span><button class=\"clear-form\">\u0423\u0434\u0430\u043B\u0438\u0442\u044C</button></li>"));
117            $(this).find('.btn-add').hide();
118        }
119    } else if ($(this).parents('.callback-service__box').length != 0) {
120        if (file[0].name.split(".").splice(-1, 1)[0] == 'xlsx') {
121            $(this).parent('.form-add').find('ul').append("<li><span>".concat(file[0].name, "</span><button class=\"clear-form\">\u0423\u0434\u0430\u043B\u0438\u0442\u044C</button></li>"));
122            $(this).find('.btn-add').hide();
123        }
124    } else {
125        if (e.target.files.length > 0) {
126            addFiles(e.target.files, $(this));
127            $(this).val(''); // Очищаем инпут для повторного выбора
128        }
129        if ($(this).parent('.form-add').find('ul li').length >= 3) {
130            $(this).find('.btn-add').hide();
131        }
132    }
133});
134
135let callbackData = new FormData();
136
137function renderFileList(element) {
138    const $fileList = $(element).parent('.form-add').find('ul');
139    $fileList.empty();
140
141    // Получаем все файлы из FormData
142    const files = callbackData.getAll('file');
143
144    files.forEach((file, index) => {
145        if (index < 3) {
146            const $fileItem = $(`
147          <li><span>${file.name}</span>
148            <button type="button" class="remove-btn" data-index="${index}">
149              Удалить
150            </button>
151          </li>
152        `);
153            // Обработчик кнопки удаления
154            $fileItem.find('.remove-btn').on('click', function () {
155                removeFile(index, element);
156            });
157            $fileList.append($fileItem);
158        }
159    });
160
161    // Показываем/скрываем список в зависимости от наличия файлов
162    $fileList.toggle(files.length > 0);
163    if ($(element).parent('.form-add').find('ul li').length < 3) {
164        $(element).parents('.form-add').find('.btn-add').show().find('span').not('.add-file__icon').text('Прикрепить документ');
165    }
166}
167
168function addFiles(files, th) {
169    [...files].forEach((file, index) => {
170        if (index < 3) {
171            callbackData.append('file', file);
172        }
173    })
174    renderFileList(th);
175}
176
177// Удаляет файл из FormData по индексу
178function removeFile(index, th) {
179    // Создаём новый FormData без удаляемого файла
180    const newFormData = new FormData();
181    const files = callbackData.getAll('file');
182
183    files.forEach((file, i) => {
184        if (i !== index) {
185            newFormData.append('file', file);
186        }
187    });
188
189    callbackData = newFormData;
190    renderFileList(th);
191}
192
193function removeAll() {
194    const newFormData = new FormData();
195    callbackData = newFormData;
196    $('.callbak .form-add').find('.btn-add').show().find('span').not('.add-file__icon').text('Прикрепить документ');
197    $('.callbak .form-add').find('.add-file input').val('');
198}
199
200
201$(document).on("click", ".clear-form", function (event) {
202    event.preventDefault();
203    $(this).parents('.form-add').find('.btn-add').show().find('span').not('.add-file__icon').text('Прикрепить документ');
204    $(this).parent('li').remove();
205    $(this).parents('.form-add').find('input').attr('value', '');
206});
207$('.services').ready(function () {
208    setTimeout(function () {
209        $('.service-frame__preload').hide();
210        $('.service-frame .services, .service-frame__content').css('opacity', '1');
211    }, 1000);
212    setTimeout(function () {
213        $('.service-frame__preload').remove();
214    }, 3000);
215});
216
217$(document).ready(function () {
218    $('.rate__result_auto').find('.rate__count').text($('[data-auto]').length);
219
220    $('.rate__result').each(function () {
221        var count = $(this).children().not('.rate__row_head, .rate__result_head').filter(function () {
222            return $(this).css('display') != 'none';
223        }).length;
224        var $resultHead = $(this).children('.rate__result_head');
225        var $count = $resultHead.find('.rate__count');
226
227        // Сохраняем разметку заголовка, если внутри предусмотрен счётчик.
228        if ($count.length) {
229            $count.text(count);
230        } else {
231            $resultHead.text(count);
232        }
233    });
234
235    $('input[name="fld_380"]').click(function (e) {
236        $(this).setCursorPosition(0);
237    }).mask('999 999 999');
238    $('input[name="fld_369"]').click(function (e) {
239        $(this).setCursorPosition(0);
240    }).mask('+7-999-999-99-99');
241    $('input[name="phone"]').click(function (e) {
242        $(this).setCursorPosition(0);
243    }).mask('+7(999) 999-99-99');
244    $('input[name="inn"]').click(function (e) {
245        $(this).setCursorPosition(0);
246    }).mask('99999999999');
247    $('input[name="date"], input[name="date_of_birth"]').blur(function () {
248        if (!nowDate(this.value.split('.').reverse().join('-'))) {
249            createError(this, 'Введите корректную дату');
250            $('#form-check button').attr('disabled', 'disabled');
251        } else {
252            $('#form-check button').removeAttr('disabled');
253        }
254    });
255    $('input[name="studdate"]').blur(function () {
256        if (this.value != '') {
257            if (!dateStud(this.value.split('.').reverse().join('-'))) {
258                $('.warning-box').fadeIn();
259                createError(this, 'Введите корректную дату');
260                $('#card-extension button').attr('disabled', 'disabled');
261            } else {
262                $('.warning-box').hide();
263                $('#card-extension button').removeAttr('disabled');
264            }
265        }
266    });
267    $('input[name="date_of_birth"]').datepicker({
268        maxDate: new Date()
269    });
270
271
272    $('input[name="num_doc"]').click(function (e) {
273        $(this).setCursorPosition(0);
274    }).mask('999999');
275    $('input[name="fld_368"]').click(function (e) {
276        $(this).setCursorPosition(0);
277    }).mask('999-999-999 99');
278    $('.field-check input').click(function (e) {
279        $(this).setCursorPosition(0);
280    }).mask('999999-99999999-999-9999');
281    $('[name=last_name], [name=first_name], [name=name], [name=second_name]').bind("change keyup input click", function () {
282        if (this.value.match(/[^а-яА-ЯёЁ\-\s]/g)) {
283            this.value = this.value.replace(/[^а-яА-ЯёЁ\-\s]/g, '');
284        }
285    });
286    $('[name=number]').bind("change keyup input click", function () {
287        if (this.value.match(/[^,0-9]/)) {
288            this.value = this.value.replace(/[^,0-9]/, '');
289        }
290    });
291    $('[name="emailcheck"]').blur(function () {
292        this.value = this.value.trim();
293    })
294    var emailType = true;
295    var pattern = /^[a-z0-9-_.]+@[a-z0-9-]+\.([a-z]{1,6}\.)?[a-z]{1,6}$/i;
296    $('input[type="email"], input[name="fld_424"], input[name="fld_483"]').blur(function () {
297        if (!this.value.match(pattern) && this.value != '') {
298            var formTooltip = document.createElement("span");
299            formTooltip.className = "error-tooltip";
300            formTooltip.textContent = "Пожалуйста, укажите правильный email";
301            formTooltip.style.opacity = "1";
302            formTooltip.style.transform = "scale(1)";
303            this.after(formTooltip);
304            this.classList.add('error');
305            emailType = false;
306        } else {
307            emailType = true;
308        }
309    });
310    $('[data-btn="send"]').click(function () {
311        var email = $('[name="fld_424"]').val();
312        email = email.replace(/ +/g, ' ').trim();
313        if (email) {
314            $(this).hide();
315            $(this).prev().css('width', '100%');
316            checkEmailsStatus = true;
317            $('[name="fld_424"]').removeClass('error')
318            $('[name="fld_424"]').next().remove();
319            sendToEmail(email)
320            $('.form-check-email.hidden').slideDown().removeClass('hidden');
321        } else {
322            var formTooltip = document.createElement("span");
323            formTooltip.className = "error-tooltip";
324            formTooltip.textContent = "Введите email";
325            formTooltip.style.opacity = "1";
326            formTooltip.style.transform = "scale(1)";
327            $('[name="fld_424"]').addClass('error').after(formTooltip);
328        }
329    });
330    $('[data-btn="check"]').click(function () {
331        if (checkEmail($('[name="fld_424"]').val(), $('[name="emailcheck"]').val()) == 1) {
332            $('[name="emailcheck"]').next() != null ? $('[name="emailcheck"]').next().remove() : '';
333            var formTooltip = document.createElement("span");
334            formTooltip.className = "success-code";
335            formTooltip.textContent = "Код верный";
336            $('[name="emailcheck"]').after(formTooltip);
337            $(this).prev().css('width', '100%');
338            $(this).hide();
339            $('#form-check button, #card-extension button, #card-readiness button').removeClass('disabled');
340        } else {
341            $('[name="emailcheck"]').next() != null ? $('[name="emailcheck"]').next().remove() : '';
342            var formTooltip = document.createElement("span");
343            formTooltip.className = "error-code";
344            formTooltip.textContent = "Код не верен";
345            $('[name="emailcheck"]').after(formTooltip);
346        }
347    });
348    // ресайз textaria
349    $(".form-field_textarea").autoResize(); //валидация формы
350    $('.form-submit').click(function (e) {
351        e.preventDefault();
352        var isValid = 0,
353            check = false;
354        var $form = $(this).parents('form');
355        var status = $form.find('.cap-error').attr('data-status');
356        var req = $form.find(".required").length;
357        $form.find(".required").each(function (index, elem) {
358            if (elem.value === "") {
359                if (!elem.nextElementSibling || !elem.nextElementSibling.classList.contains('error-tooltip')) {
360                    var formTooltip = document.createElement("span"),
361                        text = '';
362
363                    if (elem.previousElementSibling === null) {
364                        text = elem.selectedOptions[0].text.replace('Выберите ', '');
365                    } else {
366                        text = elem.previousElementSibling.textContent;
367                    }
368
369                    formTooltip.className = "error-tooltip";
370                    formTooltip.textContent = "Пожалуйста, укажите " + text.toLowerCase();
371                    formTooltip.style.opacity = "1";
372                    formTooltip.style.transform = "scale(1)";
373                    elem.after(formTooltip);
374                    elem.classList.add('error');
375                }
376            } else {
377                isValid++;
378            }
379        });
380        if (status == "false") {
381            $form.find('.cap-error').show();
382        }
383        if (!$form.find('.form-checkbox input').prop('checked')) {
384            !$form.find(".form-checkbox input").addClass('error');
385            check = false;
386        } else {
387            $(".form-checkbox input").removeClass("error");
388            check = true;
389        }
390        if (isValid === req && check != false && status == "true" && emailType == true) {
391            if ($('.callback').css('display') === 'none') {
392                setTimeout(function () {
393                    $(".popup").css("opacity", "1");
394                }, 300);
395                $('.callback').hide().removeClass('active');
396                $(".popup").css("display", "flex");
397                $("header").css("z-index", "99");
398                $(".success").slideDown();
399            } else {
400                $('.callback').hide().removeClass('active');
401                setTimeout(function () {
402                    $(".success").slideDown();
403                }, 300);
404            }
405            form_send(e, callbackData);
406            setTimeout(function () {
407                $form.find('.form-add').find('li').remove();
408                $form.find('.btn-add').show();
409                $form.find('input, textarea').not('[name="form_type"], [name="agree"], [name="x_page"]').val(null).trigger('blur');
410                $form.find('select').val(null).trigger('change');
411                $form.find('input').prop("checked", false);
412                callbackData = new FormData();
413            }, 2000);
414        }
415    }); //бегущий цифры
416    var target_block = $(".block-numb_event .block-numb__big");
417    var blockStatus = true;
418
419    if (target_block.length) {
420        $(window).scroll(function () {
421            var scrollEvent = $(window).scrollTop() > target_block.position().top - $(window).height();
422
423            if (scrollEvent && blockStatus) {
424                blockStatus = false;
425                var comma_separator_number_step = $.animateNumber.numberStepFactories.separator("");
426                $(".block-numb_event .block-numb__big").each(function () {
427                    var numb_end = $(this).text();
428                    $(this).animateNumber({
429                        number: numb_end,
430                        easing: "easeInQuad",
431                        numberStep: comma_separator_number_step
432                    }, 5000);
433                });
434            }
435        });
436    }
437
438    //select
439    var monthArr = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
440    var mountSelected = [];
441    var yaerSelected = [];
442    for (var index = 0; index < monthArr.length; index++) {
443        var el = {
444            id: monthArr[index],
445            text: monthArr[index],
446            selected: index == new Date().getMonth() ? true : false
447        }
448        mountSelected.push(el)
449    }
450    for (var index = 2017; index <= new Date().getFullYear(); index++) {
451        var el = {
452            id: index,
453            text: index,
454            selected: index == new Date().getFullYear() ? true : false
455        }
456        yaerSelected.push(el)
457    }
458    $(document).ready(function () {
459        $('select').select2({
460            selectOnClose: true,
461            minimumResultsForSearch: Infinity
462        });
463        $('select[name=month], select[name=month1], select[name=month2]').select2({
464            data: mountSelected,
465            minimumResultsForSearch: Infinity
466        })
467        $('select[name=year], select[name=year1], select[name=year2]').select2({
468            data: yaerSelected,
469            minimumResultsForSearch: Infinity
470        })
471    });
472
473    if (!localStorage.getItem('cookie')) {
474        $('.cookie').fadeIn();
475    }
476
477    $(".js-close-cookie").click(function () {
478        $('.cookie').fadeOut();
479        localStorage.setItem('cookie', true);
480    });
481
482    //попап временного ограничения
483    setTimeout(function () {
484        $('.warning-popup').fadeIn();
485    }, 2000)
486
487    $(".js-btn-close-warning").click(function () {
488        $('.warning-popup').fadeOut();
489    });
490});
491
492
493$.fn.setCursorPosition = function (pos) {
494    if ($(this).get(0).setSelectionRange) {
495        $(this).get(0).setSelectionRange(pos, pos);
496    } else if ($(this).get(0).createTextRange) {
497        var range = $(this).get(0).createTextRange();
498        range.collapse(true);
499        range.moveEnd('character', pos);
500        range.moveStart('character', pos);
501        range.select();
502    }
503};
504$(document).ready(function () {
505    $('.card-slider').slick({
506        dots: true,
507        slidesToShow: 4,
508        slidesToScroll: 1,
509        arrows: false,
510        autoplay: true,
511        autoplaySpeed: 2000,
512        responsive: [{
513            breakpoint: 1280,
514            settings: {
515                slidesToShow: 3
516            }
517        }, {
518            breakpoint: 1023,
519            settings: {
520                slidesToShow: 2,
521                centerMode: true,
522                variableWidth: true
523            }
524        }, {
525            breakpoint: 480,
526            settings: {
527                slidesToShow: 1,
528                centerMode: true,
529                variableWidth: true
530            }
531        }]
532    });
533    $('.question-slider__inner').slick({
534        dots: true,
535        speed: 300,
536        slidesToShow: 1,
537        slidesToScroll: 1,
538        arrows: false,
539        adaptiveHeight: true
540    });
541    $('.project-slider').slick({
542        dots: true,
543        speed: 300,
544        slidesToShow: 1,
545        slidesToScroll: 1,
546        arrows: false,
547        adaptiveHeight: false
548    });
549    $('.gratitude-slider').slick({
550        dots: true,
551        speed: 300,
552        slidesToShow: 1,
553        slidesToScroll: 1,
554        adaptiveHeight: false
555    });
556    accordion('.accordion');
557    //sidebarToContent();
558    copyImgToContent();
559    copyTegToContent();
560    heightBox();
561    mobileMenu();
562    mobileSidebar();
563    addMoreButtton();
564    initMobileSliderNews();
565    $(document).on('click', '.js-open-service', function () {
566        $(this).parents('.nameplate-table__text').next().slideToggle();
567    }).on('click', '.js-open-doc-sort', function () {
568        $(".sort-select").slideToggle();
569    }) //открытие мобильного меню
570        .on('click', '.open-menu', function () {
571            $(this).toggleClass('open');
572            $(".mobile-menu").slideToggle(500).toggleClass('hidden');
573            $('body').toggleClass('open');
574        }) // табы в мобильном меню
575        .on('click', '.rate__route', function () {
576            var $this = $(this);
577
578            if ($(this).find('.rate__content')[0]) {
579                if (!$(this).hasClass('active')) {
580                    $('.rate__route').removeClass('active').parent('.rate__row').css('padding-bottom', '0').find('.rate__content').attr('style', '');
581                    $(this).find('.rate__content').css({
582                        'transition': 'opacity .5s ease-in',
583                        'display': 'block'
584                    });
585                    var contentHeight = $(this).find('.rate__content')[0].scrollHeight;
586                    setTimeout(function () {
587                        $this.find('.rate__content').css('bottom', -contentHeight + 'px');
588                        $this.addClass('active').parent('.rate__row').css({
589                            'padding-bottom': contentHeight
590                        });
591                        $this.parent('.rate__row').find('.rate__price').eq(1).append('<i class="line"></>');
592                        $('.line').height(contentHeight);
593                    }, 100);
594                } else {
595                    $('.rate__route').removeClass('active').parent('.rate__row').css('padding-bottom', '0').find('.rate__content').attr('style', '');
596                    $('.line').remove();
597                    setTimeout(function () {
598                        $('.rate__route').find('.rate__content').attr('style', '');
599                    }, 100);
600                }
601            }
602        }).on('click', '.footer__title', function () {
603            var _this2 = this;
604
605            if (!$(this).hasClass('download') && window.innerWidth < 767) {
606                if (!$(this).hasClass('active')) {
607                    setTimeout(function () {
608                        $(".footer__title").removeClass("active");
609                    }, 500);
610                    $('.footer__links').slideUp();
611                    setTimeout(function () {
612                        $(_this2).addClass("active");
613                    }, 500);
614                    $(this).next().slideDown();
615                } else {
616                    setTimeout(function () {
617                        $(_this2).removeClass("active");
618                    }, 500);
619                    $(this).next().slideUp();
620                }
621            }
622        }) //anchor
623        .on("click", ".js-anchor", function (e) {
624            e.preventDefault();
625            var target = $(this).data('type') || this.hash;
626
627            if ($(this).hasClass('nav__link') && target != '') {
628                if (document.querySelector(target) != null && this.pathname == document.location.pathname) {
629                    $('.js-anchor').removeClass('active');
630                    $(this).addClass('active');
631                } else {
632                    document.location.href = this.href;
633                }
634            } else if (!$(this).hasClass('nav__link') && target != '') {
635                $("html, body").animate({
636                    scrollTop: $(target).offset().top - $(".header").height()
637                }, 1000);
638            } else {
639                document.location.href = this.href;
640            }
641
642            $("html, body").animate({
643                scrollTop: $(target).offset().top - $(".header").height()
644            }, 1000);
645        }).on("click", ".callback-service__btn", function (e) {
646            e.preventDefault();
647            var target = $(this).data('service');
648            $(this).addClass('active').siblings().removeClass('active');
649            $('.callback-service__box').hide().removeClass('active');
650            $(target).fadeIn().addClass('active');
651        }).on("click", ".callback-service__caption", function (e) {
652            if (window.innerWidth < 1023) {
653                if (!$(this).hasClass('open')) {
654                    $('.callback-service__fields').slideUp();
655                    $(this).next().slideDown();
656                    $(this).addClass('open');
657                } else {
658                    $(this).next().slideUp();
659                    $(this).removeClass('open');
660                }
661            }
662        }) //focus input
663        .on("focus", ".form-group_inner-top .form-field", function () {
664            $(this).prev().css({
665                'font-size': "12px",
666                'top': '-19px'
667            });
668
669            if ($(this).next()) {
670                $(this).next('.error-tooltip').remove();
671                $(this).removeClass('error');
672            }
673        }) // blur input
674        .on("blur", ".form-group_inner-top .form-field", function () {
675            if ($(this).val() == "") {
676                $(this).prev().attr("style", "");
677            }
678        }).on('click', '.select2', function () {
679            $(this).prev('.error-tooltip').remove();
680        })
681        .on('click', '.legal-anchor__btn', function (e) {
682            e.preventDefault();
683            var target = $(this).attr('href');
684            $("html, body").animate({
685                scrollTop: $(target).offset().top - $(".header").height()
686            }, 1000);
687        }); //открытие поиска
688    $('.anchor').click(function (e) {
689        e.preventDefault();
690        var hash = $(this).attr('href');
691        $('html, body').animate({
692            scrollTop: $(hash).offset().top - $(".header").height()
693        }, 1000);
694    })
695    var start;
696    $(window).click(function (e) {
697        if (!e.target.classList.contains('search-btn')) {
698            if ($(".search").has(e.target).length == 0 && start == 1) {
699                $('.search-btn').removeClass('active');
700                $(".search").slideUp();
701                start = null;
702            }
703        }
704    });
705    var top;
706    $(".search-btn").click(function () {
707        $(this).removeClass('open');
708        $(".mobile-menu").slideUp(500).removeClass('hidden');
709        $(this).toggleClass('active');
710        $('.search').slideToggle();
711        $('.search__field').focus();
712        start = 1;
713    });
714    $('.search__reset').click(function () {
715        $('.search__field').val('');
716        $(this).fadeOut();
717    });
718    $('.search__field').keypress(function () {
719        $('.search__reset').fadeIn();
720    }); //табы нас транице обратной связи
721
722    $('.callbak__btn').click(function () {
723        removeAll()
724        $(this).addClass('active').siblings().removeClass('active');
725        $('.callbak__box').hide().removeClass('active');
726        $('.callbak__box').eq($(this).index()).fadeIn().addClass('active');
727    });
728
729    $('.up').click(function () {
730        $('html, body').animate({
731            scrollTop: 0
732        });
733    });
734
735    $('.open-popup-info').click(function (e) {
736        $('[data-info="sber"]').fadeIn();
737    })
738    $('.popup-info__close, .js-close-modal').click(function () {
739        $('.popup-info').hide();
740    })
741
742    $('.callbak__box, .callback-service__box, [data-modal], .card-extension').each(function (inxex, item) {
743        smartCaptchaInit($(this).find('.smart-captcha').attr('id'));
744    });
745
746    $(window).click((e) => {
747        //popup-info close
748        if (e.target.classList.contains('popup-info') && e.target.style.display == 'block') {
749            $('.popup-info').hide();
750        }
751    });
752
753    $(window).load((e) => {
754        setTimeout(function () {
755            $('#close-balance').fadeIn();
756        }, 1000)
757        if (window.location.pathname == '/cost-of-travel-ticket/') {
758            $('[data-info="info"]').fadeIn();
759        }
760    });
761
762
763    $(window).on('scroll', function (e) {
764        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
765
766        if (scrollTop > document.documentElement.clientHeight / 2) {
767            $('.up').fadeIn();
768        } else {
769            $('.up').fadeOut();
770        }
771    });
772    var hash = location.hash;
773    location.hash = '';
774
775    if (hash[1] != undefined) {
776        $('.nav__link.js-anchor').each(function (index, elem) {
777            if (elem.hash === hash && elem.pathname == document.location.pathname) {
778                elem.classList.add('active');
779            }
780        });
781        $('html, body').animate({
782            scrollTop: $(hash).offset().top - $(".header").height()
783        }, 1000);
784    }
785    initMobileSlider('.info_index');
786    initMobileSlider('.list-boxes');
787    initMobileSlider('.rate-tabs__outer');
788});
789$(window).resize(function () {
790    accordion('.accordion');
791    //sidebarToContent();
792    copyImgToContent();
793    copyTegToContent();
794    heightBox();
795    mobileMenu();
796    initMobileSlider('.info_index');
797    initMobileSlider('.list-boxes');
798    initMobileSlider('.rate-tabs__outer');
799    addMoreButtton();
800    mobileSidebar();
801    initMobileSliderNews();
802
803    if (window.innerWidth > 1023) {
804        $('.callback-service__fields').removeAttr('style');
805    } else {
806        $('.callback-service__box').removeAttr('style');
807    }
808});
809
810if (document.querySelector(".release-step__form")) {
811    document.querySelector(".release-step__form").style.height = document.querySelector('.release-step__form').scrollHeight;
812}
813
814document.querySelectorAll('.js-next-step').forEach(function (elem) {
815    elem.addEventListener('click', function () {
816        var parent = elem.closest('.release-step');
817        parent.children[1].style.height = "0px";
818        setTimeout(function () {
819            parent.classList.remove('active');
820            parent.classList.add('visible');
821        }, 300);
822        parent.nextElementSibling.classList.add('active');
823        parent.nextElementSibling.children[1].style.height = parent.nextElementSibling.children[1].scrollHeight;
824    });
825});
826document.querySelectorAll('.release-step__edit').forEach(function (elem) {
827    elem.addEventListener('click', function () {
828        var parent = elem.closest('.release-step');
829        parent.children[1].style.height = parent.children[1].scrollHeight;
830        setTimeout(function () {
831            parent.classList.add('active');
832            parent.classList.remove('visible');
833        }, 300);
834        parent.nextElementSibling.classList.remove('active');
835        parent.nextElementSibling.children[1].style.height = '0px';
836    });
837}); //tabs-menu
838
839var topNav = document.querySelectorAll('a.nav-top__item');
840topNav.forEach(function (elem) {
841    if (elem.classList.contains('active')) {
842        showNav(elem.dataset);
843    }
844});
845
846
847
848function showNav(index) {
849    index = index.nav;
850    var nav = document.querySelectorAll('.nav');
851
852    if (nav[index] != undefined) {
853        nav.forEach(function (item) {
854            item.style.display = 'none';
855            item.classList.remove('active');
856        });
857        nav[index].style.display = 'block';
858        setTimeout(function () {
859            nav[index].classList.add('active');
860        }, 100);
861    }
862} //accordion
863
864
865function accordion(block) {
866    var accordion = document.querySelectorAll(block); // берем класс
867
868    accordion.forEach(function (elem) {
869        // находим все элементы
870        if (elem.style.height != elem.firstElementChild.clientHeight - 1 && !elem.classList.contains('active')) {
871            elem.style.height = elem.firstElementChild.clientHeight - 1 + 'px'; // каждому блоку устанавливаем высоту, равную шапке
872        }
873
874        elem.firstElementChild.onclick = function () {
875            // вешаем событие на клик по шапек блоке
876            if (!elem.classList.contains('active')) {
877                // проверяем родителя, есть ли у него класс active
878                for (var i = 0; i < accordion.length; i++) {
879                    // удаляем все классы active, чтобы закрыть все блоки
880                    accordion[i].style.height = accordion[i].firstElementChild.clientHeight - 1 + 'px';
881                    accordion[i].classList.remove('active');
882                }
883
884                this.parentElement.style.height = this.parentElement.scrollHeight + 'px'; // если нет класса, то устанавливаем высоту блока
885
886                this.parentElement.classList.add('active'); // добавляем ему класс active
887            } else {
888                this.parentElement.style.height = elem.firstElementChild.clientHeight + 'px'; // если есть, то ставим блоку высоту шапки
889
890                this.parentElement.classList.remove('active'); // удаляем ксласс active
891            }
892        };
893    });
894} //copy content sidebar in block content - mobile
895
896
897var sidebarCopyStatus = false;
898
899function sidebarToContent() {
900    if (window.innerWidth < 980 && sidebarCopyStatus == false) {
901        if ($('.sidebar .nameplate').length) {
902            var nameplate = document.createElement('div');
903            var nameplateBox = document.createElement('div');
904            nameplate.className = "nameplate-table";
905            nameplateBox.className = "nameplate-table__box";
906            nameplateBox.innerHTML = document.querySelector('.sidebar').innerHTML;
907            nameplate.innerHTML = '<p class="nameplate-table__text">Быстро пополнить карту или изменить тарифный план <br/> можно самостоятельно в разделе<button class="btn btn_size_s js-open-service"> Сервисы </button></p>';
908            nameplate.append(nameplateBox);
909            document.querySelector('.call-block').after(nameplate);
910            sidebarCopyStatus = true;
911        } else if ($('.sidebar .search-doc').length) {
912            var docsSort = document.createElement('div');
913            var docsSelect = document.createElement('div');
914            docsSort.className = "sort-table";
915            docsSelect.className = "sort-select";
916
917            for (var i = 1; i < document.querySelector('.search-doc').children.length; i++) {
918                docsSelect.innerHTML += document.querySelector('.search-doc').children[i].outerHTML;
919            }
920
921            docsSort.innerHTML = '<h3 >Поиск по документам</h3>' + document.querySelector('.search-doc').children[0].outerHTML + '<button class="btn btn_size_s js-open-doc-sort">Еще фильтры</button>';
922            docsSort.append(docsSelect);
923            document.querySelector('.docs').before(docsSort);
924            $(".select2, .select2-container").remove();
925            setTimeout(function () {
926                $("select").select2({
927                    minimumResultsForSearch: Infinity
928                });
929            }, 1);
930            sidebarCopyStatus = true;
931        }
932    } else if (window.innerWidth > 980) {
933        if (document.querySelector('.nameplate-table')) {
934            document.querySelector('.nameplate-table').remove();
935        } else if (document.querySelector('.sort-table')) {
936            document.querySelector('.sort-table').remove();
937            $(".select2, .select2-container").remove();
938            setTimeout(function () {
939                $("select").select2({
940                    minimumResultsForSearch: Infinity
941                });
942            }, 1);
943        }
944
945        sidebarCopyStatus = false;
946    }
947} //copy img to content- mobile
948
949
950
951var imgCopyStatus = false;
952
953function copyImgToContent() {
954    if (window.innerWidth < 1025 && imgCopyStatus == false) {
955        $('.content-with-pic').each(function () {
956            $(this).find('.content-with-pic__title').after($(this).find('.content-with-pic__img').clone());
957        });
958        imgCopyStatus = true;
959    } else if (window.innerWidth > 1025 && imgCopyStatus == true) {
960        $('.content-with-pic').each(function () {
961            $(this).find('.content-with-pic__title').next().remove();
962        });
963        imgCopyStatus = false;
964    }
965} //copy img to content- mobile
966
967
968var tagCopyStatus = false;
969
970function copyTegToContent() {
971    if (window.innerWidth < 980 && tagCopyStatus == false) {
972        if ($('.sidebar > .tag-box').length) {
973            $('.content').prepend($('.tag-box').clone());
974        }
975
976        tagCopyStatus = true;
977    } else if (window.innerWidth > 980 && tagCopyStatus == true) {
978        if ($('.content > .tag-box').length) {
979            $('.content').not('.content_full').find('.tag-box').remove();
980        }
981
982        tagCopyStatus = false;
983    }
984} //одинаковая высота блоков
985
986
987function heightBox() {
988    $('.card-all__cards').each(function () {
989        var highestBox = 0;
990        $('.card-all__cards .card-elem', this).each(function () {
991            $(this).height('auto');
992        });
993        $('.card-all__cards .card-elem', this).each(function () {
994            if ($(this).height() > highestBox) {
995                highestBox = $(this).height();
996            }
997        });
998        $('.card-all__cards .card-elem', this).height(highestBox);
999    });
1000} //clone menu for mobile
1001
1002
1003var saveMainMenu = document.querySelector(".header__holder");
1004
1005function mobileMenu() {
1006    var mMenu = document.createElement("div");
1007    var selectCity = document.createElement("div");
1008    var lkLink = document.createElement("div");
1009    var cloneMenu = document.querySelector(".nav-top__list").cloneNode(true);
1010
1011    if (window.innerWidth < 1023 && !document.querySelector('.mobile-menu')) {
1012        selectCity.className = 'mobile-select-city';
1013        selectCity.innerHTML = '<span>
1013 Ваш регион </span>';
1014        lkLink.className = 'mobile-lk';
1015        lkLink.innerHTML = '<a href="https://lk.siticard.ru/" target="_blank" class="btn btn_size_m">Личный кабинет</a>';
1016        selectCity.append(document.querySelector(".select-city").cloneNode(true));
1017        mMenu.className = 'mobile-menu hidden nav';
1018        mMenu.append(cloneMenu);
1019        mMenu.prepend(selectCity);
1020        document.querySelector(".header").after(mMenu);
1021        Array.from(document.querySelectorAll('.header__bottom .nav')).forEach(function (element, index) {
1022            if (document.querySelectorAll(".mobile-menu .nav-top__item")[index] != undefined) {
1023                document.querySelectorAll(".mobile-menu .nav-top__item")[index].append(element.children[0].cloneNode('true'));
1024            }
1025        });
1026        mMenu.append(lkLink);
1027        saveMainMenu.remove();
1028        return mMenu;
1029    } else if (document.querySelector('.mobile-menu') && !document.querySelector(".header__holder") && window.innerWidth > 1023) {
1030        document.querySelector('.mobile-menu').remove();
1031        document.querySelector(".header__pic").after(saveMainMenu);
1032        document.querySelector(".open-menu").classList.remove('open');
1033    }
1034} //tabs index
1035
1036
1037var tabsButton = document.querySelectorAll('.rate-tabs__but');
1038var tabsContent = document.querySelectorAll('.rate-tabs__content');
1039
1040if (tabsContent.length && window.innerWidth > 575 && !tabsContent[0].classList.contains('no-slide')) {
1041    var tabIndexNextStep = function tabIndexNextStep() {
1042        if (stepper < tabsContent.length) {
1043            tabsContent.forEach(function (elem) {
1044                elem.classList.remove('active');
1045                elem.style.display = 'none';
1046            });
1047            tabsButton.forEach(function (elem) {
1048                elem.classList.remove('active');
1049            });
1050            tabsButton[stepper].classList.add('active');
1051            tabsContent[stepper].style.display = 'block';
1052            tabsContent[stepper].classList.add('active');
1053            stepper++;
1054        } else {
1055            stepper = 0;
1056        }
1057
1058        return stepper;
1059    };
1060
1061    var reloadStep = function reloadStep(index) {
1062        stepper = index;
1063        clearInterval(tabIndexNextStep);
1064    };
1065
1066    tabsButton.forEach(function (elem, index) {
1067        elem.addEventListener('click', function () {
1068            for (var i = 0; i < tabsButton.length; i++) {
1069                tabsButton[i].classList.remove('active');
1070            }
1071
1072            this.classList.add('active');
1073            tabsContent.forEach(function () {
1074                for (var i = 0; i < tabsContent.length; i++) {
1075                    tabsContent[i].classList.remove('active');
1076                    tabsContent[i].style.display = 'none';
1077                }
1078
1079                tabsContent[index].style.display = 'block';
1080                setTimeout(function () {
1081                    tabsContent[index].classList.add('active');
1082                }, 500);
1083            });
1084            reloadStep(index);
1085        });
1086    });
1087    var step = setInterval(tabIndexNextStep, 8000);
1088    var stepper = 0;
1089}
1090
1091function initMobileSlider(block) {
1092    if ($(block).length == 1) {
1093        var elem = $(block);
1094        if (window.innerWidth < 575) {
1095            $(block).slick({
1096                dots: true,
1097                speed: 300,
1098                slidesToShow: 1,
1099                slidesToScroll: 1,
1100                arrows: false,
1101                centerMode: true,
1102                variableWidth: true
1103            });
1104        } else if (elem.hasClass('slick-initialized')) {
1105            elem.slick('unslick');
1106        }
1107    }
1108}
1109
1110function initMobileSliderNews() {
1111    if ($('.news-vertical_index').length) {
1112        var elem = $('.news-vertical_index');
1113
1114        if (window.innerWidth < 1280 && !elem.hasClass('slick-initialized')) {
1115            elem.slick({
1116                dots: true,
1117                speed: 300,
1118                slidesToShow: 1,
1119                slidesToScroll: 1,
1120                arrows: false,
1121                variableWidth: true,
1122                centerMode: true
1123            });
1124        } else if (window.innerWidth > 1280 && elem.hasClass('slick-initialized')) {
1125            elem.slick('unslick');
1126        }
1127    }
1128}
1129
1130function mobileSidebar() {
1131    if (document.querySelector('.sidebar_border')) {
1132        var sidebar = document.querySelector('.sidebar_border');
1133        var elem = document.createElement('div');
1134        var span = document.createElement('div');
1135        elem.className = 'button-open-sidebar';
1136        [].slice.call(sidebar.children).forEach(function (at) {
1137            if (at.classList.contains('active')) {
1138                elem.textContent = at.textContent;
1139            }
1140        });
1141        elem.append(span);
1142
1143        if (window.innerWidth < 1023 && !document.querySelector('.button-open-sidebar')) {
1144            sidebar.parentNode.insertBefore(elem, sidebar);
1145        } else if (window.innerWidth > 1023 && document.querySelector('.button-open-sidebar')) {
1146            document.querySelector('.button-open-sidebar').remove();
1147        }
1148        $('.button-open-sidebar').click(function () {
1149            $(this).next().slideDown();
1150        });
1151        setTimeout(function () {
1152            $(window).click(function (e) {
1153                if (!e.target.classList.contains('button-open-sidebar')) {
1154                    $('.button-open-sidebar').next().slideUp();
1155                }
1156            });
1157        }, 300)
1158    }
1159}
1160
1161function addMoreButtton() {
1162    var content = document.querySelector('.about-hold__content') || document.querySelector('.more-text');
1163    if (content) {
1164        var t2 = content.querySelector('h2') != null ? content.querySelector('h2').scrollHeight : 0;
1165        var text = content.querySelector('.text p') || content.querySelector('.list'),
1166            isOpen = false;
1167
1168
1169        if (window.innerWidth < 575 && !document.querySelector('.link-more')) {
1170
1171            var button = document.createElement('button');
1172            button.className = "link link-more";
1173            button.textContent = 'Подробнее';
1174            text.append(button);
1175            content.style.height = text.scrollHeight + t2 + "px";
1176            button.addEventListener('click', function () {
1177                if (isOpen == false) {
1178                    content.style.height = content.scrollHeight + 'px';
1179                    document.querySelectorAll('.link-more').forEach(function (elem) {
1180                        elem.remove();
1181                    });
1182                    isOpen = true;
1183                }
1184            });
1185        } else if (window.innerWidth > 575) {
1186            document.querySelectorAll('.link-more').forEach(function (elem) {
1187                elem.remove();
1188            });
1189            content.removeAttribute('style');
1190        }
1191    }
1192}
1193"use strict";
1194
1195$(document).ready(function () {
1196    if (localStorage.getItem('city') == null) {
1197        $('.popup-city').css("display", "flex");
1198        setTimeout(function () {
1199            $('.popup-city').css("opacity", "1");
1200        }, 500);
1201    } else {
1202        $('.select-city').text(localStorage.getItem('city'))
1203    }
1204    $('.popup-city-all__link').each(function (index, elem) {
1205        if (elem.innerText == localStorage.getItem('city')) {
1206            elem.classList.add('active');
1207            var inx = $(elem).parents('.popup-city-all__tab-box').index() - 1;
1208            var tbs = $(elem).parents('.popup-city-all__tabs').find('.popup-city-all__tabs-btn').eq(inx);
1209            tbs.trigger('click');
1210        }
1211    })
1212    //   if (sessionStorage.getItem('kzhno') == null && $('.popup-city-all__tabs-btn.active').text() == 'Нижегородская область') {
1213    //     if (window.location.pathname == '/' || window.location.pathname.includes('services')) {
1214    //       $('[data-info="kzhno"]').fadeIn();
1215    //       sessionStorage.setItem('kzhno', true)
1216    //     }
1217    //   }
1218});
1219$(document) //save city in popup
1220    .on('click', '.js-save-selected', function () {
1221        localStorage.setItem('city', $('.popup-city__title span').text());
1222        $('.popup-city').css("opacity", "0");
1223        setTimeout(function () {
1224            $('.popup-city').css("display", "none");
1225        }, 2000);
1226        $('.popup-city-all__link').each(function (index, elem) {
1227            if (elem.innerText == localStorage.getItem('city')) {
1228                elem.classList.add('active');
1229                var inx = $(elem).parents('.popup-city-all__tab-box').index() - 1;
1230                var tbs = $(elem).parents('.popup-city-all__tabs').find('.popup-city-all__tabs-btn').eq(inx);
1231                tbs.trigger('click');
1232            }
1233        })
1234    }) //open block top city
1235    .on('click', '.js-open-city', function () {
1236        $('.popup-city-all').slideDown();
1237        var right = window.innerWidth - document.body.clientWidth;
1238        $('.popup-city').css("opacity", "0");
1239
1240        setTimeout(function () {
1241            $('.popup-city').css("display", "none");
1242        }, 1000);
1243        $('main').css('width', window.innerWidth - right);
1244    }) //open popup callback
1245    .on('click', '.js-open-popup', function () {
1246        var modal = $(this).data('popup');
1247        if ($(this).is('.js-open-popup-name')) {
1248            $("[data-modal=\"".concat(modal, "\"]")).find('.callback__title').text($(this).text())
1249        }
1250        $("header").css("z-index", "99");
1251        setTimeout(function () {
1252            $(".popup").css("opacity", "1");
1253            $("[data-modal=\"".concat(modal, "\"]")).css("display", "block").addClass('active');
1254        }, 300);
1255        $(".popup").css("display", "flex");
1256    }) //tabs block top city
1257    .on('click', '.popup-city-all__tabs-btn', function () {
1258        var tabIndex = $(this).index();
1259        $('.popup-city-all__tabs-btn').removeClass('active');
1260        $('.popup-city-all__tab-box').hide().removeClass('active');
1261        $(this).addClass('active');
1262        $('.popup-city-all__tab-box').eq(tabIndex).fadeIn(400).addClass('active');
1263    }).on('click', '.popup', function (e) {
1264        if (e.target.className == 'popup') {
1265            //close success
1266            $(".success").fadeOut(); //close popup callback
1267
1268            $('.popup').css("opacity", "0");
1269            setTimeout(function () {
1270                $("header").attr("style", "");
1271                $('.popup').css("display", "none");
1272            }, 500);
1273            $('.callback').removeAttr('style').removeClass('active');
1274        }
1275    }) //button close modal
1276    .on('click', '.js-btn-close', function () {
1277        //close popup city
1278        $('.popup-city').css("opacity", "0");
1279        setTimeout(function () {
1280            $('.popup-city').css("display", "none");
1281        }, 1000); //close success
1282
1283        $(".success").fadeOut(); //close popup callback
1284
1285        $('.popup').css("opacity", "0");
1286        setTimeout(function () {
1287            $("header").attr("style", "");
1288            $('.popup').css("display", "none");
1289        }, 500);
1290        $('.callback').removeAttr('style');
1291    }) //close block top city
1292    .on('click', '.js-all-city-close', function () {
1293        $('.popup-city-all').slideUp();
1294        setTimeout(function () {
1295            $('body, main').attr('style', '');
1296        }, 300);
1297    }).on('click', function (e) {
1298        if ($('.popup-city-all').is(':visible')) {
1299            if (!e.target.classList.contains('js-open-city') && !e.target.classList.contains('popup-city-all__tabs-btn') && e.target.className != 'popup-city-all' && e.target.className != 'popup-city-all__col' && e.target.className != 'popup-city-all__tabs' && e.target.className != 'popup-city-all__head' && e.target.className != 'popup-city-all__tabs-head') {
1300                $('.popup-city-all').slideUp();
1301                setTimeout(function () {
1302                    $('body, main').attr('style', '');
1303                }, 300);
1304            }
1305        }
1306    }) //selected city
1307    .on('click', '.popup-city-all__link', function (e) {
1308        e.preventDefault();
1309        localStorage.setItem('city', $(this).text());
1310    });
1311"use strict";
1312
1313// $(document).on('click', '.js-type-transport', function () {
1314// 	var th = $(this);
1315// 	th.addClass('active').siblings().removeClass('active');
1316// 	var type = th.data('type');
1317// 	switch (type){
1318// 		case 'commercial':
1319// 			th.parents('.rate__row').next().hide();
1320// 			th.parents('.rate__row').next().next().hide();
1321// 			$('.rate__result').hide().removeClass('active');
1322// 			$('.rate__result').eq(th.index()).show().addClass('active');
1323// 			break;
1324// 		case 'municipal':
1325// 			th.parents('.rate__row').next().show();
1326// 			th.parents('.rate__row').next().next().show();
1327// 			$('.rate__result').hide().removeClass('active');
1328// 			$('.rate__result').eq((th.index())).show().addClass('active');
1329// 			break;
1330// 	}
1331// });
1332$(document).on('click', '.js-view-transport', function () {
1333    $('.rate-sign').remove();
1334
1335    if (!$(this).hasClass('active')) {
1336        $(this).addClass('active').siblings().removeClass('active');
1337        var filter = $(this).data('filter');
1338        $('.rate__result').children().each(function (index, elem) {
1339            if (elem.dataset.auto != undefined && elem.dataset.auto != filter) {
1340                $(this).hide();
1341            } else {
1342                $(this).show();
1343            }
1344        });
1345    } else {
1346        $(this).removeClass('active');
1347        $('.rate__result').children().each(function (index, elem) {
1348            $(this).show();
1349        });
1350    }
1351    $('.rate__sign-info').hide();
1352    $('[data-sign="' + filter + '"]').show();
1353    var count = 0;
1354    setTimeout(function () {
1355        $('.rate__result').children().not('.rate__row_head, .rate__result_head').each(function (i, e) {
1356            if ($(this).css('display') != 'none') {
1357                count++;
1358            }
1359
1360            $('.rate__count').text(count);
1361        });
1362
1363        if (count == 0) {
1364            $(".rate__result").after('<p class="rate-sign">Ничего не найдено</p>');
1365            $('.rate-sign').css('opacity', '1');
1366            $('.rate__count').text(count);
1367        }
1368    }, 100);
1369});
1370$(document).on('click', '.js-filter-button', function () {
1371    $('.rate-sign').remove();
1372
1373    if ($(this).is('[data-ticket]')) {
1374        // Билеты поддерживают множественный выбор, включая снятие
1375        // active с последнего выбранного билета.
1376        $(this).toggleClass('active');
1377    } else if ($(this).data('type')) {
1378        var isActiveType = $(this).hasClass('active');
1379
1380        $(this).toggleClass('active', !isActiveType);
1381        if (!isActiveType) {
1382            $(this).siblings().removeClass('active');
1383        }
1384
1385        if (!isActiveType && $(this).data('type') == 'GTK') {
1386            $('.rate__row_ticket').show(1, "", function () {
1387                $(this).css('display', 'flex');
1388            });
1389        } else {
1390            $('.rate__row_ticket').hide(1);
1391            $('.rate__row_ticket').find('.js-filter-button').removeClass('active');
1392        }
1393    } else {
1394        if (!$(this).hasClass('active')) {
1395            $(this).addClass('active');
1396        } else {
1397            $(this).removeClass('active');
1398        }
1399    }
1400
1401    setTimeout(function () {
1402        var arr = [];
1403        var obj = {
1404            type: '',
1405            auto: '',
1406            ticket: ''
1407        };
1408        $('.js-filter-button.active').each(function () {
1409            arr.push($(this).data());
1410        });
1411        $(arr).each(function (e, i) {
1412            obj.type += i.type != undefined ? i.type + ',' : '';
1413            obj.auto += i.auto != undefined ? i.auto + ',' : '';
1414            obj.ticket += i.ticket != undefined ? i.ticket + ',' : '';
1415        });
1416        $('.rate__result').children().not('.rate__row_head, .rate__result_head').each(function (index, elem) {
1417            var isType = false,
1418                isAuto = false,
1419                isTicket = false;
1420            var selectedType = obj.type.slice(0, -1);
1421            isType = selectedType === '' || String($(this).data('type')) === selectedType;
1422            var selectedTicketValue = obj.ticket.slice(0, -1);
1423            var rowTickets = String($(this).data('ticket') || '').split(',');
1424            var selectedTickets = selectedTicketValue ? selectedTicketValue.split(',') : [];
1425
1426            // Нет активных data-ticket — показываем строки с любым билетом.
1427            if (selectedTickets.length === 0) {
1428                isTicket = true;
1429            } else {
1430                for (var ticketIndex = 0; ticketIndex < rowTickets.length; ticketIndex++) {
1431                    if (selectedTickets.indexOf(rowTickets[ticketIndex]) !== -1) {
1432                        isTicket = true;
1433                        break;
1434                    }
1435                }
1436            }
1437            var a = $(this).data('auto').split(',');
1438            var selectedAutoValue = obj.auto.slice(0, -1);
1439            var b = selectedAutoValue ? selectedAutoValue.split(',') : [];
1440
1441            // Нет активных data-auto — показываем строки с любым значением.
1442            if (b.length === 0) {
1443                isAuto = true;
1444            } else {
1445                for (var i = 0; i < a.length; i++) {
1446                    for (var k = 0; k < b.length; k++) {
1447                        if (a[i] === b[k]) {
1448                            isAuto = true;
1449                            break;
1450                        }
1451                    }
1452                }
1453            }
1454
1455            if (isType == true && isAuto == true && isTicket == true) {
1456                $(this).show();
1457            } else {
1458                $(this).hide();
1459            }
1460        });
1461    }, 100);
1462    var count = 0;
1463    setTimeout(function () {
1464        $('.rate__result').children('.rate__row').not('.rate__row_head').each(function (i, e) {
1465            if ($(this).css('display') != 'none') {
1466                count++;
1467            }
1468
1469            $('.rate__count').text(count);
1470        });
1471
1472        if (count == 0) {
1473            $(".rate__result").after('<p class="rate-sign">Ничего не найдено</p>');
1474            $('.rate-sign').css('opacity', '1');
1475            $('.rate__count').text(count);
1476        }
1477    }, 100);
1478});
1479"use strict";
1480
1481function _classCallCheck(instance, Constructor) {
1482    if (!(instance instanceof Constructor)) {
1483        throw new TypeError("Cannot call a class as a function");
1484    }
1485}
1486
1487function _defineProperties(target, props) {
1488    for (var i = 0; i < props.length; i++) {
1489        var descriptor = props[i];
1490        descriptor.enumerable = descriptor.enumerable || false;
1491        descriptor.configurable = true;
1492        if ("value" in descriptor) descriptor.writable = true;
1493        Object.defineProperty(target, descriptor.key, descriptor);
1494    }
1495}
1496
1497function _createClass(Constructor, protoProps, staticProps) {
1498    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
1499    if (staticProps) _defineProperties(Constructor, staticProps);
1500    return Constructor;
1501}
1502
1503function createError(elem, mess) {
1504    mess = mess || "Поле обязательное для заполнения";
1505    var formTooltip = document.createElement("span");
1506    formTooltip.className = "error-tooltip";
1507    formTooltip.textContent = mess;
1508    formTooltip.style.opacity = "1";
1509    formTooltip.style.transform = "scale(1)";
1510    if (!elem.parentElement.querySelector('.error-tooltip')) {
1511        elem.after(formTooltip);
1512        elem.classList.add('error');
1513    }
1514}
1515
1516
1517function cardDateСheck(date, card) {
1518    var xhr = new XMLHttpRequest();
1519    if (document.querySelector('.card-extension-me')) {
1520        xhr.open('GET', '/include/studentcard/check-region.php?c=' + date + ';' + card + '&r=12', false);
1521    } else {
1522        xhr.open('GET', '/include/studentcard/check.php?c=' + date + ';' + card, false);
1523    }
1524    xhr.send();
1525
1526    if (xhr.status == 200 && xhr.readyState == 4) {
1527        return xhr.responseText == 1 ? true : false;
1528    }
1529}
1530
1531
1532
1533function sumSnils(snils) {
1534    var checkSum = snils[10] + snils[11];
1535    var sum = snils[0] * 9 + snils[1] * 8 + snils[2] * 7 + snils[3] * 6 + snils[4] * 5 + snils[5] * 4 + snils[6] * 3 + snils[7] * 2 + snils[8] * 1;
1536
1537    if (sum < 100 && sum == checkSum) {
1538        return true;
1539    } else if ((sum == 100 || sum == 101) && checkSum == 0) {
1540        return true;
1541    } else if (sum > 101 && (sum % 101 == checkSum || sum % 101 == 100 && checkSum == 0)) {
1542        return true;
1543    } else {
1544        return false;
1545    }
1546}
1547
1548
1549function check_current_age(date) {
1550    var spDate = date.split('.');
1551    var modifiedDare = spDate[2] + '-' + spDate[1] + '-' + spDate[0];
1552    return (new Date().getTime() - new Date(modifiedDare)) / (24 * 3600 * 365 * 1000) < 14;
1553}
1554
1555function nowDate(date) {
1556    return new Date().getTime() > new Date(date).getTime();
1557}
1558
1559function dateStud(date) {
1560    const startTime = new Date('2025-09-01');
1561    const endTime = new Date('2027-09-01');
1562    return startTime.getTime() <= new Date(date).getTime() && new Date(date).getTime() < endTime.getTime();
1563}
1564
1565
1566function sendToEmail(email) {
1567    var xhr = new XMLHttpRequest();
1568    xhr.open('POST', '/include/emg.php?email=' + email + $('[name="fld_424"]').data('code'), false);
1569    xhr.send();
1570
1571}
1572
1573function checkEmail(email, code) {
1574    var xhr = new XMLHttpRequest();
1575    xhr.open('POST', '/include/emc.php?email=' + email + '&code=' + code, false);
1576    xhr.send();
1577    if (xhr.status == 200 && xhr.readyState == 4) {
1578        return xhr.response;
1579    }
1580}
1581function getSchool() {
1582    var xhr = new XMLHttpRequest();
1583    xhr.open('POST', '/include/edu2_region.php?r=12', false);
1584    xhr.send();
1585    if (xhr.status == 200 && xhr.readyState == 4) {
1586        JSON.parse(xhr.response).map((item) => {
1587            var data = {
1588                id: item.CODE,
1589                text: item.NAME
1590            };
1591
1592            var newOption = new Option(data.text, data.id, false, false);
1593            $('.select-school').append(newOption).trigger('change');
1594        })
1595    }
1596}
1597
1598var checkEmailsStatus = null;
1599//card-extend
1600var extension = document.querySelector('#card-extension');
1601var formExtension = document.querySelector('#form-extension');
1602var warning = document.querySelector('.card-extension .warning');
1603var emailСheckExtension = document.querySelectorAll('.form-check-email');
1604var statusInput = 0;
1605var numberExtension = "";
1606var birthdayExtension = "";
1607var studDateExtension = "";
1608var studDateExtension = "";
1609var schoolClass = "";
1610var result_array = new FormData();
1611if (document.querySelector('#card-extension [name="fld_380"]')) {
1612    document.querySelector('#card-extension [name="fld_380"]').addEventListener('focus', function () {
1613        warning.style.opacity = 0;
1614    });
1615    document.querySelector('#card-extension [name="date_of_birth"]').addEventListener('focus', function () {
1616        warning.style.opacity = 0;
1617    });
1618}
1619if (document.querySelector('.card-extension-me') != undefined) {
1620    getSchool()
1621}
1622if (formExtension != null) {
1623    extension.querySelectorAll('input').forEach(function (elem) {
1624        return elem.addEventListener('blur', function (e) {
1625            warning.style.opacity = 0;
1626
1627            switch (elem.name) {
1628                case "fld_380":
1629                    numberExtension = elem.value.split(' ').join('');
1630                    break;
1631                case "date_of_birth":
1632                    birthdayExtension = elem.value;
1633                    break;
1634                case "studdate":
1635                    studDateExtension = elem.value;
1636                    break;
1637                case "class":
1638                    schoolClass = elem.value;
1639                    break;
1640            }
1641            if (document.querySelector('.card-extension-me') != undefined) {
1642                if (numberExtension != "" && birthdayExtension != "") {
1643                    if ($('[data-type-stud]').hasClass('active')) {
1644                        if (statusInput < 4 && cardDateСheck(birthdayExtension, numberExtension)) {
1645                            emailСheckExtension[0].classList.remove('hidden');
1646                        } else if (statusInput === 4) {
1647                            warning.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
1648                            extension.querySelectorAll('input').forEach(function (item) {
1649                                item.setAttribute('disabled', 'disabled');
1650                            });
1651                            warning.style.opacity = 1;
1652                            return false;
1653                        } else {
1654                            warning.style.opacity = 1;
1655                            statusInput++;
1656                        }
1657                    } else if ($('[data-type-school]').hasClass('active')) {
1658                        if (statusInput < 4 && cardDateСheck(birthdayExtension, numberExtension)) {
1659                            emailСheckExtension[0].classList.remove('hidden');
1660                        } else if (statusInput === 4) {
1661                            warning.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
1662                            extension.querySelectorAll('input').forEach(function (item) {
1663                                item.setAttribute('disabled', 'disabled');
1664                            });
1665                            warning.style.opacity = 1;
1666                            return false;
1667                        } else {
1668                            warning.style.opacity = 1;
1669                            statusInput++;
1670                        }
1671                    }
1672                }
1673            } else {
1674                if (numberExtension != "" && birthdayExtension != "") {
1675                    if ($('[data-type-stud]').hasClass('active') && studDateExtension != "") {
1676                        if (statusInput < 4 && cardDateСheck(birthdayExtension, numberExtension)) {
1677                            emailСheckExtension[0].classList.remove('hidden');
1678                        } else if (statusInput === 4) {
1679                            warning.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
1680                            extension.querySelectorAll('input').forEach(function (item) {
1681                                item.setAttribute('disabled', 'disabled');
1682                            });
1683                            warning.style.opacity = 1;
1684                            return false;
1685                        } else {
1686                            warning.style.opacity = 1;
1687                            statusInput++;
1688                        }
1689                    } else if ($('[data-type-school]').hasClass('active')) {
1690                        if (!check_current_age(birthdayExtension)) {
1691                            if (statusInput < 4 && cardDateСheck(birthdayExtension, numberExtension)) {
1692                                emailСheckExtension[0].classList.remove('hidden');
1693                            } else if (statusInput === 4) {
1694                                warning.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
1695                                extension.querySelectorAll('input').forEach(function (item) {
1696                                    item.setAttribute('disabled', 'disabled');
1697                                });
1698                                warning.style.opacity = 1;
1699                                return false;
1700                            } else {
1701                                warning.style.opacity = 1;
1702                                statusInput++;
1703                            }
1704                        } else if (document.querySelector('.select-school') == undefined) {
1705                            warning.innerHTML = "Внимание! <br/> Продление срока действия карты школьника необходимо только для учащихся 10 и 11 классов.";
1706                            warning.style.opacity = 1;
1707                        }
1708                    }
1709                }
1710            }
1711        });
1712    });
1713    formExtension.addEventListener('submit', function (e) {
1714        e.preventDefault();
1715        var fieldNumber = extension.querySelector('[name="fld_380"]');
1716        var fieldStudDate = extension.querySelector('[name="studdate"]');
1717        var fieldSchoolClass = extension.querySelector('[name="class"]');
1718        var fieldBirthday = extension.querySelector('[name="date_of_birth"]');
1719        var fieldEmail = extension.querySelector('[name="fld_424"]');
1720        var fieldCode = extension.querySelector('[name="emailcheck"]');
1721        var status = $('#form-extension').find('.cap-error').attr('data-status');
1722        if (extension.querySelector('.form-checkbox').querySelector('input').checked && !extension.querySelector('button').classList.contains('disabled') && status == "true") {
1723            if (checkEmailsStatus) {
1724                if (document.querySelector('.card-extension-me') != undefined) {
1725                    if ($('[data-type-stud]').hasClass('active')) {
1726                        extension.innerHTML = extendStepYO;
1727                        warning.remove();
1728                        $('.tbs-control').remove();
1729                        result_array.append('fld_380', fieldNumber.value);
1730                        result_array.append('date_of_birth', fieldBirthday.value);
1731                        result_array.append('fld_424', fieldEmail.value);
1732                        result_array.append('source', 'siticard_card_extend_portal');
1733                    } else if ($('[data-type-school]').hasClass('active')) {
1734                        extension.innerHTML = extendStepYO;
1735                        warning.remove();
1736                        $('.tbs-control').remove();
1737                        result_array.append('fld_380', fieldNumber.value);
1738                        result_array.append('date_of_birth', fieldBirthday.value);
1739                        result_array.append('fld_424', fieldEmail.value);
1740                        result_array.append('source', 'siticard_card_extend_portal');
1741                    }
1742                }
1743                else {
1744                    if ($('[data-type-stud]').hasClass('active') && dateStud(fieldStudDate.value.split('.').reverse().join('-'))) {
1745                        extension.innerHTML = extensionStep;
1746                        warning.remove();
1747                        $('.tbs-control').remove();
1748                        result_array.append('fld_380', fieldNumber.value);
1749                        result_array.append('date_of_birth', fieldBirthday.value);
1750                        result_array.append('fld_424', fieldEmail.value);
1751                        result_array.append('source', 'siticard_card_extend_portal');
1752                    } else if ($('[data-type-school]').hasClass('active')) {
1753                        extension.innerHTML = extensionStep;
1754                        warning.remove();
1755                        $('.tbs-control').remove();
1756                        result_array.append('fld_380', fieldNumber.value);
1757                        result_array.append('date_of_birth', fieldBirthday.value);
1758                        result_array.append('fld_424', fieldEmail.value);
1759                        result_array.append('source', 'siticard_card_extend_portal');
1760                    }
1761                }
1762            }
1763        } else {
1764            if (fieldNumber.value == '') {
1765                if (fieldNumber.nextElementSibling) {
1766                    fieldNumber.nextElementSibling.remove();
1767                }
1768                createError(fieldNumber, 'Введите, пожалуйста, номер карты')
1769            }
1770            if (fieldBirthday.value == '') {
1771                if (fieldBirthday.nextElementSibling) {
1772                    fieldBirthday.nextElementSibling.remove();
1773                }
1774                createError(fieldBirthday, 'Введите, пожалуйста, дату рождения')
1775            }
1776            if ($('[data-type-stud]').hasClass('active') && fieldStudDate.value == '') {
1777                if (fieldStudDate.nextElementSibling) {
1778                    fieldStudDate.nextElementSibling.remove();
1779                }
1780                createError(fieldStudDate, 'Введите, пожалуйста, дату')
1781            }
1782            if ($('[data-type-school]').hasClass('active') && fieldSchoolClass.value == '') {
1783                if (fieldSchoolClass.nextElementSibling.classList.contains('.error-tooltip')) {
1784                    fieldSchoolClass.nextElementSibling.remove();
1785                }
1786                createError(fieldSchoolClass, document.querySelector('.select-school') == undefined ? 'Введите, пожалуйста, класс' : 'Введите, пожалуйста, школу')
1787            }
1788            if (!emailСheckExtension[0].classList.contains('hidden')) {
1789                if (fieldEmail.value == '') {
1790                    if (fieldEmail.nextElementSibling) {
1791                        fieldEmail.nextElementSibling.remove();
1792                    }
1793                    createError(fieldEmail, 'Введите, пожалуйста, email')
1794                } else if (fieldEmail.value != '' && !checkEmailsStatus || checkEmailsStatus == null) {
1795                    createError(fieldEmail, 'Проверьте пожалуйста email')
1796                }
1797            }
1798            if (!emailСheckExtension[1].classList.contains('hidden')) {
1799                if (fieldCode.value == '') {
1800                    if (fieldCode.nextElementSibling) {
1801                        fieldCode.nextElementSibling.remove();
1802                    }
1803                    createError(fieldCode, 'Введите, пожалуйста, код')
1804                } else if (fieldCode.value != '' && $('[data-btn="check"]').css('display') != 'none') {
1805                    if (fieldCode.nextElementSibling) {
1806                        fieldCode.nextElementSibling.remove();
1807                    }
1808                    createError(fieldCode, 'Отправьте проверочный код')
1809                }
1810            }
1811            if (status == "false") {
1812                $('#form-extension').find('.cap-error').show();
1813            }
1814            extension.querySelector('.form-checkbox').querySelector('input').classList.add('error');
1815        }
1816    });
1817
1818}
1819
1820var sendReqStatus = true;
1821$(document).on('submit', '#form-extension-finish', function (event) {
1822    event.preventDefault();
1823    var val = 0;
1824    $("#form-extension-finish input").each(function () {
1825
1826        if ($(this).val() == '') {
1827            $(this).next().find('span').not('.add-file__icon').text('Загрузите файл').css('color', 'red');
1828            return false;
1829        }  else {
1830            if (this.files[0].type == 'image/jpeg') {
1831                $(this).next().find('span').attr('style', '');
1832                return val++;
1833            } else {
1834                return false;
1835            }
1836        }
1837    });
1838
1839    if ($("#form-extension-finish").find('input').length == val && sendReqStatus) {
1840        sendReqStatus = false;
1841        $('#form-extension-finish input').each(function () {
1842            result_array.append(this.name, this.files[0]);
1843        })
1844        $.ajax({
1845            url: '/include/form/prolongation.php',
1846            data: result_array,
1847            type: "POST",
1848            processData: false,
1849            contentType: false,
1850            success: function success(data, status) {
1851                $('html, body').animate({
1852                    scrollTop: 0
1853                }, 400);
1854                setTimeout(function () {
1855                    extension.innerHTML = document.querySelector('.card-extension-me') == undefined ? extensionSuccess : extensionSuccessYO;
1856                }, 500);
1857            }
1858        });
1859    }
1860});
1861
1862
1863$('.tbs-control__btn').click(function () {
1864    $(this).addClass('active').siblings().removeClass('active');
1865    $('.tbs-control__box').hide();
1866    $('.tbs-control__box').eq($(this).index()).show();
1867    if ($(this).index() == 1) {
1868        $('.hidden-contain').show();
1869        $('#extensionClass').hide();
1870    } else {
1871        $('.hidden-contain').hide();
1872        $('#extensionClass').show();
1873    }
1874})
1875
1876
1877var sha256 = function sha256(ascii) {
1878    function rightRotate(value, amount) {
1879        return (value >>> amount) | (value << (32 - amount));
1880    };
1881
1882    var mathPow = Math.pow;
1883    var maxWord = mathPow(2, 32);
1884    var lengthProperty = 'length'
1885    var i, j; // Used as a counter across the whole file
1886    var result = ''
1887
1888    var words = [];
1889    var asciiBitLength = ascii[lengthProperty] * 8;
1890
1891    //* caching results is optional - remove/add slash from front of this line to toggle
1892    // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes
1893    // (we actually calculate the first 64, but extra values are just ignored)
1894    var hash = sha256.h = sha256.h || [];
1895    // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes
1896    var k = sha256.k = sha256.k || [];
1897    var primeCounter = k[lengthProperty];
1898    /*/
1899    var hash = [], k = [];
1900    var primeCounter = 0;
1901    //*/
1902
1903    var isComposite = {};
1904    for (var candidate = 2; primeCounter < 64; candidate++) {
1905        if (!isComposite[candidate]) {
1906            for (i = 0; i < 313; i += candidate) {
1907                isComposite[i] = candidate;
1908            }
1909            hash[primeCounter] = (mathPow(candidate, .5) * maxWord) | 0;
1910            k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0;
1911        }
1912    }
1913
1914    ascii += '\x80' // Append Ƈ' bit (plus zero padding)
1915    while (ascii[lengthProperty] % 64 - 56) ascii += '\x00' // More zero padding
1916    for (i = 0; i < ascii[lengthProperty]; i++) {
1917        j = ascii.charCodeAt(i);
1918        if (j >> 8) return; // ASCII check: only accept characters in range 0-255
1919        words[i >> 2] |= j << ((3 - i) % 4) * 8;
1920    }
1921    words[words[lengthProperty]] = ((asciiBitLength / maxWord) | 0);
1922    words[words[lengthProperty]] = (asciiBitLength)
1923
1924    // process each chunk
1925    for (j = 0; j < words[lengthProperty];) {
1926        var w = words.slice(j, j += 16); // The message is expanded into 64 words as part of the iteration
1927        var oldHash = hash;
1928        // This is now the undefinedworking hash", often labelled as variables a...g
1929        // (we have to truncate as well, otherwise extra entries at the end accumulate
1930        hash = hash.slice(0, 8);
1931
1932        for (i = 0; i < 64; i++) {
1933            var i2 = i + j;
1934            // Expand the message into 64 words
1935            // Used below if 
1936            var w15 = w[i - 15], w2 = w[i - 2];
1937
1938            // Iterate
1939            var a = hash[0], e = hash[4];
1940            var temp1 = hash[7]
1941                + (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) // S1
1942                + ((e & hash[5]) ^ ((~e) & hash[6])) // ch
1943                + k[i]
1944                // Expand the message schedule if needed
1945                + (w[i] = (i < 16) ? w[i] : (
1946                    w[i - 16]
1947                    + (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) // s0
1948                    + w[i - 7]
1949                    + (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10)) // s1
1950                ) | 0
1951                );
1952            // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble
1953            var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) // S0
1954                + ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj
1955
1956            hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()
1957            hash[4] = (hash[4] + temp1) | 0;
1958        }
1959
1960        for (i = 0; i < 8; i++) {
1961            hash[i] = (hash[i] + oldHash[i]) | 0;
1962        }
1963    }
1964
1965    for (i = 0; i < 8; i++) {
1966        for (j = 3; j + 1; j--) {
1967            var b = (hash[i] >> (j * 8)) & 255;
1968            result += ((b < 16) ? 0 : '') + b.toString(16);
1969        }
1970    }
1971    return result;
1972};
1973
1974
1975//card-readiness
1976
1977var readiness = document.querySelector('#card-readiness');
1978var formReadiness = document.querySelector('#form-readiness');
1979var warningReadiness = document.querySelector('.card-readiness .warning');
1980var emailСheckReadiness = document.querySelectorAll('.form-check-email');
1981var statusReadiness = 0;
1982var snilsReadiness = "";
1983var birthdayReadiness = "";
1984if (document.querySelector('#card-extension [name="fld_368"]')) {
1985    document.querySelector('#card-extension [name="fld_368"]').addEventListener('focus', function () {
1986        warningReadiness.style.opacity = 0;
1987        formReadiness.querySelector('input[name="fld_368"]').addEventListener('blur', function () {
1988            var snils = this.value.split('-').join('').split('') || '';
1989
1990            if (!sumSnils(snils) || this.value.lenght < 14) {
1991                createError(this, 'Введите корректный СНИЛС');
1992            }
1993        }, false);
1994    });
1995    document.querySelector('#card-extension [name="date_of_birth"]').addEventListener('focus', function () {
1996        warningReadiness.style.opacity = 0;
1997    });
1998}
1999if (document.querySelector('.select-school')) {
2000    $.ajax({
2001        url: '/include/edu2.php?s=3181',
2002        method: 'get',
2003        dataType: 'json',
2004        success: function (data) {
2005            $.each(data, (index, item) => {
2006                const newOption = new Option(item.NAME, item.CODE, false, false);
2007                $('.select-school').append(newOption).trigger('change');
2008            })
2009        }
2010    });
2011}
2012if (formReadiness != null) {
2013    readiness.querySelectorAll('input').forEach(function (elem) {
2014        return elem.addEventListener('blur', function (e) {
2015            warningReadiness.style.opacity = 0;
2016
2017            switch (elem.name) {
2018                case "fld_368":
2019                    snilsReadiness = elem.value.split(' ').join('');
2020                    break;
2021
2022                case "date_of_birth":
2023                    birthdayReadiness = elem.value;
2024                    break;
2025            }
2026
2027            if (snilsReadiness != "" && birthdayReadiness != "") {
2028                if (statusReadiness < 4) {
2029                    emailСheckReadiness[0].classList.remove('hidden');
2030                } else if (statusReadiness === 4) {
2031                    warningReadiness.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
2032                    extension.querySelectorAll('input').forEach(function (item) {
2033                        item.setAttribute('disabled', 'disabled');
2034                    });
2035                    warningReadiness.style.opacity = 1;
2036                    return false;
2037                } else {
2038                    warningReadiness.style.opacity = 1;
2039                    statusReadiness++;
2040                }
2041            }
2042        });
2043    });
2044    formReadiness.addEventListener('submit', function (e) {
2045        e.preventDefault();
2046        var fieldSnils = readiness.querySelector('[name="fld_368"]');
2047        var fieldBirthday = readiness.querySelector('[name="date_of_birth"]');
2048        var fieldEmail = readiness.querySelector('[name="fld_424"]');
2049        var fieldCode = readiness.querySelector('[name="emailcheck"]');
2050        var status = $('#form-readiness').find('.cap-error').attr('data-status');
2051        if (readiness.querySelector('.form-checkbox').querySelector('input').checked && !readiness.querySelector('button').classList.contains('disabled') && status == "true") {
2052            if (checkEmailsStatus) {
2053                document.querySelector('.release__text').remove();
2054                var obj = cardDateReadiness(fieldSnils.value, fieldBirthday.value, fieldEmail.value, fieldCode.value);
2055                if (obj.error == '0') {
2056                    var ex = '<div class="text"><p>Уважаемый пользователь!</p> <div> ';
2057                    obj.result.forEach(function (item, index) {
2058                        ex += '<h4>Заявка ' + (index + 1) + '</h4> '
2059                        if (item.card_num === "" && item.done_date === "") {
2060                            ex += '<div class="res-line"><p>Мы еще изготавливаем Вашу карту и скоро Вы сможете получить ее в выбранном пункте выдачи <br> <b>«' + item.destination_name + '»</b> по адресу <b>' + item.address + ' </b></p></div> '
2061                        } else {
2062                            ex += '<div class="res-line"><p>Ваша персональная транспортная карта №' + item.card_num + ' изготовлена и доступна к получению в пункте выдачи <br> <b>«' + item.destination_name + '»</b> по адресу: <b>' + item.address + ' </b> </p></div>'
2063                        }
2064                    })
2065                    ex += '</div> <p>Спасибо, что воспользовались сервисом проверки готовности карты.</p> </div><a href="/" class="btn btn_size_xl">на Главную страницу</a>'
2066                    readiness.innerHTML = ex;
2067                } else {
2068                    readiness.innerHTML = '<div class="call-message"><article class="text"><p>Указанные СНИЛС и дата рождения отсутствуют в системе.</p> <p>Возможные причины: <br/> 1. Вы неверно ввели данные. Проверьте, пожалуйста, данные пользователя, на которого была оформлена карта и введите правильные данные. <br/> 2. Данные вашего заявления на выпуск карты еще не прошли проверку. Дождитесь подтверждения на Ваш e-mail о проверке данных  и передаче заявления в производство для выпуска карты. После получения подтверждения вновь проверьте готовность карты.</p> <p>Если Вы уверены, что вводите правильные данные и уже получили подтверждение о проверке данных и передаче заявления в производство для выпуска карты, напишите, пожалуйста, в службу поддержки через <a href="https://siticard.ru/support/">форму обратной связи на сайте </a></p></div><a href="/services/card-check/" class="btn btn_size_xl">Попробовать снова</a>';
2069                }
2070            }
2071        } else {
2072            if (fieldSnils.value == '') {
2073                if (fieldSnils.nextElementSibling) {
2074                    fieldSnils.nextElementSibling.remove();
2075                }
2076                createError(fieldSnils, 'Введите, пожалуйста, СНИЛС')
2077            }
2078            if (fieldBirthday.value == '') {
2079                if (fieldBirthday.nextElementSibling) {
2080                    fieldBirthday.nextElementSibling.remove();
2081                }
2082                createError(fieldBirthday, 'Введите, пожалуйста, дату рождения')
2083            }
2084            if (!emailСheckReadiness[0].classList.contains('hidden')) {
2085                if (fieldEmail.value == '') {
2086                    if (fieldEmail.nextElementSibling) {
2087                        fieldEmail.nextElementSibling.remove();
2088                    }
2089                    createError(fieldEmail, 'Введите, пожалуйста, email')
2090                } else if (fieldEmail.value != '' && !checkEmailsStatus || checkEmailsStatus == null) {
2091                    createError(fieldEmail, 'Проверьте, пожалуйста, email')
2092                }
2093            }
2094            if (!emailСheckReadiness[1].classList.contains('hidden')) {
2095                if (fieldCode.value == '') {
2096                    if (fieldCode.nextElementSibling) {
2097                        fieldCode.nextElementSibling.remove();
2098                    }
2099                    createError(fieldCode, 'Введите, пожалуйста, код')
2100                } else if (fieldCode.value != '' && $('[data-btn="check"]').css('display') != 'none') {
2101                    if (fieldCode.nextElementSibling) {
2102                        fieldCode.nextElementSibling.remove();
2103                    }
2104                    createError(fieldCode, 'Отправьте проверочный код')
2105                }
2106            }
2107            if (status == "false") {
2108                $('#form-readiness').find('.cap-error').show();
2109            }
2110            readiness.querySelector('.form-checkbox').querySelector('input').classList.add('error');
2111        }
2112    });
2113
2114}
2115
2116
2117//card-readiness
2118if (document.querySelectorAll('#card-readiness-hash').length) {
2119    var readiness = document.querySelector('#card-readiness-hash');
2120    var formReadiness = document.querySelector('#form-readiness-hash');
2121    var warningReadiness = readiness.querySelector('.card-readiness .warning');
2122    var emailСheckReadiness = readiness.querySelectorAll('.form-check-email');
2123    var statusReadiness = 0;
2124    var snilsReadiness = "";
2125    var birthdayReadiness = "";
2126    if (readiness.querySelector('[name="fld_368"]')) {
2127        readiness.querySelector('[name="fld_368"]').addEventListener('focus', function () {
2128            warningReadiness.style.opacity = 0;
2129            formReadiness.querySelector('input[name="fld_368"]').addEventListener('blur', function () {
2130                var snils = this.value.split('-').join('').split('') || '';
2131
2132                if (!sumSnils(snils) || this.value.lenght < 14) {
2133                    createError(this, 'Введите корректный СНИЛС');
2134                }
2135            }, false);
2136        });
2137        readiness.querySelector('[name="date_of_birth"]').addEventListener('focus', function () {
2138            warningReadiness.style.opacity = 0;
2139        });
2140    }
2141    if (formReadiness != null) {
2142        readiness.querySelectorAll('input').forEach(function (elem) {
2143            return elem.addEventListener('blur', function (e) {
2144                warningReadiness.style.opacity = 0;
2145
2146                switch (elem.name) {
2147                    case "fld_368":
2148                        snilsReadiness = elem.value.split('-').join('').split(' ').join('');
2149                        break;
2150
2151                    case "date_of_birth":
2152                        birthdayReadiness = elem.value.split('.').join('');
2153                        break;
2154                }
2155
2156                if (snilsReadiness != "" && birthdayReadiness != "") {
2157                    if (statusReadiness < 4) {
2158                        emailСheckReadiness[0].classList.remove('hidden');
2159                    } else if (statusReadiness === 4) {
2160                        warningReadiness.textContent = "Вы 3 раза неверно указали  номер карты или дату рождения. Для повторного ввода данных перезагрузите страницу сервиса.";
2161                        extension.querySelectorAll('input').forEach(function (item) {
2162                            item.setAttribute('disabled', 'disabled');
2163                        });
2164                        warningReadiness.style.opacity = 1;
2165                        return false;
2166                    } else {
2167                        warningReadiness.style.opacity = 1;
2168                        statusReadiness++;
2169                    }
2170                }
2171            });
2172        });
2173        formReadiness.addEventListener('submit', function (e) {
2174            e.preventDefault();
2175            var fieldSnils = readiness.querySelector('[name="fld_368"]');
2176            var fieldBirthday = readiness.querySelector('[name="date_of_birth"]');
2177            var fieldEmail = readiness.querySelector('[name="fld_424"]');
2178            var fieldCode = readiness.querySelector('[name="emailcheck"]');
2179            var status = $('#form-readiness-hash').find('.cap-error').attr('data-status');
2180            if (readiness.querySelector('.form-checkbox input').checked && status == "true") {
2181                if (checkEmailsStatus) {
2182                    document.querySelector('.release__text').remove();
2183                    console.log(snilsReadiness, birthdayReadiness)
2184                    const fieldHash = sha256(snilsReadiness + birthdayReadiness);
2185                    var obj = cardDateReadinessHash(fieldHash, fieldEmail.value, fieldCode.value);
2186                    if (obj.error == '0') {
2187                        var ex = '<div class="text"><p>Уважаемый пользователь!</p> <div> ';
2188                        obj.result.forEach(function (item, index) {
2189                            ex += '<h4>Заявка ' + (index + 1) + '</h4> '
2190                            if (item.card_num === "") {
2191                                ex += '<div class="res-line"><p>Мы еще изготавливаем Вашу карту и скоро Вы сможете получить ее в выбранном пункте выдачи <br> <b>«' + item.destination_name + '»</b> по адресу <b>' + item.address + ' </b></p></div> '
2192                            } else {
2193                                ex += '<div class="res-line"><p>Ваша персональная транспортная карта №' + item.card_num + ' изготовлена и доступна к получению в пункте выдачи <br> <b>«' + item.destination_name + '»</b> по адресу: <b>' + item.address + ' </b> </p></div>'
2194                            }
2195                        })
2196                        ex += '</div> <p>Спасибо, что воспользовались сервисом проверки готовности карты.</p> </div><a href="/" class="btn btn_size_xl">на Главную страницу</a>'
2197                        readiness.innerHTML = ex;
2198                    } else {
2199                        readiness.innerHTML = '<div class="call-message"><article class="text"><p>Указанные СНИЛС и дата рождения отсутствуют в системе.</p> <p>Возможные причины: <br/> 1. Вы неверно ввели данные. Проверьте, пожалуйста, данные пользователя, на которого была оформлена карта и введите правильные данные. <br/> 2. Данные вашего заявления на выпуск карты еще не прошли проверку. Дождитесь подтверждения на Ваш e-mail о проверке данных  и передаче заявления в производство для выпуска карты. После получения подтверждения вновь проверьте готовность карты.</p> <p>Если Вы уверены, что вводите правильные данные и уже получили подтверждение о проверке данных и передаче заявления в производство для выпуска карты, напишите, пожалуйста, в службу поддержки через <a href="https://siticard.ru/support/">форму обратной связи на сайте </a></p></div><a href="/services/card-check/" class="btn btn_size_xl">Попробовать снова</a>';
2200                    }
2201                }
2202            } else {
2203                if (fieldSnils.value == '') {
2204                    if (fieldSnils.nextElementSibling) {
2205                        fieldSnils.nextElementSibling.remove();
2206                    }
2207                    createError(fieldSnils, 'Введите, пожалуйста, СНИЛС')
2208                }
2209                if (fieldBirthday.value == '') {
2210                    if (fieldBirthday.nextElementSibling) {
2211                        fieldBirthday.nextElementSibling.remove();
2212                    }
2213                    createError(fieldBirthday, 'Введите, пожалуйста, дату рождения')
2214                }
2215                if (!emailСheckReadiness[0].classList.contains('hidden')) {
2216                    if (fieldEmail.value == '') {
2217                        if (fieldEmail.nextElementSibling) {
2218                            fieldEmail.nextElementSibling.remove();
2219                        }
2220                        createError(fieldEmail, 'Введите, пожалуйста, email')
2221                        ƒ
2222                    } else if (fieldEmail.value != '' && !checkEmailsStatus || checkEmailsStatus == null) {
2223                        createError(fieldEmail, 'Проверьте, пожалуйста, email')
2224                    }
2225                }
2226                if (!emailСheckReadiness[1].classList.contains('hidden')) {
2227                    if (fieldCode.value == '') {
2228                        if (fieldCode.nextElementSibling) {
2229                            fieldCode.nextElementSibling.remove();
2230                        }
2231                        createError(fieldCode, 'Введите, пожалуйста, код')
2232                    } else if (fieldCode.value != '' && $('[data-btn="check"]').css('display') != 'none') {
2233                        if (fieldCode.nextElementSibling) {
2234                            fieldCode.nextElementSibling.remove();
2235                        }
2236                        createError(fieldCode, 'Отправьте проверочный код')
2237                    }
2238                }
2239                if (status == "false") {
2240                    $('#form-readiness').find('.cap-error').show();
2241                }
2242                readiness.querySelector('.form-checkbox').querySelector('input').classList.add('error');
2243            }
2244        });
2245
2246    }
2247}
2248
2249function cardDateReadiness(sniks, date, email, code) {
2250    var xhr = new XMLHttpRequest();
2251    var arr = {};
2252    xhr.open('GET', '/include/card_done/check-1.php?s=' + sniks + '&b=' + date + '&e=' + email + '&c=' + code, false);
2253    xhr.send();
2254
2255    if (xhr.status == 200 && xhr.readyState == 4) {
2256        var json = xhr.response;
2257        var obj = JSON.parse(json);
2258        return obj;
2259    }
2260}
2261
2262function smartCaptchaInit(containerId) {
2263    if (!window.smartCaptcha) return;
2264    const $container = $('#' + containerId);
2265    const $form = $container.closest('form');
2266    const widgetId = window.smartCaptcha.render(containerId, {
2267        sitekey: 'ysc1_ZesIHdhLXyKGAiegwOcvHO0iArhY6tjXj8XwEwKa01416cfe',
2268        hl: 'ru',
2269        hideShield: true,
2270    });
2271    window.smartCaptcha.subscribe(widgetId, 'success', (token) => {
2272        $form.find('.cap-error').hide().attr('data-status', 'true');
2273        $form.attr('data-captcha-status', 'true');
2274        $form.trigger('captcha:success', { token, widgetId });
2275    });
2276    window.smartCaptcha.subscribe(widgetId, 'token-expired', () => {
2277        $form.find('.cap-error').show().attr('data-status', 'false');
2278        $form.attr('data-captcha-status', 'false');
2279    });
2280}

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.