1let hoverLock = false; 2 3 4/* ========================= 5 â STAR RATING 6========================= */ 7 8document.querySelectorAll('.rating span').forEach(star => { 9 10 /* ð¥ hover preview */ 11 star.addEventListener('mouseenter', function () { 12 13 if (hoverLock) return; 14 15 let value = parseInt(this.dataset.value); 16 17 let parent = this.parentElement; 18 19 let stars = parent.querySelectorAll('span'); 20 21 stars.forEach(s => { 22 23 let v = parseInt(s.dataset.value); 24 25 s.classList.remove('full', 'half'); 26 27 if (v <= value) { 28 s.classList.add('full'); 29 } 30 31 }); 32 }); 33 34 35 /* â click */ 36 star.addEventListener('click', function () { 37 38 let value = this.dataset.value; 39 40 let parent = this.parentElement; 41 42 let type = parent.dataset.type || 'post'; 43 44 let id = parent.dataset.id; 45 46 let pid = parent.dataset.pid; 47 48 hoverLock = true; 49 50 let params = new URLSearchParams(); 51 52 params.append('rate', value); 53 params.append('type', 'star'); 54 55 /* 56 * ÙÙØ¹ Ø¢ÛØªÙ 57 */ 58 params.append('object_type', type); 59 60 /* 61 * Ø´ÙØ§Ø³Ù 62 */ 63 params.append('object_id', id); 64 65 /* 66 * pid 67 */ 68 params.append('object_pid', pid); 69 70 71 fetch('/important/rate.php', { 72 73 method: 'POST', 74 75 headers: { 76 'Content-Type': 77 'application/x-www-form-urlencoded' 78 }, 79 80 body: params.toString() 81 82 }) 83 84 .then(r => r.json()) 85 86 .then(data => { 87 88 hoverLock = false; 89 90 if (data.status === 'success') { 91 92 renderStars(parent, data.avg); 93 94 } else { 95 96 alert(data.message); 97 } 98 99 }) 100 101 .catch(() => { 102 103 hoverLock = false; 104 105 }); 106 107 }); 108 109}); 110 111document.querySelectorAll('.rating').forEach(container => { 112 113 container.addEventListener('mouseleave', function () { 114 115 if (hoverLock) return; 116 117 let avg = parseFloat( 118 this.dataset.avg || 0 119 ); 120 121 renderStars(this, avg); 122 123 }); 124 125}); 126 127 128
129function renderStars(container, avg) { 130 131 avg = parseFloat(avg) || 0; 132 133 container.dataset.avg = avg; 134 135 let stars = container.querySelectorAll('span'); 136 137 stars.forEach(s => { 138 139 let val = parseInt( 140 s.dataset.value 141 ); 142 143 s.classList.remove( 144 'full', 145 'half' 146 ); 147 148 if (avg >= val) { 149 150 s.classList.add('full'); 151 152 } else if (avg >= val - 0.5) { 153 154 s.classList.add('half'); 155 } 156 157 }); 158 159 160 let info = container.nextElementSibling; 161 162 if (info) { 163 164 info.innerHTML = 165 'Ø§Ù ØªÛØ§Ø²: ' + 166 avg.toFixed(2) + 167 ' / 5'; 168 } 169} 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184/* ========================= 185 ð LIKE / ð DISLIKE 186========================= */ 187 188document.addEventListener('click', function (e) { 189 190 let btn = e.target.closest('.like-btn, .dislike-btn'); 191 if (!btn) return; 192 193 let parent = btn.closest('.vote'); 194 195 let postId = parent.dataset.id; 196 let value = btn.dataset.value; 197 198 fetch('/important/rate.php', { 199 method: 'POST', 200 headers: { 201 'Content-Type': 'application/x-www-form-urlencoded' 202 }, 203 body: `post_id=${postId}&rate=${value}&type=vote` 204 }) 205 .then(r => r.json()) 206 .then(data => { 207 208 if (data.status === 'success') { 209 210 parent.querySelector('.like').innerText = 211 data.likevote; 212 213 parent.querySelector('.dislike').innerText = 214 data.dislikevote; 215 216 } else { 217 218 alert(data.message); 219 220 } 221 222 }); 223 224}); 225
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.