PageSourceSearch

https://ptsell.com/ru/category/hawaiianairlines

html ptsell.com collected 2026-10-09 23:36:46 UTC 80,314 bytes, 1,902 lines download raw bytes

1<!doctype html>
2<html lang="ru" dir="ltr">
3<head>
4    <title>Hawaiian Airlines Miles</title>
5<meta name="description" content="Hawaiian Airlines Miles">
6<meta name="keywords" content="купить мили, покупка милей, продажа милей, мили авиа, продажа аккаунтов с балансом, продажа аккаунтов авиа, аккаунты отелей, аккаунты с милями, cash-back.biz.ua, cash-back.liavel.ru, cash-back.leqshop.ru, buy airlines miles, air canada miles, accounts with miles, aeroplan miles, american airlines miles, qatar airways miles, emirates airline miles, turkish airlines miles">
7<link rel="canonical" href="https://liavelru.rents.ac/ru/category/hawaiianairlines" />
8<meta property="og:type" content="website">
9<meta property="og:title" content="Hawaiian Airlines Miles">
10<meta property="og:description" content="Hawaiian Airlines Miles">
11<meta property="og:url" content="https://liavelru.rents.ac/ru/category/hawaiianairlines">
12<meta property="og:site_name" content="CASH-BACK.BIZ.UA - Продажа аккаунтов милей, авиа, купить мили авиа">
13<meta property="og:locale" content="ru_RU">
14<meta name="twitter:card" content="summary">
15<meta name="twitter:title" content="Hawaiian Airlines Miles">
16<meta name="twitter:description" content="Hawaiian Airlines Miles">
17
18<link rel="alternate" hreflang="x-default" href="https://ptsell.com/ru/category/hawaiianairlines"/>
19            <link rel="alternate" hreflang="ru" href="https://ptsell.com/ru/category/hawaiianairlines"/>
20    <meta charset="utf-8"/>
21<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
22<meta name="viewport" content="width=device-width"/>
23    <meta name="google-site-verification" content="google-site-verification=Jf7049lbsi2KtuNrfwtuUT9U6h2ioeUULtixAltSP4Y"/>
24    <meta name="yandex-verification" content='36bc17ae7cbc9a9c'/>
25    <meta name="verification" content="6a508a60aa3bf9510ea6acb021c94b48"/>
26<link rel="icon" type="image/png"
27      href="https://www.iconsdb.com/icons/download/royal-blue/airplane-takeoff-64.ico"/>
28
29    <meta name="csrf-token" content="gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q">
30    
31    
31<script src="/vendor/jquery-2.1.3/jquery.min.js"></script>
31
32    
33    <link rel="stylesheet" href="/vendor/jquery-ui-1.11.4/themes/smoothness/jquery-ui.min.css" media="print" onload="this.media='all'">
34    <noscript><link rel="stylesheet" href="/vendor/jquery-ui-1.11.4/themes/smoothness/jquery-ui.min.css"></noscript>
35    
35<script src="/vendor/jquery-ui-1.11.4/jquery-ui.min.js"></script>
35
36    
36<script type="module" src="https://ptsell.com/build/assets/lazysizes.min-GD8IIHgq.js"></script>
36
37    <link rel="modulepreload" href="https://ptsell.com/build/assets/shop-old-FpYPzLs-.js" /><link rel="modulepreload" href="https://ptsell.com/build/assets/pusher-BVCVQPqm.js" /><link rel="modulepreload" href="https://ptsell.com/build/assets/_commonjsHelpers-Cpj98o6Y.js" />
37<script type="module" src="https://ptsell.com/build/assets/shop-old-FpYPzLs-.js" data-navigate-track="reload"></script>
37
38    
38<script>
39        $(function () {
40            $('[data-toggle="tooltip"]').tooltip({html: true});
41            // bootstrap tooltip
42        });
43        var shop_currency = 'rub';
44    </script>
44
45    
45<script>
46    var shopMessages = {
47        0: "Такого кол-ва товара нет",
48        1: "Вы уверены, что хотите прервать процесс покупки?",
49        2: "Укажите Email адрес",
50        3: "Мин. кол-во товара",
51        4: "Такого количества товара нет",
52        5: "Выберите способ оплаты",
53        6: "Временная ошибка сервера. Попробуйте еще раз!",
54        7: "Оплатить товар!",
55        8: "Проверить оплату",
56        9: "Вы должны принять условия магазина",
57        10: "Макс. количество товара",
58    };
59</script>
59
60    
60<script src="/static/js/jquery.qrcode.min.js"></script>
60
61
62    
62<script src="https://ptsell.com/build/assets/shop.new-s4_9xB9b.js"></script>
62
63    
64        <link href="https://ptsell.com/build/assets/style-DclxN8TN.css" rel="stylesheet" media="all"/>
65    <style>
66        body {
67            background: #041933;
68        }
69    </style>
70    
71    <link rel="stylesheet" href="/vendor/fontawesome-5.15.4/css/all.min.css" media="print" onload="this.media='all'">
72    <noscript><link rel="stylesheet" href="/vendor/fontawesome-5.15.4/css/all.min.css"></noscript>
73
74</head>
75
76<body class="b-shop">
77
78    <nav class="navbar navbar-default navbar-static-top">
79    <div class="container">
80        <div class="navbar-header">
81            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
82                    aria-expanded="false" aria-controls="navbar">
83                <span class="sr-only">Toggle navigation</span>
84                <span class="icon-bar"></span>
85                <span class="icon-bar"></span>
86                <span class="icon-bar"></span>
87            </button>
88        </div>
89        <div id="navbar" class="navbar-collapse collapse">
90                        <ul class="nav navbar-nav">
91                <li class="active">
92                    <a href="https://liavelru.rents.ac/ru/">
93                        Главная
94                    </a>
95                </li>
96                                                            <li >
97                            <a href="https://liavelru.rents.ac/ru/rules">
98                                Правила
99                            </a>
100                        </li>
101                                                    <li class="dropdown nav-item">
102                    <a href="#lang" class="nav-link dropdown-toggle" id="dropdown01" data-toggle="dropdown"
103                       aria-haspopup="true" aria-expanded="false">
104                        <img class="countryflag"
105          src="https://ptsell.com/storage/images/flags/RU.png"
106     alt="RU">
107                    </a>
108                    <div class="dropdown-menu" aria-labelledby="dropdown01">
109                        <a class="dropdown-item d-flex align-items-center gap-2  active "
110       rel="nofollow" href="/ru/category/hawaiianairlines"
111        aria-current="true" >
112                    <img src="https://ptsell.com/storage/images/flags/RU.png" width="20" height="14" alt="Русский">
113                Русский
114    </a>
115            <a class="dropdown-item d-flex align-items-center gap-2 "
116       rel="nofollow" href="/en/category/hawaiianairlines"
117       >
118                    <img src="https://ptsell.com/storage/images/flags/GB.png" width="20" height="14" alt="English">
119                English
120    </a>
121                        </div>
122                </li>
123            </ul>
124            <div style="float:right; display: flex; align-items: center; margin:0px 10px 0px 10px;">
125
126                                            </div>
127
128
129            <ul class="nav navbar-nav navbar-right col-md-3 col-xs-3 col-lg-2">
130                <li>
131                    <form>
132                        <input type="hidden" name="_token" value="gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q" autocomplete="off">
133                        <div class="input-group">
134                            <input type="text" name="search" class="form-control input-sm"
135                                   placeholder="поиск товаров">
136                            <span class="input-group-btn">
137                            <button class="btn btn-primary btn-sm pull-right" type="submit">Поиск</button>
138                        </span>
139                        </div>
140                    </form>
141                </li>
142            </ul>
143
144                        <div class="deposit">Депозит:
145                <a class="depred"
146                   href="https://rents.ws/ru/deposits/liavelru"
147                   target="_blank">
148                    0,00 ₽
149                </a>
150            </div>
151
152        </div>
153    </div>
154</nav>
155<!-- Auth Modal -->
156    
157    <div class="modal fade bootstrap3-modal" id="authModal" tabindex="-1" role="dialog" aria-labelledby="authModalLabel">
158        <div class="modal-dialog" role="document">
159            <div class="modal-content">
160                <div class="modal-header">
161                    <h4 class="modal-title text-capitalize-first" id="myModalLabel">войти</h4>
162                    <button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="jQuery('#authModal').modal('hide'); return false;"><span aria-hidden="true">&times;</span></button>
163                </div>
164                <div class="modal-body">
165                    <form action="https://ptsell.com/ru/signin-shop" id="authForm" novalidate method="post">
166                        <input type="hidden" name="_token" value="gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q" autocomplete="off">                        <div class="form-group">
167                            <label class="form-label text-capitalize-first" for="basic-form-login">логин</label>
168                            <input type="text" name="login" class="form-control" id="basic-form-login"
169                                   placeholder="логин" required value="">
170                            <div id="loginError" class="invalid-feedback text-danger"></div>
171                        </div>
172                        <div class="form-group">
173                            <label class="form-label text-capitalize-first" for="basic-form-password">пароль</label>
174                            <input type="password" name="password" class="form-control" id="basic-form-password"
175                                   placeholder="пароль">
176                            <div id="passwordError" class="invalid-feedback text-danger"></div>
177                        </div>
178                                                    <div class="mb-3" id="basic-form-altcha">
179    <altcha-widget challenge="/altcha/challenge" name="altcha"
180                   auto="onfocus" configuration='{"hideFooter":true}'></altcha-widget>
181        <div id="altchaError" class="invalid-feedback text-danger"></div>
182</div>
183    
183<script src="https://ptsell.com/vendor/altcha/altcha-3.3.0.i18n.min.js" defer></script>
183
184                                                <div class="form-group form-check">
185                            <input class="form-check-input" id="basic-form-checkbox" type="checkbox" name="remember">
186                            <label class="form-check-label text-capitalize-first" for="basic-form-checkbox">Запомнить меня</label>
187                        </div>
188                        <div class="form-buttons">
189                            <button class="btn btn-primary text-capitalize-first" type="submit">войти</button>
190                            <a href="https://ptsell.com/ru/signup" class="btn btn-default text-capitalize-first">регистрация</a>
191                        </div>
192                    </form>
193                </div>
194            </div>
195        </div>
196    </div>
197
198<style>
199    /* Светлая тема модалки авторизации (для светлой темы корзины) */
200    [data-bs-theme="light"] #authModal .modal-content,
201    [data-bs-theme="light"] #authModal .modal-header,
202    [data-bs-theme="light"] #authModal .modal-body {
203        background-color: #ffffff !important;
204        color: #212529 !important;
205        font-size: 1rem !important;
206    }
207
208    [data-bs-theme="light"] #authModal .modal-title {
209        color: #212529 !important;
210    }
211
212    [data-bs-theme="light"] #authModal .form-control,
213    [data-bs-theme="light"] #authModal input[type="text"],
214    [data-bs-theme="light"] #authModal input[type="password"],
215    [data-bs-theme="light"] #authModal input[type="email"],
216    [data-bs-theme="light"] #authModal textarea {
217        background-color: #ffffff !important;
218        color: #212529 !important;
219        border-color: #ced4da !important;
220    }
221
222    [data-bs-theme="light"] #authModal .form-control:focus,
223    [data-bs-theme="light"] #authModal input[type="text"]:focus,
224    [data-bs-theme="light"] #authModal input[type="password"]:focus,
225    [data-bs-theme="light"] #authModal input[type="email"]:focus,
226    [data-bs-theme="light"] #authModal textarea:focus {
227        background-color: #ffffff !important;
228        color: #212529 !important;
229        border-color: #86b7fe !important;
230        box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25) !important;
231    }
232
233    [data-bs-theme="light"] #authModal .form-control::placeholder,
234    [data-bs-theme="light"] #authModal input[type="text"]::placeholder,
235    [data-bs-theme="light"] #authModal input[type="password"]::placeholder,
236    [data-bs-theme="light"] #authModal input[type="email"]::placeholder {
237        color: #6c757d !important;
238        opacity: 1 !important;
239        font-size: 1rem !important;
240        font-weight: 400 !important;
241    }
242
243    [data-bs-theme="light"] #authModal .form-label,
244    [data-bs-theme="light"] #authModal .text-muted,
245    [data-bs-theme="light"] #authModal .form-text {
246        color: #212529 !important;
247        font-size: 1rem !important;
248        font-weight: 400 !important;
249        padding-left: 0 !important;
250    text-transform: capitalize !important;
251        line-height: 1.5 !important;
252        margin-bottom: .5rem !important;
253    }
254
255    [data-bs-theme="light"] #authModal .form-check-label {
256        color: #212529 !important;
257        font-size: 1rem !important;
258        font-weight: 400 !important;
259        margin-left: 0 !important;
260        padding-left: 0 !important;
261    text-transform: capitalize !important;
262    }
263
264    [data-bs-theme="light"] #authModal .btn-close {
265        filter: none !important;
266    }
267
268    /* Тёмная тема модалки авторизации (для тёмной темы корзины) */
269    [data-bs-theme="dark"] #authModal .modal-content,
270    [data-bs-theme="dark"] #authModal .modal-header,
271    [data-bs-theme="dark"] #authModal .modal-body {
272        background-color: #212529 !important;
273        color: #f8f9fa !important;
274        border-color: #343a40 !important;
275        font-size: 1rem !important;
276    }
277
278    [data-bs-theme="dark"] #authModal .modal-title {
279        color: #f8f9fa !important;
280    }
281
282    [data-bs-theme="dark"] #authModal .form-control,
283    [data-bs-theme="dark"] #authModal input[type="text"],
284    [data-bs-theme="dark"] #authModal input[type="password"],
285    [data-bs-theme="dark"] #authModal input[type="email"],
286    [data-bs-theme="dark"] #authModal textarea {
287        background-color: #343a40 !important;
288        color: #f8f9fa !important;
289        border-color: #495057 !important;
290    }
291
292    [data-bs-theme="dark"] #authModal .form-control:focus,
293    [data-bs-theme="dark"] #authModal input[type="text"]:focus,
294    [data-bs-theme="dark"] #authModal input[type="password"]:focus,
295    [data-bs-theme="dark"] #authModal input[type="email"]:focus,
296    [data-bs-theme="dark"] #authModal textarea:focus {
297        background-color: #343a40 !important;
298        color: #f8f9fa !important;
299        border-color: #86b7fe !important;
300        box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.35) !important;
301    }
302
303    [data-bs-theme="dark"] #authModal .form-control::placeholder,
304    [data-bs-theme="dark"] #authModal input[type="text"]::placeholder,
305    [data-bs-theme="dark"] #authModal input[type="password"]::placeholder,
306    [data-bs-theme="dark"] #authModal input[type="email"]::placeholder {
307        color: #adb5bd !important;
308        opacity: 1 !important;
309        font-size: 1rem !important;
310        font-weight: 400 !important;
311    }
312
313    [data-bs-theme="dark"] #authModal .form-label,
314    [data-bs-theme="dark"] #authModal .text-muted,
315    [data-bs-theme="dark"] #authModal .form-text {
316        color: #f8f9fa !important;
317        font-size: 1rem !important;
318        font-weight: 400 !important;
319        padding-left: 0 !important;
320    text-transform: capitalize !important;
321        line-height: 1.5 !important;
322        margin-bottom: .5rem !important;
323    }
324
325    [data-bs-theme="dark"] #authModal .btn-close {
326        filter: invert(1) grayscale(100%) brightness(200%) !important;
327    }
328
329    [data-bs-theme="dark"] #authModal .form-check-label {
330        color: #f8f9fa !important;
331        font-size: 1rem !important;
332        font-weight: 400 !important;
333        margin-left: 0 !important;
334        padding-left: 0 !important;
335    text-transform: capitalize !important;
336    }
337
338    /* Стили для Bootstrap 3 (старые шаблоны) - применяются только к классу bootstrap3-modal */
339    .modal.bootstrap3-modal#authModal .modal-dialog {
340        z-index: 1050 !important;
341        position: relative;
342    }
343
344    .modal.bootstrap3-modal#authModal .modal-content {
345        border-radius: 4px;
346        box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
347        border: 1px solid rgba(0, 0, 0, 0.2);
348    }
349
350    .modal.bootstrap3-modal#authModal .modal-header {
351        border-bottom: 1px solid #e5e5e5;
352        padding: 15px;
353        background-color: #fff;
354        display: flex;
355        align-items: center;
356        justify-content: space-between;
357    }
358
359    .modal.bootstrap3-modal#authModal .modal-header .close {
360        margin-top: -2px;
361        margin-left: auto;
362        margin-right: 0;
363        font-size: 21px;
364        font-weight: 700;
365        line-height: 1;
366        color: #000;
367        text-shadow: 0 1px 0 #fff;
368        opacity: 0.2;
369        filter: alpha(opacity=20);
370        float: right;
371        padding: 0;
372        background: transparent;
373        border: 0;
374        -webkit-appearance: none;
375        cursor: pointer;
376        order: 2;
377    }
378
379    .modal.bootstrap3-modal#authModal .modal-header .close:hover,
380    .modal.bootstrap3-modal#authModal .modal-header .close:focus {
381        color: #000;
382        text-decoration: none;
383        cursor: pointer;
384        opacity: 0.5;
385        filter: alpha(opacity=50);
386    }
387
388    .modal.bootstrap3-modal#authModal .modal-header .modal-title {
389        order: 1;
390        flex: 1;
391        margin-right: 10px;
392    }
393
394
395    .modal.bootstrap3-modal#authModal .modal-body {
396        position: relative;
397        padding: 15px;
398        background-color: #fff;
399    }
400
401    .modal.bootstrap3-modal#authModal .form-group {
402        margin-bottom: 15px;
403    }
404
405    .modal.bootstrap3-modal#authModal .form-label {
406        display: inline-block;
407        max-width: 100%;
408        margin-bottom: 5px;
409        font-weight: 700;
410        font-size: 14px;
411    }
412
413    .modal.bootstrap3-modal#authModal .form-control {
414        display: block;
415        width: 100%;
416        height: 34px;
417        padding: 6px 12px;
418        font-size: 14px;
419        line-height: 1.42857143;
420        color: #555;
421        background-color: #fff;
422        background-image: none;
423        border: 1px solid #ccc;
424        border-radius: 4px;
425        box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
426        transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
427    }
428
429    .modal.bootstrap3-modal#authModal .form-control:focus {
430        border-color: #66afe9;
431        outline: 0;
432        box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
433    }
434
435    .modal.bootstrap3-modal#authModal .form-control::placeholder {
436        color: #999;
437        opacity: 1;
438    }
439
440    .modal.bootstrap3-modal#authModal .form-buttons {
441        display: flex;
442        gap: 10px;
443        margin-top: 20px;
444    }
445
446    .modal.bootstrap3-modal#authModal .btn {
447        display: inline-block;
448        padding: 6px 12px;
449        margin-bottom: 0;
450        font-size: 14px;
451        font-weight: 400;
452        line-height: 1.42857143;
453        text-align: center;
454        white-space: nowrap;
455        vertical-align: middle;
456        cursor: pointer;
457        user-select: none;
458        background-image: none;
459        border: 1px solid transparent;
460        border-radius: 4px;
461    }
462
463    .modal.bootstrap3-modal#authModal .btn-primary {
464        color: #fff;
465        background-color: #337ab7;
466        border-color: #2e6da4;
467    }
468
469    .modal.bootstrap3-modal#authModal .btn-primary:hover,
470    .modal.bootstrap3-modal#authModal .btn-primary:focus {
471        color: #fff;
472        background-color: #286090;
473        border-color: #204d74;
474    }
475
476    .modal.bootstrap3-modal#authModal .btn-default {
477        color: #333;
478        background-color: #fff;
479        border-color: #ccc;
480    }
481
482    .modal.bootstrap3-modal#authModal .btn-default:hover,
483    .modal.bootstrap3-modal#authModal .btn-default:focus {
484        color: #333;
485        background-color: #e6e6e6;
486        border-color: #adadad;
487    }
488
489    .modal.bootstrap3-modal#authModal .invalid-feedback {
490        display: block;
491        margin-top: 5px;
492        margin-bottom: 10px;
493        color: #a94442;
494        font-size: 12px;
495    }
496
497    .modal.bootstrap3-modal#authModal .form-control.is-invalid {
498        border-color: #a94442;
499    }
500
501    .modal.bootstrap3-modal#authModal .form-control.is-invalid:focus {
502        border-color: #a94442;
503        box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px rgba(169, 68, 66, 0.6);
504    }
505
506    .modal.bootstrap3-modal#authModal .form-check {
507        margin-top: 10px;
508        margin-bottom: 10px;
509    }
510
511    .modal.bootstrap3-modal#authModal .form-check-input {
512        margin-top: 4px;
513        margin-right: 5px;
514    }
515
516    .modal.bootstrap3-modal#authModal .form-check-label {
517        font-weight: 400;
518        font-size: 14px;
519        margin-left: 0;
520    }
521
522    .modal.bootstrap3-modal#authModal .captcha {
523        margin-bottom: 10px;
524    }
525
526    .modal.bootstrap3-modal#authModal .captcha span {
527        display: block;
528    }
529
530    .modal.bootstrap3-modal#authModal .text-right {
531        text-align: right;
532    }
533
534    .modal.bootstrap3-modal#authModal .row {
535        margin-left: -15px;
536        margin-right: -15px;
537    }
538
539    .modal.bootstrap3-modal#authModal .col-xs-6 {
540        position: relative;
541        min-height: 1px;
542        padding-left: 15px;
543        padding-right: 15px;
544        float: left;
545        width: 50%;
546    }
547
548    /* Фикс для backdrop в Bootstrap 3 */
549    .modal.bootstrap3-modal#authModal ~ .modal-backdrop {
550        z-index: 1040 !important;
551    }
552
553    .modal.bootstrap3-modal#authModal {
554        z-index: 1050 !important;
555    }
556</style>
557
558<script>
559    document.addEventListener('DOMContentLoaded', function() {
560        const authModalElement = document.getElementById('authModal');
561        if (!authModalElement) return;
562
563        // Инициализация модалки: Bootstrap 5 или Bootstrap 3 (jQuery)
564        let authModal;
565        if (typeof bootstrap !== 'undefined' && bootstrap.Modal) {
566            // Bootstrap 5
567            authModal = new bootstrap.Modal(authModalElement, {
568                backdrop: true,
569                keyboard: true
570            });
571        } else if (typeof $ !== 'undefined' && $.fn.modal) {
572            // Bootstrap 3 через jQuery - используем jQuery методы
573            // Инициализируем модальное окно Bootstrap 3
574            $(authModalElement).modal({
575                show: false,
576                backdrop: true,
577                keyboard: true
578            });
579
580            // Создаем объект для совместимости с кодом ниже
581            authModal = {
582                show: function() {
583                    $(authModalElement).modal('show');
584                },
585                hide: function() {
586                    $(authModalElement).modal('hide');
587                }
588            };
589
590            // Обработчик клика на кнопку закрытия для Bootstrap 3
591            // Используем несколько подходов для надежности
592
593            // 1. Привязываем напрямую к кнопке закрытия
594            function attachCloseHandler() {
595                const $closeBtn = $(authModalElement).find('.close, [data-dismiss="modal"]');
596                if ($closeBtn.length > 0) {
597                    $closeBtn.off('click.authModalClose').on('click.authModalClose', function(e) {
598                        e.preventDefault();
599                        e.stopPropagation();
600                        e.stopImmediatePropagation();
601                        $(authModalElement).modal('hide');
602                        return false;
603                    });
604                }
605            }
606
607            // Привязываем сразу
608            attachCloseHandler();
609            // Привязываем еще раз после небольшой задержки на случай если DOM еще не готов
610            setTimeout(attachCloseHandler, 50);
611
612            // 2. Используем делегирование на document с высоким приоритетом
613            $(document).off('click.authModalClose', '#authModal .close, #authModal [data-dismiss="modal"]')
614                .on('click.authModalClose', '#authModal .close, #authModal [data-dismiss="modal"]', function(e) {
615                    e.preventDefault();
616                    e.stopPropagation();
617                    e.stopImmediatePropagation();
618                    $(authModalElement).modal('hide');
619                    return false;
620                });
621
622            // 3. Обработчик при показе модального окна (на случай если кнопка добавляется динамически)
623            $(authModalElement).on('shown.bs.modal', function() {
624                attachCloseHandler();
625            });
626        } else {
627            // Fallback: просто показываем/скрываем через CSS
628            authModal = {
629                show: function() {
630                    authModalElement.style.display = 'block';
631                    authModalElement.classList.add('show');
632                    document.body.classList.add('modal-open');
633                },
634                hide: function() {
635                    authModalElement.style.display = 'none';
636                    authModalElement.classList.remove('show');
637                    document.body.classList.remove('modal-open');
638                }
639            };
640
641            // Обработчик клика на кнопку закрытия для fallback
642            const closeBtn = authModalElement.querySelector('.close, [data-dismiss="modal"]');
643            if (closeBtn) {
644                closeBtn.addEventListener('click', function(e) {
645                    e.preventDefault();
646                    e.stopPropagation();
647                    authModal.hide();
648                });
649            }
650        }
651
652        // Обновление CSRF токена при открытии модального окна
653        authModalElement.addEventListener('show.bs.modal', function () {
654            refreshCsrfToken();
655        });
656
657        // Для Bootstrap 3 (jQuery)
658        if (typeof $ !== 'undefined') {
659            $(authModalElement).on('show.bs.modal', function () {
660                refreshCsrfToken();
661            });
662        }
663
664        // Переменная для отслеживания времени последнего обновления токена
665        let lastTokenRefresh = Date.now();
666        const TOKEN_REFRESH_INTERVAL = 60000; // 1 минута
667
668        // Функция для обновления CSRF токена
669        function refreshCsrfToken(force = false) {
670            // Если токен недавно обновлялся и не принудительный вызов, пропускаем
671            if (!force && (Date.now() - lastTokenRefresh) < TOKEN_REFRESH_INTERVAL) {
672                return Promise.resolve();
673            }
674
675            return fetch('/csrf-token', {
676                method: 'GET',
677                headers: {
678                    'X-Requested-With': 'XMLHttpRequest',
679                    'Accept': 'application/json'
680                }
681            })
682            .then(response => response.json())
683            .then(data => {
684                if (data.csrf_token) {
685                    const csrfInput = authModalElement.querySelector('input[name="_token"]');
686                    if (csrfInput) {
687                        csrfInput.value = data.csrf_token;
688                    }
689                    // Также обновляем meta тег если есть
690                    const metaCsrf = document.querySelector('meta[name="csrf-token"]');
691                    if (metaCsrf) {
692                        metaCsrf.setAttribute('content', data.csrf_token);
693                    }
694                    lastTokenRefresh = Date.now();
695                }
696            })
697            .catch(error => {
698                console.log('Не удалось обновить CSRF токен, будет использован текущий:', error);
699            });
700        }
701
702        // Обновление токена при фокусе на вкладке браузера
703        document.addEventListener('visibilitychange', function() {
704            if (!document.hidden) {
705                // Вкладка стала активной - обновляем токен если прошло достаточно времени
706                refreshCsrfToken();
707            }
708        });
709
710        // Обновление токена при фокусе на окно
711        window.addEventListener('focus', function() {
712            refreshCsrfToken();
713        });
714
715        // Обработка обновления капчи
716        const refreshCaptchaBtn = document.getElementById('refresh-captcha');
717        if (refreshCaptchaBtn) {
718            refreshCaptchaBtn.addEventListener('click', function(e) {
719                e.preventDefault();
720                e.stopPropagation();
721                e.stopImmediatePropagation();
722
723                const captchaContainer = document.querySelector('#authModal .captcha span');
724                const captchaInput = document.getElementById('basic-form-captcha');
725
726                if (!captchaContainer) {
727                    console.error('Контейнер капчи не найден');
728                    return false;
729                }
730
731                // Очищаем поле ввода капчи перед обновлением
732                if (captchaInput) {
733                    captchaInput.value = '';
734                }
735
736                fetch('/captcha-refresh', {
737                    method: 'GET',
738                    headers: {
739                        'X-Requested-With': 'XMLHttpRequest',
740                        'Accept': 'application/json'
741                    }
742                })
743                .then(response => {
744                    if (!response.ok) {
745                        throw new Error('Network response was not ok: ' + response.status);
746                    }
747                    return response.json();
748                })
749                .then(data => {
750                    if (data && typeof data === 'object' && 'captcha' in data) {
751                        if (data.captcha) {
752                            captchaContainer.innerHTML = data.captcha;
753                        } else {
754                            console.error('Капча пустая в ответе:', data);
755                            location.reload();
756                        }
757                    } else {
758                        console.error('Неверный формат ответа (ожидается объект с полем captcha):', data);
759                        location.reload();
760                    }
761                })
762                .catch(error => {
763                    console.error('Ошибка обновления капчи:', error);
764                    // Fallback: перезагружаем страницу для обновления капчи
765                    location.reload();
766                });
767
768                return false;
769            });
770        }
771
772        // ALTCHA (proof-of-work «не робот», auth.partials.altcha). Наш submit-обработчик перехватывает форму
773        // раньше виджета, поэтому решение запускаем и ждём сами.
774        async function altchaReady(form) {
775            const widget = form.querySelector('altcha-widget');
776            if (!widget || typeof widget.getState !== 'function' || widget.getState() === 'verified') {
777                return;
778            }
779            if (widget.getState() !== 'verifying') {
780                await widget.verify();
781                return;
782            }
783            // Уже решается (старт по фокусу) — ждём конец, не перезапуская задачу.
784            await new Promise(resolve => {
785                const done = () => { widget.removeEventListener('statechange', onState); resolve(); };
786                const onState = e => { if (e.detail && e.detail.state !== 'verifying') done(); };
787                widget.addEventListener('statechange', onState);
788                setTimeout(done, 20000);
789            });
790        }
791        function resetAltcha(form) {
792            const widget = form.querySelector('altcha-widget');
793            if (widget && typeof widget.reset === 'function') {
794                widget.reset();
795                widget.verify();
796            }
797        }
798
799        // Обработка отправки формы
800        const authForm = document.getElementById('authForm');
801        if (authForm) {
802            // useCapture=true: срабатываем в фазе захвата до jQuery-обработчиков (shop.new.js)
803            // stopImmediatePropagation предотвращает двойной AJAX из legacy JS
804            authForm.addEventListener('submit', function(e) {
805                e.preventDefault();
806                e.stopImmediatePropagation();
807
808                const submitBtn = this.querySelector('button[type="submit"]');
809                const originalText = submitBtn.textContent;
810                submitBtn.disabled = true;
811                submitBtn.textContent = 'Вход...';
812
813                // Очистка предыдущих ошибок
814                document.querySelectorAll('#authForm .invalid-feedback').forEach(el => {
815                    el.textContent = '';
816                    el.style.display = 'none';
817                });
818                document.querySelectorAll('#authForm .is-invalid').forEach(el => {
819                    el.classList.remove('is-invalid');
820                });
821
822                // Обновляем CSRF токен перед отправкой (принудительно)
823                const formElement = this;
824                refreshCsrfToken(true).then(async () => {
825                    // ALTCHA: если проверка «не робот» ещё не закончилась — дожидаемся её решения.
826                    await altchaReady(formElement);
827                    // После обновления токена отправляем форму
828                    const formData = new FormData(formElement);
829
830                    fetch(formElement.action, {
831                    method: 'POST',
832                    body: formData,
833                    headers: {
834                        'X-Requested-With': 'XMLHttpRequest'
835                    }
836                })
837                .then(response => {
838                    // Обработка ошибки 419 - CSRF протух, перезагружаем страницу
839                    if (response.status === 419) {
840                        location.reload();
841                        return;
842                    }
843                    return response.json();
844                })
845                .then(data => {
846                    if (!data) return; // Если был reload, data будет undefined
847
848                    if (data.success) {
849                        const redirectUrl = (data.data && data.data.redirect_url) ? data.data.redirect_url : null;
850                        try {
851                            authModal.hide();
852                        } catch (e) {
853                            console.error('Modal hide error:', e);
854                        }
855                        if (redirectUrl) {
856                            window.location.href = redirectUrl;
857                        } else {
858                            location.reload();
859                        }
860                        return;
861                    } else {
862                        // Решение ALTCHA одноразовое: после отказа берём новую задачу.
863                        resetAltcha(formElement);
864                        // Показываем ошибки
865                        if (data.errors) {
866                            Object.keys(data.errors).forEach(field => {
867                                const input = document.getElementById('basic-form-' + field);
868                                const errorDiv = document.getElementById(field + 'Error');
869                                if (input && errorDiv) {
870                                    input.classList.add('is-invalid');
871                                    errorDiv.textContent = data.errors[field][0];
872                                    errorDiv.style.display = 'block';
873                                }
874                            });
875                        }
876                        submitBtn.disabled = false;
877                        submitBtn.textContent = originalText;
878                    }
879                })
880                    .catch(error => {
881                        console.error('Ошибка авторизации:', error);
882                        resetAltcha(formElement);
883                        submitBtn.disabled = false;
884                        submitBtn.textContent = originalText;
885                        alert('Ошибка авторизации. Попробуйте ещё раз.');
886                    });
887                }).catch(error => {
888                    // Ошибка при обновлении CSRF токена
889                    console.error('Ошибка обновления токена:', error);
890                    submitBtn.disabled = false;
891                    submitBtn.textContent = originalText;
892                    alert('Не удалось обновить токен. Попробуйте перезагрузить страницу.');
893                });
894            }, true); // useCapture: перехватываем до jQuery (shop.new.js)
895        }
896    });
897</script>
vendor: 1 bytes, line 897
897
898<script>
899    $(function () {
900        var $link = $('a[data-toggle="modal"][data-target="#authModal"]');
901        if (!$link.length) return;
902        $link.off('click.bs.modal').on('click.openLoginInsteadModal', function (e) {
903            e.preventDefault();
904            window.location.href = "https://ptsell.com/ru/shop-signin";
905        });
906    });
907</script>
907
908    <div class="container">
909        <div class="row">
910            <div class="col-md-12">
911                    <div class="row row-block row-block-header">
912        <div class="col-md-12">
913                            <h3 style="text-align:center;">Main site currency: Russian Ruble</h3><h4 style="text-align:center;">To convert to other currencies, use the: <a href="https://www.xe.com/currencyconverter/convert/?Amount=1&amp;From=RUB&amp;To=USD" target="_blank" rel="noreferrer noopener"><u><b>xe.com/rub-&gt;usd</b></u></a></h4>
914                    </div>
915    </div>
916
917
918    <div class="row">
919        <h1 style="display: none;">Hawaiian Airlines Miles</h1>
920        <div class="col-md-3">
921        <div class="nav nav-cat ">
922            <div class="list-group">
923                <a href="https://liavelru.rents.ac/" class="other-buttons-color list-group-item  active  ">
924                    <span class="fa fa-diamond"></span> Все&nbsp;
925                    <span class="badge alert-success">524</span>
926                </a>
927
928                                                            <a href="https://ptsell.com/ru/category/hawaiianairlines"
929                           class="other-buttons-color list-group-item  active ">
930                            <span class="fa fa-bookmark"></span>Hawaiian Airlines&nbsp;<span
931                                class="badge alert-success">3</span>
932                        </a>
933                    
934
935
936
937
938                                                            <a href="https://ptsell.com/ru/category/american-airlines-aadvantage"
939                           class="other-buttons-color list-group-item ">
940                            <span class="fa fa-bookmark"></span>American Airlines [AAdvantage]&nbsp;<span
941                                class="badge alert-success">29</span>
942                        </a>
943                    
944
945
946
947
948                                                            <a href="https://ptsell.com/ru/category/qatar-airways"
949                           class="other-buttons-color list-group-item ">
950                            <span class="fa fa-bookmark"></span>Qatar Airways&nbsp;<span
951                                class="badge alert-success">16</span>
952                        </a>
953                    
954
955
956
957
958                                                            <a href="https://ptsell.com/ru/category/air-canada-aeroplan"
959                           class="other-buttons-color list-group-item ">
960                            <span class="fa fa-bookmark"></span>Air Canada (Aeroplan)&nbsp;<span
961                                class="badge alert-success">26</span>
962                        </a>
963                    
964
965
966
967
968                                                            <a href="https://ptsell.com/ru/category/air-france-flying-blue-klm-transavia"
969                           class="other-buttons-color list-group-item ">
970                            <span class="fa fa-bookmark"></span>Air France (Flying Blue | KLM | Transavia)&nbsp;<span
971                                class="badge alert-success">3</span>
972                        </a>
973                    
974
975
976
977
978                                                            <a href="https://ptsell.com/ru/category/aerolineas"
979                           class="other-buttons-color list-group-item ">
980                            <span class="fa fa-bookmark"></span>Aerolineas&nbsp;<span
981                                class="badge alert-success">9</span>
982                        </a>
983                    
984
985
986
987
988                                                            <a href="https://ptsell.com/ru/category/flydubai-emirates-skywards-miles"
989                           class="other-buttons-color list-group-item ">
990                            <span class="fa fa-bookmark"></span>FlyDubai | Emirates | Skywards Miles&nbsp;<span
991                                class="badge alert-success">16</span>
992                        </a>
993                    
994
995
996
997
998                                                            <a href="https://ptsell.com/ru/category/british-airways"
999                           class="other-buttons-color list-group-item ">
1000                            <span class="fa fa-bookmark"></span>British Airways&nbsp;<span
1001                                class="badge alert-success">14</span>
1002                        </a>
1003                    
1004
1005
1006
1007
1008                                                            <a href="https://ptsell.com/ru/category/united-airlines"
1009                           class="other-buttons-color list-group-item ">
1010                            <span class="fa fa-bookmark"></span>UNITED AIRLINES&nbsp;<span
1011                                class="badge alert-success">11</span>
1012                        </a>
1013                    
1014
1015
1016
1017
1018                                                            <a href="https://ptsell.com/ru/category/turkishairlines"
1019                           class="other-buttons-color list-group-item ">
1020                            <span class="fa fa-bookmark"></span>TurkishAirlines&nbsp;<span
1021                                class="badge alert-success">20</span>
1022                        </a>
1023                    
1024
1025
1026
1027
1028                                                            <a href="https://ptsell.com/ru/category/southwest-airlines"
1029                           class="other-buttons-color list-group-item ">
1030                            <span class="fa fa-bookmark"></span>SouthWest Airlines&nbsp;<span
1031                                class="badge alert-success">21</span>
1032                        </a>
1033                    
1034
1035
1036
1037
1038                                                            <a href="https://ptsell.com/ru/category/smiles-com-br-gol-airlines-voegol"
1039                           class="other-buttons-color list-group-item ">
1040                            <span class="fa fa-bookmark"></span>Smiles Com BR | GOL Airlines | Voegol&nbsp;<span
1041                                class="badge alert-success">11</span>
1042                        </a>
1043                    
1044
1045
1046
1047
1048                                                            <a href="https://ptsell.com/ru/category/accor-hotels-rixos-novotel-sofitel-and-more"
1049                           class="other-buttons-color list-group-item ">
1050                            <span class="fa fa-bookmark"></span>Accor Hotels (Rixos, Novotel, Sofitel &amp; more)&nbsp;<span
1051                                class="badge alert-success">24</span>
1052                        </a>
1053                    
1054
1055
1056
1057
1058                                                            <a href="https://ptsell.com/ru/category/lifemiles-avianca"
1059                           class="other-buttons-color list-group-item ">
1060                            <span class="fa fa-bookmark"></span>Lifemiles (Avianca)&nbsp;<span
1061                                class="badge alert-success">21</span>
1062                        </a>
1063                    
1064
1065
1066
1067
1068                                                            <a href="https://ptsell.com/ru/category/ethiopian-airlines-sheba-miles"
1069                           class="other-buttons-color list-group-item ">
1070                            <span class="fa fa-bookmark"></span>Ethiopian Airlines [Sheba Miles]&nbsp;<span
1071                                class="badge alert-success">19</span>
1072                        </a>
1073                    
1074
1075
1076
1077
1078                                                            <a href="https://ptsell.com/ru/category/korean-air-skypass-club"
1079                           class="other-buttons-color list-group-item ">
1080                            <span class="fa fa-bookmark"></span>KOREAN AIR (SKYPASS Club)&nbsp;<span
1081                                class="badge alert-success">4</span>
1082                        </a>
1083                    
1084
1085
1086
1087
1088                                                            <a href="https://ptsell.com/ru/category/bestwestern"
1089                           class="other-buttons-color list-group-item ">
1090                            <span class="fa fa-bookmark"></span>BestWestern&nbsp;<span
1091                                class="badge alert-success">2</span>
1092                        </a>
1093                    
1094
1095
1096
1097
1098                                                            <a href="https://ptsell.com/ru/category/ihg-and-holidayinn-club"
1099                           class="other-buttons-color list-group-item ">
1100                            <span class="fa fa-bookmark"></span>IHG &amp; HolidayInn Club&nbsp;<span
1101                                class="badge alert-success">4</span>
1102                        </a>
1103                    
1104
1105
1106
1107
1108                                                            <a href="https://ptsell.com/ru/category/all-nipon-airlines-anacojp"
1109                           class="other-buttons-color list-group-item ">
1110                            <span class="fa fa-bookmark"></span>All Nipon Airlines [ANA.CO.JP]&nbsp;<span
1111                                class="badge alert-success">2</span>
1112                        </a>
1113                    
1114
1115
1116
1117
1118                                                            <a href="https://ptsell.com/ru/category/marriot-bonvoy"
1119                           class="other-buttons-color list-group-item ">
1120                            <span class="fa fa-bookmark"></span>Marriot Bonvoy&nbsp;<span
1121                                class="badge alert-success">12</span>
1122                        </a>
1123                    
1124
1125
1126
1127
1128                                                            <a href="https://ptsell.com/ru/category/delta-airlines-skymiles"
1129                           class="other-buttons-color list-group-item ">
1130                            <span class="fa fa-bookmark"></span>Delta Airlines | Skymiles&nbsp;<span
1131                                class="badge alert-success">18</span>
1132                        </a>
1133                    
1134
1135
1136
1137
1138                                                            <a href="https://ptsell.com/ru/category/aeromexico-clubpremier"
1139                           class="other-buttons-color list-group-item ">
1140                            <span class="fa fa-bookmark"></span>AeroMexico (ClubPremier)&nbsp;<span
1141                                class="badge alert-success">13</span>
1142                        </a>
1143                    
1144
1145
1146
1147
1148                                                            <a href="https://ptsell.com/ru/category/alaska-airlines-mileage-plan"
1149                           class="other-buttons-color list-group-item ">
1150                            <span class="fa fa-bookmark"></span>Alaska Airlines [Mileage Plan]&nbsp;<span
1151                                class="badge alert-success">39</span>
1152                        </a>
1153                    
1154
1155
1156
1157
1158                                                            <a href="https://ptsell.com/ru/category/hilton"
1159                           class="other-buttons-color list-group-item ">
1160                            <span class="fa fa-bookmark"></span>HILTON&nbsp;<span
1161                                class="badge alert-success">9</span>
1162                        </a>
1163                    
1164
1165
1166
1167
1168                                                            <a href="https://ptsell.com/ru/category/jetblue-trueblue"
1169                           class="other-buttons-color list-group-item ">
1170                            <span class="fa fa-bookmark"></span>JetBlue - TrueBlue&nbsp;<span
1171                                class="badge alert-success">22</span>
1172                        </a>
1173                    
1174
1175
1176
1177
1178                                                            <a href="https://ptsell.com/ru/category/flytap-tap-portugal"
1179                           class="other-buttons-color list-group-item ">
1180                            <span class="fa fa-bookmark"></span>FlyTAP | TAP Portugal&nbsp;<span
1181                                class="badge alert-success">11</span>
1182                        </a>
1183                    
1184
1185
1186
1187
1188                                                            <a href="https://ptsell.com/ru/category/hotelscom-expedia-vrbo"
1189                           class="other-buttons-color list-group-item ">
1190                            <span class="fa fa-bookmark"></span>Hotels.com | Expedia | VRBO&nbsp;<span
1191                                class="badge alert-success">1</span>
1192                        </a>
1193                    
1194
1195
1196
1197
1198                                                            <a href="https://ptsell.com/ru/category/gift-cards"
1199                           class="other-buttons-color list-group-item ">
1200                            <span class="fa fa-bookmark"></span>Gift Cards&nbsp;<span
1201                                class="badge alert-success">4</span>
1202                        </a>
1203                    
1204
1205
1206
1207
1208                                                            <a href="https://ptsell.com/ru/category/ita-airways-volare-points"
1209                           class="other-buttons-color list-group-item ">
1210                            <span class="fa fa-bookmark"></span>ITA Airways [Volare Points]&nbsp;<span
1211                                class="badge alert-success">2</span>
1212                        </a>
1213                    
1214
1215
1216
1217
1218                                                            <a href="https://ptsell.com/ru/category/japan-airlines-jal"
1219                           class="other-buttons-color list-group-item ">
1220                            <span class="fa fa-bookmark"></span>Japan Airlines - JAL&nbsp;<span
1221                                class="badge alert-success">1</span>
1222                        </a>
1223                    
1224
1225
1226
1227
1228                                                            <a href="https://ptsell.com/ru/category/west-jet-westjet"
1229                           class="other-buttons-color list-group-item ">
1230                            <span class="fa fa-bookmark"></span>West Jet | WestJet&nbsp;<span
1231                                class="badge alert-success">11</span>
1232                        </a>
1233                    
1234
1235
1236
1237
1238                                                            <a href="https://ptsell.com/ru/category/miles-and-more-lufthansa-austrian-lot-swiss-airlines"
1239                           class="other-buttons-color list-group-item ">
1240                            <span class="fa fa-bookmark"></span>Miles &amp; More [Lufthansa, Austrian, Lot, Swiss Airlines]&nbsp;<span
1241                                class="badge alert-success">29</span>
1242                        </a>
1243                    
1244
1245
1246
1247
1248                                                            <a href="https://ptsell.com/ru/category/airmilesca-collectors"
1249                           class="other-buttons-color list-group-item ">
1250                            <span class="fa fa-bookmark"></span>AirMiles.ca | Collectors&nbsp;<span
1251                                class="badge alert-success">1</span>
1252                        </a>
1253                    
1254
1255
1256
1257
1258                                                            <a href="https://ptsell.com/ru/category/finnair"
1259                           class="other-buttons-color list-group-item ">
1260                            <span class="fa fa-bookmark"></span>FinnAIr&nbsp;<span
1261                                class="badge alert-success">5</span>
1262                        </a>
1263                    
1264
1265
1266
1267
1268                                                            <a href="https://ptsell.com/ru/category/pia-pakistan-int-airlines"
1269                           class="other-buttons-color list-group-item ">
1270                            <span class="fa fa-bookmark"></span>PIA - Pakistan Int. Airlines&nbsp;<span
1271                                class="badge alert-success">2</span>
1272                        </a>
1273                    
1274
1275
1276
1277
1278                                                            <a href="https://ptsell.com/ru/category/egypt-air-plus"
1279                           class="other-buttons-color list-group-item ">
1280                            <span class="fa fa-bookmark"></span>Egypt Air Plus&nbsp;<span
1281                                class="badge alert-success">3</span>
1282                        </a>
1283                    
1284
1285
1286
1287
1288                                                            <a href="https://ptsell.com/ru/category/spirit-airlines"
1289                           class="other-buttons-color list-group-item ">
1290                            <span class="fa fa-bookmark"></span>Spirit Airlines&nbsp;<span
1291                                class="badge alert-success">3</span>
1292                        </a>
1293                    
1294
1295
1296
1297
1298                                                            <a href="https://ptsell.com/ru/category/hyatt"
1299                           class="other-buttons-color list-group-item ">
1300                            <span class="fa fa-bookmark"></span>Hyatt&nbsp;<span
1301                                class="badge alert-success">3</span>
1302                        </a>
1303                    
1304
1305
1306
1307
1308                                                            <a href="https://ptsell.com/ru/category/copa-ailrines-connect-miles"
1309                           class="other-buttons-color list-group-item ">
1310                            <span class="fa fa-bookmark"></span>Copa Ailrines | Connect Miles&nbsp;<span
1311                                class="badge alert-success">2</span>
1312                        </a>
1313                    
1314
1315
1316
1317
1318                                                            <a href="https://ptsell.com/ru/category/air-vistara-vistara-club"
1319                           class="other-buttons-color list-group-item ">
1320                            <span class="fa fa-bookmark"></span>Air Vistara (Vistara Club)&nbsp;<span
1321                                class="badge alert-success">3</span>
1322                        </a>
1323                    
1324
1325
1326
1327
1328                                                            <a href="https://ptsell.com/ru/category/airindia"
1329                           class="other-buttons-color list-group-item ">
1330                            <span class="fa fa-bookmark"></span>AirIndia&nbsp;<span
1331                                class="badge alert-success">4</span>
1332                        </a>
1333                    
1334
1335
1336
1337
1338                                                            <a href="https://ptsell.com/ru/category/virginaustralia-velocityfrequentflyer"
1339                           class="other-buttons-color list-group-item ">
1340                            <span class="fa fa-bookmark"></span>VirginAustralia | VelocityFrequentFlyer&nbsp;<span
1341                                class="badge alert-success">4</span>
1342                        </a>
1343                    
1344
1345
1346
1347
1348                                                            <a href="https://ptsell.com/ru/category/virgin-atlantic-flying-club"
1349                           class="other-buttons-color list-group-item ">
1350                            <span class="fa fa-bookmark"></span>Virgin Atlantic - Flying Club&nbsp;<span
1351                                class="badge alert-success">12</span>
1352                        </a>
1353                    
1354
1355
1356
1357
1358                                                            <a href="https://ptsell.com/ru/category/etihad-airways-etihad-guest"
1359                           class="other-buttons-color list-group-item ">
1360                            <span class="fa fa-bookmark"></span>Etihad Airways - Etihad Guest&nbsp;<span
1361                                class="badge alert-success">1</span>
1362                        </a>
1363                    
1364
1365
1366
1367
1368                                                            <a href="https://ptsell.com/ru/category/srilankan-airways-flysmiles"
1369                           class="other-buttons-color list-group-item ">
1370                            <span class="fa fa-bookmark"></span>Srilankan AIrways - FlySmiles&nbsp;<span
1371                                class="badge alert-success">8</span>
1372                        </a>
1373                    
1374
1375
1376
1377
1378                                                            <a href="https://ptsell.com/ru/category/royalairmaroc-safar-flyer-miles"
1379                           class="other-buttons-color list-group-item ">
1380                            <span class="fa fa-bookmark"></span>RoyalAirMaroc - Safar Flyer Miles&nbsp;<span
1381                                class="badge alert-success">13</span>
1382                        </a>
1383                    
1384
1385
1386
1387
1388                                                            <a href="https://ptsell.com/ru/category/aireuropa-suma"
1389                           class="other-buttons-color list-group-item ">
1390                            <span class="fa fa-bookmark"></span>AirEuropa SUMA&nbsp;<span
1391                                class="badge alert-success">7</span>
1392                        </a>
1393                    
1394
1395
1396
1397
1398                                                            <a href="https://ptsell.com/ru/category/allegiant-air-allegiantaircom"
1399                           class="other-buttons-color list-group-item ">
1400                            <span class="fa fa-bookmark"></span>Allegiant Air - allegiantair.com&nbsp;<span
1401                                class="badge alert-success">3</span>
1402                        </a>
1403                    
1404
1405
1406
1407
1408                                                            <a href="https://ptsell.com/ru/category/iberia"
1409                           class="other-buttons-color list-group-item ">
1410                            <span class="fa fa-bookmark"></span>Iberia&nbsp;<span
1411                                class="badge alert-success">6</span>
1412                        </a>
1413                    
1414
1415
1416
1417
1418                                                            <a href="https://ptsell.com/ru/category/eva-air"
1419                           class="other-buttons-color list-group-item ">
1420                            <span class="fa fa-bookmark"></span>EVA Air&nbsp;<span
1421                                class="badge alert-success">6</span>
1422                        </a>
1423                    
1424
1425
1426
1427
1428                                                            <a href="https://ptsell.com/ru/category/frontier-airlines-flyfrontier"
1429                           class="other-buttons-color list-group-item ">
1430                            <span class="fa fa-bookmark"></span>Frontier Airlines | FlyFrontier&nbsp;<span
1431                                class="badge alert-success">3</span>
1432                        </a>
1433                    
1434
1435
1436
1437
1438                                                            <a href="https://ptsell.com/ru/category/singapore-kris"
1439                           class="other-buttons-color list-group-item ">
1440                            <span class="fa fa-bookmark"></span>Singapor e Airlines [KrisFLyer]&nbsp;<span
1441                                class="badge alert-success">1</span>
1442                        </a>
1443                    
1444
1445
1446
1447
1448                                                            <a href="https://ptsell.com/ru/category/falconflyer"
1449                           class="other-buttons-color list-group-item ">
1450                            <span class="fa fa-bookmark"></span>GulfAir - FalconFLyer&nbsp;<span
1451                                class="badge alert-success">2</span>
1452                        </a>
1453                    
1454
1455
1456
1457
1458                                                            <a href="https://ptsell.com/ru/category/scandichotels"
1459                           class="other-buttons-color list-group-item ">
1460                            <span class="fa fa-bookmark"></span>ScandicHotels - Scandic Friends&nbsp;<span
1461                                class="badge alert-success">1</span>
1462                        </a>
1463                    
1464
1465
1466
1467
1468                                                            <a href="https://ptsell.com/ru/category/rwandamiles"
1469                           class="other-buttons-color list-group-item ">
1470                            <span class="fa fa-bookmark"></span>RwandaAIr - DreamMiles&nbsp;<span
1471                                class="badge alert-success">1</span>
1472                        </a>
1473                    
1474
1475
1476
1477
1478                                                            <a href="https://ptsell.com/ru/category/flysas"
1479                           class="other-buttons-color list-group-item ">
1480                            <span class="fa fa-bookmark"></span>FlySAS - Scandinavian Airlines&nbsp;<span
1481                                class="badge alert-success">0</span>
1482                        </a>
1483                    
1484
1485
1486
1487
1488                
1489            </div>
1490        </div>
1491    </div>
1492
1493        <div class="col-md-9 ">
1494                                                <div data-goods-region data-goods-container="tbody">
1495<table class="table table-bordered shop_goods"
1496       >
1497    <tr>
1498        <th>Товар</th>
1499        <th>Кол-во</th>
1500        <th>За 1 шт.</th>
1501        <th></th>
1502    </tr>
1503                        <tr class="separator" data-goods-item>
1504                <td colspan="4" class="text-center">
1505                    Hawaiian Airlines Miles
1506                </td>
1507            </tr>
1508            
1509            <tr>
1510            <td colspan="4" class="">
1511                
1512            </td>
1513        </tr>
1514    </table>
1515
1516</div>
1517                            
1518        </div>
1519    </div>
1520
1521    <div class="row row-block row-block-footer">
1522        <div class="col-md-12">
1523                            <p style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:14px;"><strong>CASH-BACK.BIZ.UA - Продажа разнообразных аккаунтов с милями, бонусами, поинтами<br /><br /><img alt="" src="https://upload.wikimedia.org/wikipedia/commons/5/5c/Telegram_Messenger.png" style="height:20px;width:20px;" />CHANNEL_TELEGRAM: <a href="https://t.me/joinchat/AAAAAEL8s5_zaE5Yyrm9xA" style="background-size:initial;">@cash-back.biz.ua</a><br /></strong></p><h3><span style="font-size:9px;color:rgb(51,51,51);"><span style="font-weight:700;"><img alt="" src="https://upload.wikimedia.org/wikipedia/commons/5/5c/Telegram_Messenger.png" style="height:20px;width:20px;" /></span></span><span style="font-size:11px;color:rgb(51,51,51);"><span style="font-weight:700;"> </span></span><span style="font-size:12px;"><span style="font-weight:700;">Contact Telegram:</span> <a href="https://t.me/airlinesmiless" style="background-size:initial;">@airlinesmiless</a></span></h3><p><br /><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:12px;"></span></p>
1524                    </div>
1525    </div>
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543            
1543<script>
1544            $(function () {
1545                $('.separator').each(function () {
1546                    var el = $(this).prev('tr');
1547                    if (el.hasClass("separator")) {
1548                        el.remove();
1549                    }
1550                });
1551            });
1552        </script>
1552
1553    
1554            </div>
1555        </div>
1556    </div>
1557<div id="quantity-modal-template" class="modal" tabindex="-1" role="dialog" style="display: none;">
1558        <div class="modal-backdrop fade in"></div>
1559        <div class="modal-dialog" role="document">
1560            <div class="modal-content">
1561
1562                <div class="modal-header">
1563                    <button type="button" class="close" aria-label="Close">
1564                        <span>&times;</span>
1565                    </button>
1566                    <div class="modal-title fw-bold"></div>
1567                </div>
1568
1569                <div class="modal-body">
1570                    <div class="row" style="display: flex; align-items: center;">
1571                        <div class="col-xs-4 text-center">
1572                            <label class="add-to-cart-modal-label">Количество</label>
1573                            <div class="quantity-control" style="display: flex; justify-content: center;">
1574                                <button class="btn btn-outline-secondary btn-sm btn-decrement">-</button>
1575                                <input type="text" class="form-control text-center quantity-input" value="1"
1576                                    style="max-width: 70px;" />
1577                                <button class="btn btn-outline-secondary btn-sm btn-increment">+</button>
1578                            </div>
1579                            <small class="text-muted">
1580                                Доступно: <span class="available-qty">0</span>
1581                            </small>
1582                        </div>
1583                        <div class="col-xs-8">
1584                            <h5 class="product-title"></h5>
1585                        </div>
1586                    </div>
1587                </div>
1588
1589                <div class="modal-footer">
1590                    <button class="btn btn-success btn-block checkout-btn">
1591                        Перейти к оплате (<span
1592                            class="total-price">0,00 ₽</span>)
1593                    </button>
1594                                    </div>
1595
1596            </div>
1597        </div>
1598    </div>
1599    <style>
1600        /* Делаем крестик крупнее */
1601        .modal-header .close {
1602            font-size: 32px;
1603            /* или больше при необходимости */
1604            line-height: 1;
1605            opacity: 0.8;
1606        }
1607
1608        /* Центрируем по вертикали */
1609        .modal-header {
1610            position: relative;
1611            min-height: 50px;
1612            /* обязательно, чтобы был отступ */
1613        }
1614
1615        .modal-header .close {
1616            position: absolute;
1617            top: 50%;
1618            transform: translateY(-50%);
1619            right: 15px;
1620        }
1621
1622        /* Дополнительно — при наведении */
1623        .modal-header .close:hover {
1624            opacity: 1;
1625        }
1626
1627        /* Центрируем модальное окно по вертикали */
1628        .modal {
1629            text-align: center;
1630            padding: 0 !important;
1631        }
1632
1633        /* Нужно для inline-block центрирования */
1634        .modal:before {
1635            content: '';
1636            display: inline-block;
1637            height: 100%;
1638            vertical-align: middle;
1639            margin-right: -4px;
1640            /* чтобы избежать смещения */
1641        }
1642
1643        .modal-dialog {
1644            display: inline-block;
1645            text-align: left;
1646            vertical-align: middle;
1647        }
1648
1649        /* Прячем скролл и не даём прокручивать фон */
1650        body.modal-open {
1651            overflow: hidden;
1652        }
1653
1654        @media (max-width: 767px) {
1655            .modal-dialog {
1656                width: 95%;
1657            }
1658        }
1659    </style>
1660    
1660<script>
1661        $(document).ready(function () {
1662            $('.buy').on('click', function (e) {
1663                e.preventDefault();
1664                const goodId = $(this).data('good-id');
1665                const title = $(this).data('title');
1666                const price = $(this).data('price');
1667
1668                $.post("https://ptsell.com/ru/cart/add", {
1669                    goodId: goodId,
1670                    _token: 'gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q'
1671                }).done(function (response) {
1672                    const modal = openQuantityModal(
1673                        goodId,
1674                        title,
1675                        price,
1676                        response.currentQuantity || 1,
1677                        response.availableQuantity
1678                    );
1679
1680                    // Обновляем цену сразу при открытии модалки
1681                    modal.find('.total-price').text(response.totalPrice);
1682
1683                    // Broadcast событие уже диспатчится в контроллере ShopOrderController::addToCart()
1684                    // Компоненты обновятся автоматически через WebSocket
1685                }).fail(function (xhr) {
1686                    alert(xhr.responseJSON?.message || 'Ошибка при добавлении товара');
1687                });
1688            });
1689        });
1690
1691        function openQuantityModal(goodId, title, price, quantity, availableQuantity) {
1692            const modalHtml = $('#quantity-modal-template')
1693                .clone()
1694                .removeAttr('id')
1695                .attr('id', 'quantity-modal')
1696                .appendTo('body')
1697                .show();
1698
1699            modalHtml.find('.modal-title').text('Товар добавлен в корзину');
1700            modalHtml.find('.product-title').text(title);
1701            modalHtml.find('.available-qty').text(availableQuantity);
1702            modalHtml.find('.checkout-btn').data('good-id', goodId).data('price', price);
1703            modalHtml.find('.quantity-input').val(quantity).data('max', availableQuantity).data('min', 1);
1704
1705            $('body').css('overflow', 'hidden');
1706
1707            modalHtml.find('.close, .modal-backdrop, .continue-shopping').on('click', function () {
1708                modalHtml.remove();
1709                $('body').css('overflow', '');
1710            });
1711
1712            modalHtml.find('.checkout-btn').on('click', function () {
1713                const qty = parseInt(modalHtml.find('.quantity-input').val());
1714                const goodId = $(this).data('good-id');
1715
1716                // Сначала обновляем количество в корзине
1717                $.post("https://ptsell.com/ru/cart/update-quantity", {
1718                    goodId: goodId,
1719                    quantity: qty,
1720                    _token: 'gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q'
1721                }).done(function () {
1722
1723                    window.location.href = 'https://ptsell.com/ru/cart';
1724                });
1725            });
1726
1727            return modalHtml;
1728        }
1729
1730        $(document).on('click', '.btn-decrement', function () {
1731            const modal = $(this).closest('.modal');
1732            const input = modal.find('.quantity-input');
1733            let val = parseInt(input.val()) || 0;
1734            const min = input.data('min') || 1;
1735
1736            if (val > min) {
1737                val -= 1;
1738                input.val(val);
1739                updateCartQuantity(modal, val);
1740            }
1741        });
1742
1743        $(document).on('click', '.btn-increment', function () {
1744            const modal = $(this).closest('.modal');
1745            const input = modal.find('.quantity-input');
1746            let val = parseInt(input.val()) || 0;
1747            const max = input.data('max') || 99;
1748
1749            if (val < max) {
1750                val += 1;
1751                input.val(val);
1752                updateCartQuantity(modal, val);
1753            }
1754        });
1755
1756        let debounceTimeout = null;
1757
1758        function updateCartQuantity(modal, quantity) {
1759            const goodId = modal.find('.checkout-btn').data('good-id');
1760
1761            if (debounceTimeout) clearTimeout(debounceTimeout);
1762            debounceTimeout = setTimeout(() => {
1763                $.post("https://ptsell.com/ru/cart/update-quantity", {
1764                    goodId: goodId,
1765                    quantity: quantity,
1766                    _token: 'gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q'
1767                }).done(function (response) {
1768                    // Обновляем total price в модальном окне
1769                    if (response.totalPrice) {
1770                        modal.find('.total-price').text(response.totalPrice);
1771                    }
1772                }).fail(function (response) {
1773                    alert(response.responseJSON?.message || 'Ошибка обновления количества');
1774                });
1775            }, 300);
1776        }
1777
1778        // Слушаем изменения корзины для синхронизации модалки через Echo
1779        $(document).ready(function () {
1780            if (typeof Echo === 'undefined') {
1781                return;
1782            }
1783
1784            const modalSessionId = 'nLoIQSYoaIjCoTd4pBhsIbS5Czn1pq7VVVkkagxn';
1785            const channelName = 'cart.session.' + modalSessionId;
1786
1787            // Подписываемся на канал один раз при загрузке страницы
1788            // Echo продолжает слушать даже когда вкладка в фоне
1789            Echo.channel(channelName)
1790                .listen('CartUpdated', (event) => {
1791                    // Синхронизируем модалку при получении события
1792                    syncModalQuantityFromCart();
1793                });
1794        });
1795
1796        function syncModalQuantityFromCart() {
1797            const modal = $('#quantity-modal');
1798            if (modal.length === 0 || !modal.is(':visible')) {
1799                return;
1800            }
1801
1802            const goodId = modal.find('.checkout-btn').data('good-id');
1803            if (!goodId) {
1804                return;
1805            }
1806
1807            // Получаем актуальное количество из корзины через AJAX
1808            $.ajax({
1809                url: "https://ptsell.com/ru/cart/get-quantity",
1810                method: 'POST',
1811                data: {
1812                    goodId: goodId,
1813                    _token: 'gM2wT4bPElRiqXG8pVy8rHd8QT5nl5GgSp2R083Q'
1814                },
1815                success: function (response) {
1816                    if (response.success && response.quantity !== undefined) {
1817                        const currentQuantity = parseInt(modal.find('.quantity-input').val());
1818                        const newQuantity = parseInt(response.quantity);
1819
1820                        if (currentQuantity !== newQuantity) {
1821                            modal.find('.quantity-input').val(newQuantity);
1822                        }
1823
1824                        // Обновляем цену
1825                        if (response.totalPrice) {
1826                            modal.find('.total-price').text(response.totalPrice);
1827                        }
1828                    }
1829                },
1830                error: function () {
1831                    // В случае ошибки ничего не делаем
1832                }
1833            });
1834        }
1835        $(document).on('input', '.quantity-input', function () {
1836            const input = $(this);
1837            const modal = input.closest('.modal');
1838            let val = parseInt(input.val()) || 0;
1839            const min = input.data('min') || 1;
1840            const max = input.data('max') || 99;
1841
1842            if (val < min) val = min;
1843            if (val > max) val = max;
1844
1845            input.val(val);
1846            updateCartQuantity(modal, val);
1847        });
1848    </script>
1848
1849    <footer id="footer">
1850    <div class="container">
1851        <a class="footer-links report" href="https://ptsell.com/ru/complain/liavelru" rel="nofollow">Связь с продавцом магазина</a>
1852        <a class="footer-links lang-switcher" rel="nofollow"
1853       href="/en/category/hawaiianairlines" title="English">English</a>
1854    </div>
1855</footer>
1856<!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 1856-1857
1856
1857    <script async src="https://www.googletagmanager.com/gtag/js?id=
1857G-KT9X7LPHP9
vendor: 16 bytes, lines 1857-1858
1857"></script>
1858    
1858<script>
1859        
vendor: 152 bytes, lines 1859-1863
1859window.dataLayer = window.dataLayer || [];
1860        function gtag(){dataLayer.push(arguments);}
1861        gtag('js', new Date());
1862
1863        gtag('config', '
1863G-KT9X7LPHP9
vendor: 8 bytes, lines 1863-1864
1863');
1864    
1864</script>
1864
1865
1866<script src="/static/js/bootstrap.min.js"></script>
vendor: 1 bytes, line 1866
1866
1867<script>
1868    var shopCurrency = "rub";
1869    // Валюта ПОКАЗА цен (на англ. версии рублёвой витрины — usd) и множитель к суммам,
1870    // которые сервер считает в валюте витрины. Заказ и оплата остаются в shopCurrency.
1871    var shopDisplayCurrency = "rub";
1872    var shopDisplayRate = 1;
1873</script>
1873
1874
1875            <a href="https://www.liveinternet.ru/click"
1876target="_blank"><img id="licntD821" width="31" height="31" style="border:0" 
1877title="LiveInternet"
1878src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7"
1879alt=""/></a>
1879<script>(function(d,s){d.getElementById("licntD821").src=
1880"https://counter.yadro.ru/hit?t50.11;r"+escape(d.referrer)+
1881((typeof(s)=="undefined")?"":";s"+s.width+"*"+s.height+"*"+
1882(s.colorDepth?s.colorDepth:s.pixelDepth))+";u"+escape(d.URL)+
1883";h"+escape(d.title.substring(0,150))+";"+Math.random()})
1884(document,screen)</script>
1884
1885<!-- Yandex.Metrika counter -->
1886<script type="text/javascript" >
vendor: 413 bytes, lines 1886-1893
1886
1887   (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
1888   m[i].l=1*new Date();
1889   for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
1890   k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
1891   (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
1892
1893   ym(
189396711796
vendor: 105 bytes, lines 1893-1897
1893, "init", {
1894        clickmap:true,
1895        trackLinks:true,
1896        accurateTrackBounce:true
1897   });
1898</script>
1898
1899<noscript><div><img src="https://mc.yandex.ru/watch/96711796" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
1900<!-- /Yandex.Metrika counter -->
1901    </body>
1902</html>

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.