/* ==================================================================== ОБЕРТКА ДЛЯ ОЖИДАНИЯ JQUERY ==================================================================== */ (function waitForJQuery() { if (typeof jQuery === 'undefined') { // jQuery еще не загружен. Ждем 10 мс и проверяем снова. setTimeout(waitForJQuery, 10); } else { // JQuery загружен, можно запускать основной код. (function($){ // ==================================================================== // КОРРЕКЦИЯ: ПРИНУДИТЕЛЬНАЯ ФИКСАЦИЯ HTTPS // ==================================================================== if (typeof aveabspath !== 'undefined') { aveabspath = 'https://bag.local/'; } // ==================================================================== /*Limit symbols*/ (function($){$.fn.extend({limit:function(limit,element){var interval,f;var self=$(this);$(this).focus(function(){interval=window.setInterval(substring,100)});$(this).blur(function(){clearInterval(interval);substring()});substringFunction="function substring(){ var val = $(self).val();var length = val.length;if(length > limit){$(self).val($(self).val().substring(0,limit));}";if(typeof element!='undefined')substringFunction+="if($(element).html() != limit-length){$(element).html((limit-length<=0)?'0':limit-length);}";substringFunction+="}";eval(substringFunction);substring()}})})(jQuery); function getCaptha(){ now = new Date(); $('#captcha img').attr('src', aveabspath+'inc/captcha.php?cd=' + now); }; // ИСПРАВЛЕННАЯ ФУНКЦИЯ cAction function cAction(obj,action){ var cid; // --- Логика для действий с документом (open/close) --- if (action === 'open' || action === 'close') { cid = DOC_ID; } else { // 1. Пытаемся найти ссылку и взять ID из атрибута rel var $link = $(obj).closest('a.mod_comment_answer'); cid = $link.attr('rel'); // 2. Если rel не найден, берем ID из родительского блока if (typeof cid === 'undefined' || cid === false || cid === '') { cid = $(obj).parents('.mod_comment_box').attr('id'); } } if (typeof cid === 'undefined' || cid === false || cid === '') { console.error("Comment ID not found for action: " + action); return; } if (action=='answer'){ $('#parent_id').val(cid); // --- ИСПРАВЛЕНИЕ: Добавлено .show() для отображения формы после перемещения --- $('#mod_comment_new').insertBefore('#end'+cid).show(); return; } // ... (остальной код для admin actions: delete, lock, open/close) if (UGROUP==1){ $.get(aveabspath+'index.php',{ module: 'comment', action: action, docid: DOC_ID, Id: cid },function(){ if (action=='delete'){ $(obj).parents('.mod_comment_comment').eq(0).remove(); } if (action=='open'){ $('#mod_comment_open').attr('id', 'mod_comment_close').html(COMMENT_SITE_CLOSE); } if (action=='close'){ $('#mod_comment_close').attr('id', 'mod_comment_open').html(COMMENT_SITE_OPEN); } // ==================================================================== // ИСПРАВЛЕНИЕ: ДИНАМИЧЕСКАЯ СМЕНА ИКОНКИ ЗАМКА (Font Awesome) // ==================================================================== if (action=='unlock'){ // Меняем классы: mod_comment_unlock (открыт) -> mod_comment_lock (закрыт) // Меняем цвет: text-success (зеленый) -> text-dark (темный) $(obj).removeClass('mod_comment_unlock text-success') .addClass('mod_comment_lock text-dark') .attr('title',COMMENT_LOCK_LINK) .find('i.fa') // Ищем иконку FA .removeClass('fa-unlock').addClass('fa-lock'); // Меняем иконку } if (action=='lock'){ // Меняем классы: mod_comment_lock (закрыт) -> mod_comment_unlock (открыт) // Меняем цвет: text-dark (темный) -> text-success (зеленый) $(obj).removeClass('mod_comment_lock text-dark') .addClass('mod_comment_unlock text-success') .attr('title',COMMENT_UNLOCK_LINK) .find('i.fa') // Ищем иконку FA .removeClass('fa-lock').addClass('fa-unlock'); // Меняем иконку } // ==================================================================== }); } }; // ИСПРАВЛЕННАЯ ФУНКЦИЯ VALIDATE: Устойчива к отсутствию полей function validate(formData,jqForm,options){ $('.alert').remove(); var form = jqForm ? jqForm[0] : $('#mod_comment_new form')[0]; if (form.comment_author_name && !form.comment_author_name.value){ alert(COMMENT_ERROR_AUTHOR); $(form.comment_author_name).focus(); return false; } if (form.comment_author_email && !form.comment_author_email.value){ alert(COMMENT_ERROR_EMAIL); $(form.comment_author_email).focus(); return false; } if (!form.comment_text || !form.comment_text.value){ alert(COMMENT_ERROR_TEXT); if (form.comment_text) $(form.comment_text).focus(); return false; } if (IS_IM && form.securecode && !form.securecode.value){ alert(COMMENT_ERROR_CAPTCHA); $(form.securecode).focus(); return false; } return true; }; function setClickable(){ $('.editable_text').click(function(){ var cid = $(this).parents('.mod_comment_box').attr('id'); var revert = $(this).html(); var textarea = '

'; var charsLeft = '

'+COMMENT_CHARS_LEFT+'

'; var buttonSave = ' '; var buttonReset = ''; $(this).after('
'+COMMENT_EDIT_TITLE +''+textarea+buttonSave+buttonReset+charsLeft+'
').remove(); $('.saveButton').click(function(){saveChanges(this,false,cid);}); $('.cancelButton').click(function(){saveChanges(this,revert,cid);}); $('#ta_'+cid).limit(MAX_CHARS,'#charsLeft_'+cid); }) .attr('title',COMMENT_EDIT_LINK) .mouseover(function(){$(this).addClass('editable');}) .mouseout(function(){$(this).removeClass('editable');}); $('#in_message').limit(MAX_CHARS,'#charsLeft_new'); }; // ИСПРАВЛЕННАЯ ФУНКЦИЯ saveChanges function saveChanges(obj,cancel,cid){ if (!cancel){ var t = $(obj).parent().children().children().val(); $.ajax({ url: aveabspath+'index.php?ajax=1', type: 'POST', data: { module: 'comment', action: 'edit', Id: cid, text: t }, success: function(txt){ $(obj).parent().parent().parent().after('
'+txt+'
').remove(); var now = new Date(); var date = now.toLocaleString(); $('#'+cid).find('.mod_comment_changed').html(' ('+COMMENT_TEXT_CHANGED+' '+date+')'); setClickable(); }, error: function(xhr, status, error) { console.error("AJAX Error (Edit):", status, error); alert("Ошибка при редактировании комментария. Пожалуйста, проверьте консоль."); } }); } else { $(obj).parent().parent().parent().after('
'+cancel+'
').remove(); setClickable(); } }; function displayNewComment(data){ if (data=='wrong_securecode'){ $('#captcha').after('
'+COMMENT_WRONG_CODE+'
'); $('#securecode').focus(); } else { $('#end'+$('#parent_id').val()).before(data); $('#parent_id').val(''); $('#mod_comment_new form')[0].reset(); // --- Перемещаем форму обратно в конец. УБРАНО .hide() для сохранения видимости. $('#mod_comment_new').insertAfter('#end'); setClickable(); } getCaptha(); }; $(document).ready(function(){ setClickable(); // Делегирование событий $(document).on('click', '#captcha img', function(){getCaptha();}); $(document).on('click', '.mod_comment_answer', function(){cAction(this,'answer');}); $(document).on('click', '.mod_comment_edit', function(){ var cid = $(this).parents('.mod_comment_box').attr('id'); var commentTextBlock = $('#'+cid).find('.mod_comment_text'); var revert = commentTextBlock.html(); var textarea = '

'; var charsLeft = '

'+COMMENT_CHARS_LEFT+'

'; var buttonSave = ' '; var buttonReset = ''; commentTextBlock.after( '
'+COMMENT_EDIT_TITLE +''+textarea+buttonSave+buttonReset+charsLeft+'
' ).remove(); $('.saveButton').click(function(){saveChanges(this,false,cid);}); $('.cancelButton').click(function(){saveChanges(this,revert,cid);}); $('#ta_'+cid).limit(MAX_CHARS,'#charsLeft_'+cid); }); if (UGROUP == 1) { $(document).on('click', '.mod_comment_delete', function(){ if (confirm('Вы уверены, что хотите удалить комментарий?')) { cAction(this, 'delete'); } }); $(document).on('click', '.mod_comment_lock', function(){cAction(this, 'lock');}); $(document).on('click', '.mod_comment_unlock', function(){cAction(this, 'unlock');}); $(document).on('click', '#mod_comment_open', function(){cAction(this,'open');}); $(document).on('click', '#mod_comment_close', function(){cAction(this,'close');}); } // Отправка формы (AJAX) - ИСПРАВЛЕНИЕ ДВОЙНОЙ ОТПРАВКИ $('#mod_comment_new form').on('submit', function(e){ e.preventDefault(); var form = $(this); if (!validate(null, form, null)) { return false; } var submitButton = form.find('input[type="submit"], button[type="submit"]').first(); var originalButtonText = submitButton.val(); var formData = form.serialize(); $.ajax({ url: aveabspath+'index.php?ajax=1', type: 'POST', data: formData, dataType: 'html', // Отключаем кнопку перед отправкой beforeSend: function() { submitButton.prop('disabled', true).val('Отправка...'); }, // Включаем кнопку обратно и обрабатываем ответ success: function(data) { displayNewComment(data); submitButton.prop('disabled', false).val(originalButtonText); }, timeout: 3000, error: function(xhr, status, error) { console.error("AJAX Error (Creation):", status, error); alert("Ошибка при отправке комментария. Пожалуйста, проверьте консоль."); // Включаем кнопку обратно в случае ошибки submitButton.prop('disabled', false).val(originalButtonText); } }); return false; }); // Сброс формы $('#buttonReset').click(function(){ $('#parent_id').val(''); $('#mod_comment_new form')[0].reset(); $('#mod_comment_new').insertAfter('#end'); }); }); })(jQuery); } })();