1(function(){ 2 function ready(fn){ 3 if(document.readyState !== 'loading'){ fn(); } 4 else { document.addEventListener('DOMContentLoaded', fn); } 5 } 6 7 function insertAtCursor(field, value){ 8 if(!field || typeof value === 'undefined') return; 9 var start = field.selectionStart || 0; 10 var end = field.selectionEnd || 0; 11 var text = field.value || ''; 12 field.value = text.slice(0, start) + value + text.slice(end); 13 field.focus(); 14 var pos = start + value.length; 15 if(field.setSelectionRange) field.setSelectionRange(pos, pos); 16 } 17 18 function parseHTML(html){ 19 var parser = new DOMParser(); 20 return parser.parseFromString(html, 'text/html'); 21 } 22 23 function closestRoot(el){ 24 return el ? el.closest('[data-ca-root]') : null; 25 } 26 27 function refreshRoot(root, html, url){ 28 if(!root) return; 29 var rootId = root.getAttribute('data-ca-root'); 30 if(!rootId) return; 31 var doc = parseHTML(html); 32 var replacement = doc.querySelector('[data-ca-root="' + rootId + '"]') || doc.getElementById(rootId); 33 if(!replacement) return; 34 root.replaceWith(replacement); 35 if(url && window.history && window.history.replaceState){ 36 window.history.replaceState({}, document.title, url); 37 } 38 hideNativeSpipForum(); 39 initCommentaireAvance(replacement); 40 } 41 42 function fetchAndRefresh(root, url, options){ 43 if(!root || !url) return; 44 root.classList.add('ca-is-loading'); 45 options = options || {}; 46 options.credentials = 'same-origin'; 47 options.headers = options.headers || {}; 48 options.headers['X-Requested-With'] = 'XMLHttpRequest'; 49 fetch(url, options) 50 .then(function(response){ return response.text(); }) 51 .then(function(html){ refreshRoot(root, html, url); }) 52 .catch(function(){ window.location.href = url; }) 53 .finally(function(){ root.classList.remove('ca-is-loading'); }); 54 } 55 56 function bindAjax(root){ 57 if(!root || root.dataset.caAjaxBound === '1') return; 58 root.dataset.caAjaxBound = '1'; 59 60 root.addEventListener('click', function(e){ 61 var checkAll = e.target.closest('.ca-check-all'); 62 if(checkAll){ 63 var bulkForm = checkAll.closest('.ca-bulk-form'); 64 if(bulkForm){ 65 bulkForm.querySelectorAll('.ca-bulk-check').forEach(function(cb){ 66 cb.checked = checkAll.checked; 67 }); 68 } 69 return; 70 } 71 72 var bulkBtn = e.target.closest('.ca-bulk-btn'); 73 if(bulkBtn){ 74 var bulkForm2 = bulkBtn.closest('.ca-bulk-form'); 75 if(bulkForm2){ 76 var selected = bulkForm2.querySelectorAll('.ca-bulk-check:checked'); 77 if(!selected.length){ 78 e.preventDefault(); 79 alert('Sélectionnez au moins un commentaire.'); 80 return; 81 } 82 var opField = bulkForm2.querySelector('.ca-bulk-operation'); 83 if(opField) opField.value = bulkBtn.getAttribute('data-operation') || ''; 84 } 85 } 86 87 var profileBtn = e.target.closest('.ca-profile-edit-toggle'); 88 if(profileBtn){ 89 e.preventDefault(); 90 var cibleProfil = document.getElementById(profileBtn.getAttribute('data-cible')); 91 if(cibleProfil){ 92 cibleProfil.hidden = !cibleProfil.hidden; 93 if(!cibleProfil.hidden){ 94 var inputProfil = cibleProfil.querySelector('input[type="text"], input[type="email"]'); 95 if(inputProfil) inputProfil.focus(); 96 } 97 } 98 return; 99 } 100 101 var replyBtn = e.target.closest('.ca-repondre'); 102 if(replyBtn){ 103 e.preventDefault(); 104 var target = document.getElementById(replyBtn.getAttribute('data-cible')); 105 if(target){ 106 target.hidden = !target.hidden; 107 if(!target.hidden){ 108 var textarea = target.querySelector('textarea'); 109 if(textarea) textarea.focus(); 110 } 111 } 112 return; 113 } 114 115 var emojiBtn = e.target.closest('.ca-emoji'); 116 if(emojiBtn){ 117 e.preventDefault(); 118 var form = emojiBtn.closest('.formulaire_commenter_avance'); 119 var textarea = form ? form.querySelector('textarea[name="texte"]') : null; 120 insertAtCursor(textarea, emojiBtn.getAttribute('data-emoji') || emojiBtn.textContent || ''); 121 return; 122 } 123 124 var toolBtn = e.target.closest('.ca-tool[data-insert]'); 125 if(toolBtn){ 126 e.preventDefault(); 127 var formWrap = toolBtn.closest('.formulaire_commenter_avance'); 128 var area = formWrap ? formWrap.querySelector('textarea[name="texte"]') : null; 129 insertAtCursor(area, toolBtn.getAttribute('data-insert') || ''); 130 return; 131 } 132 133 var previewBtn = e.target.closest('.btn_preview'); 134 if(previewBtn){ 135 e.preventDefault(); 136 var wrap = previewBtn.closest('.formulaire_commenter_avance'); 137 var preview = wrap ? wrap.querySelector('.ca-preview') : null; 138 var textarea2 = wrap ? wrap.querySelector('textarea[name="texte"]') : null; 139 if(preview && textarea2){ 140 preview.textContent = textarea2.value; 141 preview.classList.toggle('ca-has-content', !!textarea2.value.trim()); 142 } 143 return; 144 } 145 146 var link = e.target.closest('a.ca-ajax-link, .ca-pagination a, .ca-filter-tabs a'); 147 if(link && root.contains(link) && link.getAttribute('href')){ 148 e.preventDefault(); 149 fetchAndRefresh(root, link.getAttribute('href')); 150 } 151 }); 152 153 root.addEventListener('submit', function(e){ 154 var bulkForm = e.target.closest('.ca-bulk-form');
155 if(bulkForm && root.contains(bulkForm)){ 156 e.preventDefault(); 157 var selected = bulkForm.querySelectorAll('.ca-bulk-check:checked'); 158 if(!selected.length){ 159 alert('Sélectionnez au moins un commentaire.'); 160 return; 161 } 162 var actionBulk = bulkForm.getAttribute('action') || window.location.href; 163 var formDataBulk = new FormData(bulkForm); 164 fetchAndRefresh(root, actionBulk, { method: 'POST', body: formDataBulk }); 165 return; 166 } 167 168 var form = e.target.closest('.formulaire_commenter_avance form'); 169 if(!form || !root.contains(form)) return; 170 e.preventDefault(); 171 var action = form.getAttribute('action') || window.location.href; 172 var formData = new FormData(form); 173 fetchAndRefresh(root, action, { method: 'POST', body: formData }); 174 }); 175 } 176 177 function initEditors(scope){ 178 (scope || document).querySelectorAll('.formulaire_commenter_avance').forEach(function(formWrap){ 179 var textarea = formWrap.querySelector('textarea[name="texte"]'); 180 if(textarea){ 181 textarea.classList.add('no_barre', 'ca-textarea'); 182 var mark = textarea.closest('.markItUp'); 183 if(mark){ 184 mark.querySelectorAll('.markItUpHeader,.markItUpFooter,.markItUpTabs').forEach(function(el){ 185 el.setAttribute('aria-hidden', 'true'); 186 el.style.display = 'none'; 187 }); 188 } 189 } 190 }); 191 } 192 193 194 function hideNativeSpipForum(){ 195 document.body.classList.add('ca-plugin-commentaires-present'); 196 var selectors = [ 197 '.formulaire_forum:not(.formulaire_commenter_avance)', 198 'form#formulaire_forum', 199 'form.formulaire_forum', 200 '.comments-form:not(.formulaire_commenter_avance)', 201 '#formulaire_forum', 202 'form[action*="forum"]' 203 ]; 204 205 selectors.forEach(function(selector){ 206 document.querySelectorAll(selector).forEach(function(el){ 207 if(el.closest('.commentaires-avances')) return; 208 el.setAttribute('aria-hidden', 'true'); 209 el.style.display = 'none'; 210 el.style.visibility = 'hidden'; 211 el.style.height = '0'; 212 el.style.overflow = 'hidden'; 213 el.classList.add('ca-forum-natif-masque'); 214 }); 215 }); 216 217 document.querySelectorAll('form, .formulaire_spip, section, div').forEach(function(el){ 218 if(el.closest('.commentaires-avances')) return; 219 var text = (el.innerText || el.textContent || '').toLowerCase(); 220 var hasNativeButtons = text.indexOf('prévisualiser') !== -1 && text.indexOf('envoyer') !== -1; 221 var hasNativePlaceholder = false; 222 el.querySelectorAll && el.querySelectorAll('textarea').forEach(function(t){ 223 var ph = (t.getAttribute('placeholder') || '').toLowerCase(); 224 if(ph.indexOf('soyez le premier') !== -1 || ph.indexOf('réagir') !== -1) hasNativePlaceholder = true; 225 }); 226 if((hasNativeButtons || hasNativePlaceholder) && !el.querySelector('.formulaire_commenter_avance')){ 227 el.setAttribute('aria-hidden', 'true'); 228 el.style.display = 'none'; 229 el.style.visibility = 'hidden'; 230 el.style.height = '0'; 231 el.style.overflow = 'hidden'; 232 el.classList.add('ca-forum-natif-masque'); 233 } 234 }); 235 } 236 237 238 function initCommentaireAvance(scope){ 239 initEditors(scope || document); 240 (scope || document).querySelectorAll('[data-ca-root]').forEach(function(root){ bindAjax(root); }); 241 } 242 243 ready(function(){ hideNativeSpipForum(); initCommentaireAvance(document); }); 244})();
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.