PageSourceSearch

https://mctop.su/static/ui/js/projects/vote.js?v=1.4

js mctop.su collected 2026-10-04 23:01:17 UTC 6,886 bytes, 153 lines download raw bytes

1$(document).ready(function () {
2    var project_id_to_vote = location.search.split('voting=')[1];
3    var vote_cooldown = false;
4
5    if (project_id_to_vote && window.user) {
6        var $btn = $('.openVoteModal[data-project-id="' + project_id_to_vote + '"]');
7        var project_name = $btn.data('project-name');
8
9        openVoteModal(project_id_to_vote, project_name);
10    }
11
12    $('.openVoteModal').click(function () {
13        var $btn = $(this);
14        var project_id = $btn.data('project-id');
15        var project_name = $btn.data('project-name');
16
17        openVoteModal(project_id, project_name);
18    });
19
20    const fpPromise = new Promise((resolve, reject) => {
21        const script = document.createElement('script');
22        script.onload = resolve;
23        script.onerror = reject;
24        script.async = true;
25        script.src = '/static/ui/js/fp.min.js?v=1'
26        document.head.appendChild(script);
27    })
28    .then(() => FingerprintJS.load());
29
30    function openVoteModal(project_id, project_name) {
31        var $vote_modal = $('#voteModal');
32
33        $vote_modal.modal('show').one('hidden.bs.modal', function () {
34            var $nick = $vote_modal.find('[name="nick"]');
35            var $vote_btn = $vote_modal.find('.voteBtn');
36
37            $nick
38                .tooltip('destroy')
39                .val('');
40            $vote_btn.tooltip('destroy');
41        });
42        $vote_modal.find('.projectName').text(project_name);
43        $vote_modal.find('[name="project_id"]').val(project_id);
44    }
45
46    var params = {};
47
48    $('.voteForm').submit(function (e) {
49        e.preventDefault();
50
51        if (!vote_cooldown) {
52
53            fpPromise.then(fp => fp.get()).then(result => {
54                $('.voteForm').append('<input type="hidden" name="vv" value="'+result.visitorId+'" />');
55            }).finally(() => {
56                vote_cooldown = true;
57                setTimeout(function () {
58                    vote_cooldown = false;
59                }, 5000);
60
61                var $vote_form = $(this);
62                var $vote_modal = $('#voteModal');
63                var $nick = $vote_form.find('[name="nick"]');
64                var $vote_btn = $vote_form.find('.voteBtn');
65
66                if (!$nick.val()) {
67                    $nick.tooltip({
68                        title: 'Обязательное поле.',
69                        position: 'top',
70                        trigger: 'manual'
71                    }).tooltip('show').one('click focus change', function () {
72                        $(this).tooltip('destroy');
73                    });
74                    return false;
75                }
76
77                $nick.one('click focus change', function () {
78                    $vote_btn.tooltip('destroy');
79                });
80
81                $.ajax({
82                    url: '/projects/vote/',
83                    type: "POST",
84                    data: $vote_form.serialize(),
85                    success: function (data) {
86                        var $project_vote_btn = $('.openVoteModal[data-project-id="' + data.project_id + '"]');
87
88                        $vote_modal.modal('hide');
89                        $project_vote_btn.tooltip({
90                            title: 'Благодарим за Ваш голос, Вы сможете повторно проголосовать через 24 часа.',
91                            position: 'top',
92                            trigger: 'manual'
93                        }).tooltip('show');
94
95				const successMessage = $('<div class="alert alert-success" style="font-size:20px;">Вы успешно проголосовали! Следующий голос будет доступен через 24 часа.</div>');
96        			$('.voteForm__message').before(successMessage);
97
98                        setTimeout(function () {
99                            $project_vote_btn.tooltip('destroy');
100                        }, 100000);
101                    },
102                    error: function (response) {
103                        let error_text;
104
105                        if (response.status === 500) {
106                            error_text = 'Ошибка 500';
107                        } else if (response.responseText === 'incorrect_nick') {
108                            error_text = 'Некорректный ник';
109                        } else if (response.responseText === 'incorrect_google_recaptcha') { //MrYarik666 Add if
110                            error_text = 'Пожалуйста, поставьте галочку в капче';
111                        } else if (response.responseText === 'incorrect_google_recaptcha_service') { //MrYarik666 Add if
112                            error_text = 'Капча временно не работает. Повторите попытку позднее.';
113                        } else if (response.responseText === 'error') {
114                            error_text = 'Ваш голос уже был учтен в последние 24 часа. Пожалуйста, попробуйте снова через час.';
115                        } else if (response.responseText === 'vk_deactivated') {
116                            error_text = 'Ваш аккаунт заблокирован во Вконтакте.';
117                        } else if (response.responseText === 'g') {
118                            error_text = 'Ваш айпи находится в базе данных спамеров, либо вы используете публичный VPN/прокси. Отключите VPN/прокси и попробуйте снова.';
119                        }
120                        else {
121                            error_text = 'Ошибка! Код ошибки: ' + response.status + ', обновите страницу';
122                        }
123                        $vote_btn.tooltip({
124                            title: error_text,
125                            position: 'top',
126                            trigger: 'manual',
127                        }).tooltip('show');
128                    }
129                });
130
131                //});
132
133                // add spinner img after voting
134                const voteForm = document.querySelector('#voteForm'),
135                    statusMessage = document.createElement('img'),
136                    voteBtn = document.querySelector('[data-vote]');
137
138                statusMessage.src = '/static/ui/img/spinner.svg';
139                statusMessage.classList.add('spinner');
140                voteForm.insertAdjacentElement('afterend', statusMessage);
141                voteBtn.setAttribute("disabled", "disabled");
142                setTimeout(() => {
143                    statusMessage.remove();
144                    voteBtn.removeAttribute("disabled");
145                }, 4000);
146
147                $vote_btn.tooltip('destroy');
148            });
149        }
150    });
151
152});
153

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.