// CTA «Нужен нестандартный размер?» (tpl/blocks/cta.tpl, styles/cta.css). // Десктоп: плашка выезжает при наведении (CSS :hover). Сенсорные экраны: нажатие на закладку открывает, // повторное нажатие на плашку (кроме кнопки) или вне её — закрывает. // Скрипт подключается сразу после разметки (tpl/blocks/cta.tpl) и не ждёт готовности всей страницы: // внешние виджеты (botfaqtor, livetex и др.) могут задерживать DOMContentLoaded на десятки секунд. (function ($) { var $cta = $('#cta'); if (!$cta.length) return; var $popup = $('#cta-popup'); var $form = $('#cta-form'); var hasHover = window.matchMedia && window.matchMedia('(hover: hover) and (pointer: fine)').matches; var maxFiles = 5; var maxFileSize = 10 * 1024 * 1024; function setOpen(open) { $cta.toggleClass('is-open', open); $('#cta-tab').attr('aria-expanded', open ? 'true' : 'false'); } // Закладка $cta.on('click', function (e) { if ($(e.target).closest('.cta__btn').length) return; if ($(e.target).closest('#cta-close').length) { setOpen(false); if (hasHover) $cta.addClass('is-suppressed'); return; } // На десктопе плашку раскрывает наведение, клик ничего не переключает if (hasHover) return; setOpen(!$cta.hasClass('is-open')); }); $cta.on('mouseleave', function () { $cta.removeClass('is-suppressed'); }); $(document).on('click touchstart', function (e) { if ($cta.hasClass('is-open') && !$(e.target).closest('#cta').length) { setOpen(false); } }); $(document).on('keydown', function (e) { if (e.keyCode !== 27) return; setOpen(false); closePopup(); }); // Форма заявки if (!$popup.length) return; function openPopup() { setOpen(false); $('#cta-form-fields').show(); $('#cta-result').hide(); $popup.fadeIn('slow'); } function closePopup() { $popup.fadeOut('slow'); } $('#cta-open-form').on('click', function (e) { e.preventDefault(); openPopup(); }); $('#cta-popup-close').on('click', function (e) { e.preventDefault(); closePopup(); }); $popup.on('click', function (e) { if (!$(e.target).closest('.callback-form').length) closePopup(); }); $('#cta-phone') .on('focus', function () { if ($.trim($(this).val()) === '') $(this).val('+7'); }) .on('input', function () { var value = $(this).val().replace(/\D/g, ''); if (value.charAt(0) !== '7') value = '7' + value; $(this).val('+' + value.substring(0, 11)); }); $('#cta-files').on('change', function () { var names = $.map(this.files || [], function (file) { return file.name; }); $('#cta-files-list').text(names.join(', ')); }); function fail(text, $field) { alert(text); if ($field) $field.focus(); return false; } $form.on('submit', function (e) { e.preventDefault(); var name = $.trim($('#cta-name').val()); var phone = $.trim($('#cta-phone').val()); var email = $.trim($('#cta-email').val()); var inn = $.trim($('#cta-inn').val()); var files = $('#cta-files')[0].files || []; var emailRe = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (name.length < 2) return fail('Имя должно содержать минимум 2 символа', $('#cta-name')); if (phone.indexOf('+7') !== 0 || phone.replace(/\D/g, '').length !== 11) { return fail('Номер должен быть в формате: +7XXXXXXXXXX', $('#cta-phone')); } if (!emailRe.test(email)) return fail('Введите корректный email', $('#cta-email')); if (inn !== '' && !/^(\d{10}|\d{12})$/.test(inn)) { return fail('ИНН должен содержать 10 или 12 цифр. Если не знаете ИНН, оставьте поле пустым.', $('#cta-inn')); } if (files.length > maxFiles) return fail('Можно прикрепить не больше ' + maxFiles + ' файлов'); for (var i = 0; i < files.length; i++) { if (files[i].size > maxFileSize) return fail('Файл «' + files[i].name + '» слишком большой (до 10 МБ)'); } if (!$('#cta-agreed').is(':checked')) { return fail('Без согласия на обработку персональных данных форма отправлена не будет.'); } var $submit = $('#cta-submit').prop('disabled', true); $('#cta-preload').show(); $.ajax({ type: 'POST', url: $form.attr('action'), data: new FormData($form[0]), processData: false, contentType: false, dataType: 'json', success: function (data) { if (!data || !data.success) { alert(data && data.message ? data.message : 'Произошла ошибка!'); return; } $form[0].reset(); $('#cta-files-list').text(''); $('#cta-form-fields').hide(); $('#cta-result').show(); }, error: function () { alert('Произошла ошибка!'); }, complete: function () { $submit.prop('disabled', false); $('#cta-preload').hide(); } }); }); })(jQuery);