1!function () { 2 3 const POLL_LIMIT = 25; // 25 à 200 Ð¼Ñ = 5 Ñек. 4 const POLL_DELAY = 200; 5 6 const COOKIE_NAME = 'promo_code'; 7 const COOKIE_LIFETIME_DAYS = 365; 8 9 // ÐÑем инпÑÑÑ Ð»ÑбÑÑ Ð¿ÑеÑикÑов, а не ÑолÑко Ñвоего: ÑоÑма ÑендеÑÐ¸Ñ ÑобÑÑвеннÑй 10 // forms_user[promo_code], в коÑоÑом Ð¼Ð¾Ð¶ÐµÑ Ð»ÐµÐ¶Ð°ÑÑ Ð²ÑиÑÑй пÑомокод. 11 const PROMO_CODE_INPUTS_SELECTOR = 'input[name*="[promo_code]"]'; 12 13 const promo_code_url = get_promo_code_from_url(); 14 15 // ÐÑÐºÑ Ð¿Ð¸Ñем ÑÑÐ°Ð·Ñ Ð¸ на лÑбой ÑÑÑаниÑе, не дожидаÑÑÑ ÑоÑмÑ: паÑÑнÑÑÑÐºÐ°Ñ ÑÑÑлка ÑаÑÑо 16 // ведÑÑ ÑÑда, где ÑоÑÐ¼Ñ Ð½ÐµÑ, а ÑегиÑÑÑаÑÐ¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð·Ð¶Ðµ на дÑÑгой ÑÑÑаниÑе. 17 if (promo_code_url) { 18 save_promo_code_cookie(promo_code_url); 19 } 20 21 on_ready(() => wait_for_form(process_promo_code)); 22 23 // Ð¥ÑÑ Ð¿ÑовеÑÑем пеÑвÑм, как и ÑанÑÑе: пÑомокод в ÑоÑме Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÑÑлок не менÑеÑÑÑ. 24 function get_promo_code_from_url() { 25 const from_hash = new URLSearchParams(window.location.hash.slice(1)).get('g'); 26 const from_query = new URLSearchParams(window.location.search).get('g'); 27 28 return clean_promo_code(from_hash) || clean_promo_code(from_query); 29 } 30 31 // ÐÑомокод ÑоÑÑÐ¾Ð¸Ñ ÑолÑко из лаÑиниÑÑ Ð¸ ÑиÑÑ. ÐÑÑ Ð¾ÑÑалÑное â мÑÑоÑ, коÑоÑÑй пÑÐ¸Ð»Ð¸Ð¿Ð°ÐµÑ 32 // к ÑÑÑлке пÑи копиÑовании из меÑÑенджеÑов: кавÑÑки, бÑкÑики, ÑоÑки в конÑе. 33 function clean_promo_code(value) { 34 return (value || '').replace(/[^A-Za-z0-9]/g, '') || null; 35 } 36 37 function save_promo_code_cookie(promo_code) { 38 const expires = new Date(Date.now() + COOKIE_LIFETIME_DAYS * 24 * 60 * 60 * 1000); 39 40 document.cookie = `${COOKIE_NAME}=${promo_code}; expires=${expires.toUTCString()}; path=/`; 41 } 42 43 function on_ready(callback) { 44 if (document.readyState === 'loading') { 45 document.addEventListener('DOMContentLoaded', callback, { once: true }); 46 return; 47 } 48 49 callback(); 50 } 51 52 // ФоÑÐ¼Ñ ÑоздаÑÑ js паÑÑиала ÑегиÑÑÑаÑии, в ÑеÑвеÑной ÑазмеÑке ÐµÑ Ð½ÐµÑ, поÑÑÐ¾Ð¼Ñ Ð¶Ð´Ñм. 53 function wait_for_form(callback, attempts = 0) { 54 if (get_forms().length > 0) { 55 callback(); 56 return; 57 } 58 59 if (attempts < POLL_LIMIT) { 60 setTimeout(() => wait_for_form(callback, attempts + 1), POLL_DELAY); 61 } 62 } 63 64 function get_forms() { 65 return document.querySelectorAll('form.ama-form'); 66 } 67 68 function process_promo_code() { 69 const forms = Array.from(get_forms()).filter(form => !has_embedded_promo_code(form)); 70 if (forms.length === 0) { 71 return; 72 } 73 74 // 1. ÐÑомокод из URL. 2. ÐнаÑе из кÑки â она пеÑежила пеÑÐµÑ Ð¾Ð´ Ñ Ð´ÑÑгой ÑÑÑаниÑÑ. 75 const promo_code = promo_code_url || get_promo_code_cookie(); 76 if (!promo_code) { 77 return; 78 } 79 80 forms.forEach(form => set_form_promo_code(form, promo_code)); 81 } 82 83 // ÐÑомокод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑÐ¸Ñ Ð² ÑоÑÐ¼Ñ Ð½Ð°ÑÑÑойками паÑÑиала â Ñакие ÑоÑÐ¼Ñ Ð½Ðµ ÑÑогаем. 84 function has_embedded_promo_code(form) { 85 return Array.from(form.querySelectorAll(PROMO_CODE_INPUTS_SELECTOR)).some(input => input.value !== ''); 86 } 87 88 function get_promo_code_cookie() { 89 const matches = document.cookie.match(new RegExp(`(?:^|; )${COOKIE_NAME}=([^;]*)`)); 90 91 // ЧиÑÑим и пÑи ÑÑении: ÑÑаÑÑе кÑки пиÑалиÑÑ ÐºÐ°Ðº еÑÑÑ Ð¸ могÑÑ ÑодеÑжаÑÑ Ð¼ÑÑоÑ. 92 return matches ? clean_promo_code(matches[1]) : null; 93 } 94 95 function set_form_promo_code(form, promo_code) { 96 form.querySelectorAll(PROMO_CODE_INPUTS_SELECTOR).forEac
96h(input => input.remove()); 97 98 const input = document.createElement('input'); 99 input.type = 'hidden'; 100 input.name = 'forms_user[promo_code]'; 101 input.value = promo_code; 102 103 form.appendChild(input); 104 } 105 106}();
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.