PageSourceSearch

https://alatantour.by/phone.js?v=2

js alatantour.by collected 2026-10-08 10:51:00 UTC 3,460 bytes, 74 lines download raw bytes

1/* =========================================================================
2   Проверка белорусских номеров — сторона браузера
3   =========================================================================
4   Повторяет логику backend/app/phone.py. Дублирование намеренное:
5   в браузере человек видит ошибку сразу, не отправляя форму, а сервер
6   проверяет заново — проверку в браузере обойти ничего не стоит.
7
8   Если правила меняются, править надо ОБА файла. Они специально
9   написаны одинаково, чтобы расхождение было заметно при чтении.
10
11   Устройство нумерации: после 375 у любого белорусского номера ровно
12   9 цифр. У мобильных это 2 цифры кода плюс 7, у городских — 2 или 3
13   цифры кода плюс остаток:
14
15       +375 29 688 16 16  ->  296881616
16       +375 17 311 10 10  ->  173111010
17       +375 162 53 80 60  ->  162538060
18   ========================================================================= */
19
20window.AlatanPhone = (function () {
21  'use strict';
22
23  var MOBILE = ['25', '29', '33', '44'];              // life:), МТС, А1
24  var LANDLINE = ['15', '16', '17', '21', '22', '23']; // области и Минск
25  var CODES = MOBILE.concat(LANDLINE);
26
27  var ERROR_FORMAT =
28    'Укажите белорусский номер: 9 цифр с кодом оператора. ' +
29    'Можно как угодно: 29 1234567, +375 29 123 45 67 или 8 029 123-45-67';
30  var ERROR_CODE =
31    'Такого кода нет в Беларуси. Мобильные начинаются с 25, 29, 33 или 44, ' +
32    'городские — с 15, 16, 17, 21, 22, 23';
33
34  /**
35   * Приводит номер к виду +375XXXXXXXXX.
36   * @returns {{phone: string, error: string}}
37   */
38  function normalize(raw) {
39    var digits = String(raw || '').replace(/\D/g, '');
40    if (!digits) return { phone: '', error: ERROR_FORMAT };
41
42    // Отбрасываем код страны в любом принятом написании.
43    if (digits.indexOf('375') === 0) {
44      digits = digits.slice(3);
45    } else if (digits.indexOf('80') === 0) {
46      // Междугородний набор внутри страны: 8 029 123 45 67
47      digits = digits.slice(2);
48    } else if (digits.charAt(0) === '8' && digits.length === 10) {
49      // То же, но без нуля после восьмёрки.
50      digits = digits.slice(1);
51    }
52
53    if (digits.length !== 9) return { phone: '', error: ERROR_FORMAT };
54    if (CODES.indexOf(digits.slice(0, 2)) === -1) {
55      return { phone: '', error: ERROR_CODE };
56    }
57    return { phone: '+375' + digits, error: '' };
58  }
59
60  function isValid(raw) {
61    return !normalize(raw).error;
62  }
63
64  /** Красивая запись для показа: +375 29 123 45 67 */
65  function format(raw) {
66    var res = normalize(raw);
67    if (res.error) return raw;
68    var d = res.phone.slice(4);
69    return '+375 ' + d.slice(0, 2) + ' ' + d.slice(2, 5) +
70           ' ' + d.slice(5, 7) + ' ' + d.slice(7);
71  }
72
73  return { normalize: normalize, isValid: isValid, format: format };
74})();

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.