1 2var POST = function(){ 3 var code, post_body, body_input, is_notice,is_notice_input,is_secret,is_secret_input, post_form,post_subject,total_file_size; 4 5 var $board_container,$floara_obj; 6 var $post_img_library; 7 var $represent_img; 8 var $upload_cover_image_btn_obj, $delete_cover_image_btn_obj, $cover_image, $cover_image_tmp_no; 9 var $post_secret_password; 10 var $widget_wrap,board_code,listing_type,more_list_page; 11 var $listing_obj,type_data; 12 var option = {}; 13 var category_list; 14 var board_data; 15 var sent = false; 16 var isIOS, isSafari, $fr_m_custom, $write_header, m_sticky_container_trigger_top, $toolbarContainer; 17 18 var reaction_token, reaction_token_key; 19 20 // macOS Chromeìì ê²ì물 본문ì 'í° ì´ë¯¸ì§'를 ëëê·¸íë©´ ì¦ì ì·¨ìëë(ì¡ìë§ì ëìì§ë) 문ì ì°í. 21 // ìì¸: macOS í¬ë¡¬ì ëëê·¸ ì ë§ì°ì¤ë¥¼ ë°ë¼ë¤ëë 미리보기(ëëê·¸ ê³ ì¤í¸)를 'íë©´ì í¼ì¹ ì¤ì í½ì í¬ê¸°' 22 // 기ì¤ì¼ë¡ ë§ëëë°, í¼ì¹ ê·¸ë¦¼ì´ ë무 í¬ë©´ 미리보기 ìì±ì ì¤í¨íê³ ëëê·¸ ì체를 ì·¨ìíë¤. 23 // (Windows/Safarië ì ì. íì¼ ì©ëì´ ìëë¼ ê°ë¡xì¸ë¡ í½ì í¬ê¸°ê° 기ì¤) 24 // í´ê²°: ëëê·¸ ìì(dragstart) ì ê°ë¡ ìµë 120pxì§ë¦¬ ìì ìºë²ì¤ë¥¼ ë§ë¤ì´ setDragImageë¡ ì§ì â 25 // í¬ë¡¬ì´ ë¬´ê±°ì´ ì본ì¼ë¡ 미리보기를 ë§ë¤ì§ ìê² íì¬ ëëê·¸ê° ì·¨ìëì§ ìëë¤. 26 // (본문 ì본 ì´ë¯¸ì§ íì§ì ê·¸ëë¡, ëëê·¸ ì¤ ë°ë¼ë¤ëë ë¯¸ë¦¬ë³´ê¸°ë§ ì¶ì) 27 var __macDragFixAttached = false; 28 var setupMacChromeImageDragFix = function(){ 29 var ua = navigator.userAgent; 30 var isMacChrome = ua.indexOf('Macintosh') !== -1 && ua.indexOf('Chrome') !== -1 && ua.indexOf('Edg/') === -1 && ua.indexOf('OPR/') === -1; 31 if(!isMacChrome || __macDragFixAttached) return; 32 __macDragFixAttached = true; 33 34 document.addEventListener('dragstart', function(ev){ 35 var target = ev.target; 36 if(!target || target.tagName !== 'IMG') return; 37 var dt = ev.dataTransfer; 38 if(!dt) return; 39 var maxW = 120; 40 var ratio = target.naturalWidth > 0 ? Math.min(1, maxW / target.naturalWidth) : 1; 41 var w = Math.max(1, Math.round((target.naturalWidth || target.width) * ratio)); 42 var h = Math.max(1, Math.round((target.naturalHeight || target.height) * ratio)); 43 var canvas = document.createElement('canvas'); 44 canvas.width = w; 45 canvas.height = h; 46 var ctx = canvas.getContext('2d'); 47 if(!ctx) return; 48 try { 49 ctx.drawImage(target, 0, 0, w, h); 50 } catch(e){ 51 // CORS ë±ì¼ë¡ 그리기 ì¤í¨ ì íì ë°ì¤ë¡ ëì²´ (ëëê·¸ ìì²´ë ì±ë¦½ìí´) 52 ctx.fillStyle = 'rgba(0,0,0,0.3)'; 53 ctx.fillRect(0, 0, w, h); 54 } 55 canvas.style.position = 'fixed'; 56 canvas.style.top = '-1000px'; 57 canvas.style.left = '-1000px'; 58 canvas.style.pointerEvents = 'none'; 59 document.body.appendChild(canvas); 60 try { 61 dt.setDragImage(canvas, Math.round(w / 2), Math.round(h / 2)); 62 } catch(e){ /* setDragImage 미ì§ì ì 무ì */ } 63 setTimeout(function(){ 64 if(canvas.parentNode) canvas.parentNode.removeChild(canvas); 65 }, 0); 66 }, true); 67 }; 68 69 var postDeletePost = function (board_code,code,return_url,secret_pass){ 70 if(confirm(LOCALIZE.ì¤ëª _ìì íìê² ìµëê¹())){ 71 $.ajax({ 72 type : 'post', 73 data:{'pcode':code,board_code:board_code,secret_pass:secret_pass}, 74 url : '/ajax/deletePost.cm', 75 dataType : 'json', 76 success : function(result){ 77 if(result.msg == 'SUCCESS'){ 78 window.location.href = return_url; 79 }else{ 80 alert(result.msg); 81 } 82 } 83 }); 84 } 85 }; 86 87 88 /*** 89 * ìëë¡ì´ëì±ìì postê¸ì°ê¸°ì ì´ë¯¸ì§ ì ë¡ë ìë£ì ì²ë¦¬ 90 * @param image 91 */ 92 93 var $image_list_obj = {}; 94 //ì´ë¯¸ì§ ììì ì¥ ë¦¬ì¤í¸ ì¶ê° 95 if(!($image_list_obj.length > 0)) { 96 var image_list_html = $("<ul id='image_list' style='display: none'></ul>"); 97 $("body form").append(image_list_html); 98 $image_list_obj = image_list_html; 99 } 100 101 var android_que = []; 102 var androidAppPostImageUploadComplete = function(image){ 103 if(image.tmp_idx > 0){ 104 android_que.push(image); 105 if(image.is_last == "Y") androidAppPostImageUploadAllComplete(); 106 } 107 }; 108 109 var androidAppPostImageUploadAllComplete = function(){ 110 androidAppPostImageInsert(android_que[0]); 111 }; 112 113 var androidAppPostImageInsert = function(image){ 114 FroalaEditor('#post_body').image.insert(CDN_UPLOAD_URL + image.url, true); 115 }; 116 117 var postAddImage = function(tmp_idx,size){ 118 var uniq_id = makeUniq('image_'); 119 var hidden_input = $('<input name="temp_images[]" value="' + tmp_idx + '" type="hidden" />'); 120 var li = $('<li>').attr('id',uniq_id).data({'item':uniq_id,size:size}); 121 li.append(hidden_input); 122 $image_list_obj.append(li); 123 }; 124 125 126 127 128 129 var postInitWrite = function(key,data, str_category){ 130 $("body").addClass("write_mode"); 131 $board_container = $('#board_container'); 132 post_body = $('#post_body'); 133 post_subject = $('#post_subject'); 134 body_input = $('#body_input'); 135 post_form = $('#post_form'); 136 $upload_cover_image_btn_obj = $('._upload_cover_image'); 137 $delete_cover_image_btn_obj = $('._delete_cover_image'); 138 $cover_image = $('#cover_image'); 139 $cover_image_tmp_no = $('#cover_image_tmp_no'); 140 code = key; 141 board_data = data; 142 total_file_size = 0; 143 category_list = categoryList(str_category); 144 if(IE_VERSION < 10){ 145 CKEDITOR.replace( 'post_body',{ 146 filebrowserImageUploadUrl: '/ajax/post_image_upload.cm?board_code='+key 147 }); 148 }else{ 149 if(android_version() == 4){ 150 post_body.addClass('legacy_webview'); 151 } 152 var placeholder = board_data.placeholder_edit; 153 if(placeholder == '') placeholder = getLocalizeString('ì¤ëª _ë´ì©ì_ì ë ¥í´ì£¼ì¸ì', '', 'ë´ì©ì ì ë ¥í´ì£¼ì¸ì'); 154 setFroala('#post_body', { 155 'code' : code, 156 'image_upload_url' : "/ajax/post_image_upload.cm", 157 'file_upload_url' : "/ajax/post_file_upload.cm", 158 'file_list_obj' : $("#file_list"), 159 'placeholderText' : placeholder, 160 'image_display' : 'inline', 161 'mobile_custom' : true 162 }, { 163 'image.inserted' : function($img, response){ 164 if(IS_ANDROID_APP == 'Y'){ 165 var img = post_body.find('img[src="' + CDN_UPLOAD_URL + image.url + '"]'); 166 img.data(image); 167 postAddImage(image.tmp_idx, image.size); 168 android_que.splice(0, 1); 169 if(android_que.length > 0) androidAppPostImageUploadAllComplete(); 170 } 171 } 172 }); 173 setupMacChromeImageDragFix(); 174 } 175 176 function dataURLtoBlob(dataurl) { 177 var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], 178 bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); 179 while(n--){ 180 u8arr[n] = bstr.charCodeAt(n); 181 } 182 return new Blob([u8arr], {type:mime}); 183 } 184 185 $delete_cover_image_btn_obj.on('click',function(){ 186 POST.deleteCoverImage(); 187 }); 188 189 $upload_cover_image_btn_obj.setUploadImage({ 190 url : '/ajax/upload_image.cm', 191 formData : {target : 'post', 'temp' : 'Y', 'param_name' : 'cover_image'} 192 }, function (msg, data,res) { 193 $.each(res.cover_image,function(i,file){ 194 if(file.tmp_idx > 0){ 195 $cover_image.val(CDN_UPLOAD_URL+file.url); 196 $cover_image_tmp_no.val(file.tmp_idx); 197 $delete_cover_image_btn_obj.show(); 198 $board_container.toggleClass('bg_on',true); 199 $board_container.find('._cover_image').css('background-image',"url("+CDN_UPLOAD_URL+file.url+")"); 200 $board_container.find('._cover_image_src').attr('src',CDN_UPLOAD_URL+file.url); 201 } 202 }); 203 }); 204 205 isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); 206 isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); 207 $fr_m_custom = $board_container.find('._fr-m-custom'); 208 $write_header = $board_container.find('._write_header'); 209 m_sticky_container_trigger_top = $fr_m_custom.offset().top; 210 $toolbarContainer = $fr_m_custom.find('#toolbarContainer'); 211 if(isIOS && isSafari){ 212 $write_header.css('position', 'absolute'); 213 } 214 var timeoutTime = isIOS && isSafari ? 100 : 10; 215 var resize_time; 216 resizeStickyContainer(); 217 $(window).off('scroll.mobile_write resize.mobile_write').on('scroll.mobile_write resize.mobile_write',function(){ 218 var s_top = $(this).scrollTop(); 219 if(isIOS && isSafari){ 220 $write_header.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 0}); 221 if(s_top > m_sticky_container_trigger_top){ 222 $toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 0}); 223 } 224 } 225 if(resize_time) { 226 clearTimeout(resize_time); 227 } 228 resize_time = setTimeout(function() { 229 resizeStickyContainer(); 230 }, timeoutTime); 231 }); 232 233 // $(window).bind('beforeunload', function(){ 234 // return LOCALIZE.ì¤ëª _íì´ì§ë¥¼ë²ì´ëìê² ìµëê¹(); 235 // }); 236 var $_mobile_tool_bar = $('._mobile_tool_bar'); 237 if($_mobile_tool_bar.find('._tool_btn:visible').length === 0){ 238 $_mobile_tool_bar.hide(); 239 } 240 }; 241 242 function resizeStickyContainer(){ 243 var s_top = $(this).scrollTop(); 244 if(isIOS && isSafari){ 245 $write_header.css({'-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px'}); 246 $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top); 247 $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top); 248 if(s_top > m_sticky_container_trigger_top){ 249 $toolbarContainer.css({'-webkit-transition': 'top 100ms', 'transition': 'top 100ms', 'top': s_top + 'px'}); 250 post_body.css('padding-top', '50px'); 251 }else{ 252 $toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 'auto'}); 253 post_body.css('padding-top', '50px'); 254 } 255 }else{ 256 $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top); 257 } 258 if($(window).width() >= 768){ 259 if($board_container.hasClass('bg_on')) 260 $board_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 487); 261 else 262 $board_container.find('#toolbarContainer').toggleClass('pc_sticky_toolbar', s_top > 180); 263 } 264 } 265 266 var deleteCoverImage = function(){ 267 $cover_image.val(''); 268 $cover_image_tmp_no.val(''); 269 $board_container.toggleClass('bg_on',false); 270 $board_container.find('._cover_image').css('background-image','none'); 271 $board_container.find('._cover_image_src').attr('src',''); 272 $delete_cover_image_btn_obj.hide(); 273 }; 274 275 276 const setPostToken = async () => { 277 await $.ajax({ 278 type: 'post', 279 url: '/set_post_client_token.cm', 280 dataType: 'json', 281 async : false 282 }); 283 }; 284 285 var postSubmit = async function(){ 286 if(sent) return false;
287 await setPostToken(); // í í°ì£¼ì APIí¸ì¶ 288 289 if(IE_VERSION < 10){ 290 var body = CKEDITOR.instances.post_body.getData(); 291 body_input.val(body); 292 post_form.submit(); 293 }else{ 294 if(post_body.hasClass('fr-code-view')) 295 FroalaEditor('#post_body').codeView.toggle(); 296 var body = FroalaEditor('#post_body').html.get(true); 297 298 body_input.val(body); 299 post_form.submit(); 300 } 301 sent = true; 302 }; 303 304 var endSubmit = function(msg){ 305 sent = false; 306 alert(msg); 307 }; 308 309 // ââ ì구í 문ì 캡차 â ìë²ê° ì 매í ì¤í¸ ì ì(0.50 ì´ì·ìê³ ë¯¸ë§)ìì ì구íë¤ ââââââ 310 // ëê¸ ê²½ë¡(`post_comment.js`)ì **ê°ì ê·ì¹Â·ê°ì 모ì**ì´ë¤. ë¤ë¥¸ ì ì íë: ê¸ì°ê¸° í¼ì 311 // hidden iframe ì¼ë¡ ì ì¶ëì´(:185 `target="hidden_frame"`) ë¶ëª¨ ì°½ì´ ìë² ìëµì ì§ì ë°ì§ 312 // 못íë¤. ê·¸ëì ìë²ê° iframe ììì `parent.POST.showBandCaptcha(...)` 를 ë¶ë¥´ê³ , ì´ ì°½ì´ 313 // ê·¸ í¨ì를 ì ê³µíë¤ â **구ë²ì JS(ì´ í¨ìê° ìë ë¶ëª¨ 문ì)ì ìì¬ë** ìë²ê° typeof ë¡ 314 // ê°ë¼ 기존 submit_error ê²½ë¡ë¡ ë¨ì´ì§ë¤(`post_add.cm` ì catch ë¤ ë¶ê¸°). 315 // 316 // ì ë ¥ì¹¸ ì´ë¦(captcha_key·captcha_answer)ì ìë²ê° 그리ë ì¬ì´í¸ 캡차ì **ê°ë¤**. ë¸ë¡ì 317 // ë°ëì í¼ **ì**ì ìì´ì¼ íë¤ â ë¤ì´í°ë¸ form.submit() ì´ í¼ íë를 ê·¸ëë¡ ì¤ì´ ë³´ë´ë¯ë¡, 318 // í¼ ë°ì 그리면 캡차 ëµì´ ìë²ì ëì°©íì§ ìëë¤. 319 var CAPTCHA_CHALLENGE_ATTR = 'data-fo-captcha-challenge'; 320 321 // ì¬ì´í¸ 캡차 íë©´(site_ui.cls)ì´ ì°ë ìë¡ê³ 침 ìì´ì½ê³¼ ê°ì 모ìì´ë¤. 322 var CAPTCHA_CHALLENGE_REFRESH_ICON = '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">' 323 + '<path d="M1 0.5H27C27.2761 0.5 27.5 0.723857 27.5 1V27C27.5 27.2761 27.2761 27.5 27 27.5H1C0.723858 27.5 0.5 27.2761 0.5 27V1C0.5 0.723858 0.723857 0.5 1 0.5Z" fill="white"/>' 324 + '<path d="M1 0.5H27C27.2761 0.5 27.5 0.723857 27.5 1V27C27.5 27.2761 27.2761 27.5 27 27.5H1C0.723858 27.5 0.5 27.2761 0.5 27V1C0.5 0.723858 0.723857 0.5 1 0.5Z" stroke="#BCC0C6"/>' 325 + '<path d="M15.3333 7.3335C15.3333 7.3335 15.8995 7.41438 18.2426 9.75752C20.5858 12.1007 20.5858 15.8997 18.2426 18.2428C17.4125 19.073 16.3995 19.609 15.3333 19.8509M15.3333 7.3335L19.3333 7.3335M15.3333 7.3335L15.3333 11.3335M12.6667 20.6667C12.6667 20.6667 12.1005 20.5858 9.75736 18.2427C7.41421 15.8995 7.41421 12.1005 9.75736 9.75739C10.5875 8.92721 11.6005 8.39116 12.6667 8.14925M12.6667 20.6667L8.66667 20.6668M12.6667 20.6667L12.6667 16.6668" stroke="#4B515B" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>' 326 + '</svg>'; 327 328 // ì´ ì°½ì ê¸ì°ê¸° í¼. `POST.init` ì´ì (ë¤ë¥¸ íë©´)ìë ìì¼ë¯ë¡ ê·¸ëë ë¹ ì§í©ì´ë¤. 329 var captchaChallengeForm = function(){ 330 return (post_form && post_form.length > 0) ? post_form : $('#post_form'); 331 }; 332 333 // ê·¸ í¼ì ì구 ë¸ë¡(ìì¼ë©´ ë¹ jQuery). í¼ë§ë¤ íëë§ ë§ë ë¤. 334 var captchaChallengeBlock = function(form){ 335 return form.find('[' + CAPTCHA_CHALLENGE_ATTR + ']'); 336 }; 337 338 var createCaptchaChallengeBlock = function(){ 339 var block = $('<div class="captcha_block" ' + CAPTCHA_CHALLENGE_ATTR + '="1" style="display: none;"></div>'); 340 var row = $('<div style="display: flex; align-items: center;"></div>'); 341 var holder = $('<div style="display: inline-flex; align-items: center; gap: 8px; margin-right: 16px;"></div>'); 342 var refresh = $('<div class="_captcha_challenge_refresh" style="cursor: pointer; width: 28px; height: 28px;"></div>'); 343 344 refresh.html(CAPTCHA_CHALLENGE_REFRESH_ICON); 345 holder.append($('<img width="113" height="30" alt="" />')).append(refresh); 346 row.append(holder) 347 .append('<input type="hidden" name="captcha_key" />') 348 .append('<input type="text" name="captcha_answer" class="capcha_input" />'); 349 block.append(row).append('<span class="captcha_description"></span>'); 350 351 // 문구ë 기존 LOCALIZE í¤ë¥¼ ê·¸ëë¡ ì´ë¤(ì í¤ë¥¼ ë§ë¤ì§ ìëë¤). ê°ì **ìì±Â·í ì¤í¸ë¡** 352 // ë£ëë¤ â 문ìì´ ì¡°í©ì¼ë¡ HTML ì ë¼ì°ë©´ íì§í ë¬¸êµ¬ê° ë§í¬ì ì íë¤ ì ìë¤. 353 block.find('input[name="captcha_answer"]').attr('placeholder', getLocalizeString('ì¤ëª _ë³´ì문ìì ë ¥', '', 'ë³´ì 문ì를 ì ë ¥í´ ì£¼ì¸ì.')); 354 block.find('.captcha_description').text(getLocalizeString('ì¤ëª _공백ìì´ì ë ¥ëì문ì구ë¶', '', '공백 ìì´ ì ë ¥í´ ì£¼ì¸ì. ëì문ì를 구ë¶í©ëë¤.')); 355 356 return block; 357 }; 358 359 // 캡차 ë¸ë¡ì í¼ì ë¶ì¸ë¤. 360 // 361 // ì리 â `.editor_box`(ìì±ì ìì½ ìë·ì 목·ìëí°ë¥¼ 묶ì ìì)ì **첫 ìì**. ê·¸ ììê° 362 // ìë ì¤í¨ì´ë©´ í¼ ë§¨ ìì¼ë¡ í´ë°±íë¤(ë ë¤ í¼ **ì**ì´ë¤: ëµì´ ì ì¶ì ì¤ë¦¬ë ì¡°ê±´ì ê°ë¤). 363 // 364 // **ë°ê¹¥ì´ ìëë¼ ì**ì¸ ì´ì (ì¤ì¸¡): ì´ ì¤í¨ì fixed í¤ë ëì´ë§í¼ì ìë¨ ì¬ë°±ì 365 // `.editor_box` ì ì¤ë¤. ê·¸ ìì íì ë¡ ë£ì¼ë©´ ê·¸ ì¬ë°±ì ë°ì§ ëª»í´ ë¸ë¡ì´ 문ì
365 ìµìë¨ì 366 // ê¹ë¦¬ê³ í¤ëê° ê·¸ ì를 ë®ëë¤ â 모ë°ì¼ììë í¼ì´ ë·°í¬í¸ë³´ë¤ ì§§ì ì¤í¬ë¡¤ë ìì´ 367 // ì¬ì©ìê° ìº¡ì°¨ë¥¼ **ë³¼ ì ììë¤**(390í ì¤ì¸¡). ìì ë£ì¼ë©´ ê°ì ì¬ë°±ì ë¬¼ë ¤ë°ëë¤. 368 var attachCaptchaChallengeBlock = function(form, block){ 369 var editor_box = form.find('.editor_box').first(); 370 371 if (editor_box.length > 0) { 372 editor_box.prepend(block); 373 } else { 374 form.prepend(block); 375 } 376 }; 377 378 // ë¸ë¡ì´ íë©´ ë°ì´ë©´ 그쪽ì¼ë¡ ì¤í¬ë¡¤íë¤ â 캡차를 ì구íë©´ì ë³´ì´ì§ ìì¼ë©´ í ì ìë¤. 379 // ì´ë¯¸ ë³´ì´ë©´ ì무ê²ë íì§ ìëë¤(ìë¡ê³ 침ë§ë¤ íë©´ì´ íì§ ìê²). 380 // ì¤í¬ë¡¤ API ê° ìë íê²½(구í ì¹ë·°Â·íë¤ì¤ ëì)ììë ì¡°ì©í ì§ëê°ë¤ â ê´ì¸¡ì´ ìëë¼ 381 // í¸ì 기ë¥ì´ë¼, ìë¤ê³ ë±ë¡ì´ ë§íë©´ ì ëë¤. 382 var captchaChallengeScrollIntoViewIfNeeded = function(block){ 383 var node = block.get(0); 384 385 if (!node || typeof node.getBoundingClientRect !== 'function') return; 386 387 var rect = node.getBoundingClientRect(); 388 389 if (!rect || typeof rect.top !== 'number' || typeof rect.bottom !== 'number') return; 390 391 var viewport_height = window.innerHeight || 0; 392 393 if (rect.top < 0 || rect.bottom > viewport_height) { 394 if (typeof node.scrollIntoView === 'function') { 395 node.scrollIntoView({block: 'center'}); 396 } 397 } 398 }; 399 400 var applyCaptchaChallenge = function(result){ 401 var form = captchaChallengeForm(); 402 403 // 그릴 ì ìë ìëµì´ë©´ ë¬¸êµ¬ë§ ë¨ëë¤(ë±ë¡ì ë§ì§ ìëë¤ â ìë²ê° ì ì¥ ì¬ë¶ë¥¼ ì íë¤). 404 // ì´ë¯¸ì§ í¤ ì´ë¦ì ì구 ìëµ(iframe ì¤í¬ë¦½í¸)ê³¼ ìë¡ê³ 침 ìëµì´ **ê°ë¤**(`captcha_img`). 405 if (form.length === 0 || !result || !result.captcha_img || !result.key) return; 406 407 var block = captchaChallengeBlock(form); 408 409 if (block.length === 0) { 410 block = createCaptchaChallengeBlock(); 411 block.find('._captcha_challenge_refresh').on('click', function(){ 412 refreshCaptchaChallenge(); 413 }); 414 // í¤ë ìë 첫 ìì ìì ë£ëë¤ â ê·¸ ììê° ìë ì¤í¨ì´ë©´ í¼ ë§¨ ìì¼ë¡ í´ë°±íë¤ 415 // (ë ë¤ í¼ **ì**ì´ë¤: 캡차 ëµì´ í¼ ì ì¶ì ì¤ë¦¬ë ì¡°ê±´ì ê·¸ëë¡ë¤). 416 attachCaptchaChallengeBlock(form, block); 417 } 418 419 block.find('img').attr('src', result.captcha_img); 420 block.find('input[name="captcha_key"]').val(result.key); 421 block.find('input[name="captcha_answer"]').val(''); 422 block.css('display', 'flex'); 423 424 captchaChallengeScrollIntoViewIfNeeded(block); 425 }; 426 427 // ìë¡ê³ 침 â **ë°ê¸ ì ì© ìëí¬ì¸í¸**ë¡ ì ì´ë¯¸ì§Â·í¤ë§ ë°ëë¤. 428 // 429 // ê¸ ë±ë¡ ê²½ë¡(post_add.cm)를 ë¤ì íì°ë©´ ì ëë¤: ê·¸ ìì²ì íì ·ê²ì´í¸ë¥¼ ë¤ì íì°ê³ , 430 // **본문·ì ëª©ì´ ê·¸ëë¡ ì ì¥ëì´ ì¤ì ë¡ ê¸ì´ ì¬ë¼ê°ë¤** â ì¬ì©ìë ìº¡ì°¨ë§ ìë¡ ë°ì¼ë ¤ íë¤. 431 // ê·¸ëì í¼ì ì§ë ¬íí´ ë³´ë´ì§ ìëë¤(ê·¸ ìì²´ê° ì ì¥ ìì²ì ì¬ë£ë¤). ìë²ë ì´ í¤ì ê²°ì 432 // íìì ì ì (DEL)í ìì²ìë§ ì 캡차를 ë°ê¸íë¤. 433 var refreshCaptchaChallenge = function(){ 434 var form = captchaChallengeForm(); 435 var block = captchaChallengeBlock(form); 436 if (form.length === 0 || block.length === 0) return; 437 438 $.ajax({ 439 type:'post', 440 data:{ 441 'captcha_key': block.find('input[name="captcha_key"]').val(), 442 'target': 'post', 443 'band_captcha': '1' 444 }, 445 url:'/ajax/refresh_captcha.cm', 446 dataType:'json', 447 success:function(result){ 448 if (result.msg == 'SUCCESS') { 449 // ì ì´ë¯¸ì§Â·ì í¤ë¥¼ ê·¸ëë¡ ë°ìíë¤(ì ë ¥ì¹¸ì ë¹ì´ë¤). 450 applyCaptchaChallenge(result); 451 } else { 452 alert(result.msg); 453 } 454 } 455 }); 456 }; 457 458 // ë¶ëª¨ ì°½ì 캡차를 ëì°ë í¨ì â **iframe ìì ìë² ì¤í¬ë¦½í¸ê° ë¶ë¥¸ë¤**(post_add.cm). 459 // 문구ë 기존 ê²½ë¡(submit_error)ì **ê°ì alert** ë¡ ëì´ë¤: 캡차를 ê·¸ë¦¬ì§ ëª»íë ìëµì´ë©´ 460 // ì§ê¸ê¹ì§ì ê°ì´ ë¬¸êµ¬ë§ ë³´ì´ê³ , ì¬ì©ìë ë¤ì ëë¬ ì ì구를 ë°ëë¤. 461 var showBandCaptcha = function(data){ 462 applyCaptchaChallenge(data); 463 464 // 문구ë ìë²ê° ë ì¤ì´ ë³´ë¸ë¤(기존 í¤ 'ì¤ëª _ìëì ë ¥ë¬¸ìë¶ì¼ì¹'). ìë ìëµì´ë©´ 465 // **ë¹ alert 를 ëì°ì§ ìê³ ** ì ì¶ ì ê¸ë§ í¼ë¤ â ì¬ì©ìë ë¤ì ëë¬ ì ì구를 ë°ëë¤. 466 if (data && data.msg) { 467 endSubmit(data.msg); 468 } else { 469 sent = false;
470 } 471 }; 472 473 var postCancel = function(back_url){ 474 if(isIOS && isSafari){ 475 var s_top = $(this).scrollTop(); 476 $write_header.css({'-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': 0}); 477 $fr_m_custom.toggleClass('m_sticky_container', s_top > m_sticky_container_trigger_top); 478 $fr_m_custom.toggleClass('m_sticky_container_ios', s_top > m_sticky_container_trigger_top); 479 if(s_top > m_sticky_container_trigger_top){ 480 $toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'position': 'fixed', 'top': $write_header.height() + 'px'}); 481 }else{ 482 $toolbarContainer.css({'-webkit-transition': 'none', 'transition': 'none', 'top': 'auto'}); 483 } 484 } 485 document.location.href = back_url; 486 }; 487 488 var is_more = true; 489 var listing_obj = {}; 490 491 var postInitMoreList = function(wcode,bcode,type){ 492 listing_type = type; 493 $widget_wrap = $("#"+wcode); 494 board_code = bcode; 495 more_list_page = 1; 496 is_more = true; 497 return true; 498 }; 499 500 var toggleAlarmPopup = function(){ 501 var $alarm_popup = $('#alarm_popup'); 502 var $dLabel = $('#dLabel'); 503 $alarm_popup.toggleClass('open'); 504 if($alarm_popup.hasClass('open')){ 505 $(window).on('click.alarm_popup',function(event){ 506 var $top_closest = $(event.target).closest('a'); 507 if($top_closest.attr('id')!='dLabel'){ 508 var $closest = $(event.target).closest('ul'); 509 if($closest != null && !$closest.hasClass('dropdown-menu')){ 510 $alarm_popup.removeClass('open'); 511 $(window).off('click.alarm_popup'); 512 var alarm_group_list = $alarm_popup.find("input[type='checkbox']").is(":checked"); 513 if(alarm_group_list) $dLabel.addClass('active'); 514 else $dLabel.removeClass('active'); 515 } 516 } 517 }); 518 } 519 }; 520 var postDeleteFile = function(id){ 521 var obj = $('#'+id); 522 var size = obj.data('size'); 523 total_file_size -= size; 524 obj.remove(); 525 }; 526 var postAddFile = function(filename,file_code,tmp_idx,size){ 527 var uniq_id = makeUniq('upfile_'); 528 total_file_size += size; 529 var clear_ico = $('<i class="zmdi zmdi-close"></i>').data({'item':uniq_id,size:size}).click(function(e){ 530 postDeleteFile(uniq_id); 531 }); 532 var hidden_input = ''; 533 if(file_code.length>0) { 534 hidden_input = $('<input name="upload_files[]" value="' + file_code + '" type="hidden" />'); 535 }else if(Math.round(tmp_idx) > 0){ 536 hidden_input = $('<input name="temp_files[]" value="' + tmp_idx + '" type="hidden" />'); 537 } 538 var li = $('<li>').attr('id',uniq_id).data({'item':uniq_id,size:size}); 539 // XSS ë°©ì§: íì¼ëª ì HTMLë¡ í´ìëì§ ìëë¡ textë¡ ì½ì (KVE-2025-2806) 540 var $file_name_dom = $('<span></span>'); 541 $file_name_dom.text(filename); 542 $file_name_dom.append($('<em></em>').text(' ' + GetFileSize(size))); 543 li.append($file_name_dom); 544 li.append(clear_ico); 545 li.append(hidden_input); 546 $("#file_list").append(li); 547 }; 548 549 var MovePostPopup = function(post_code,menu_url){ 550 $.ajax({ 551 type : 'post', 552 data:{'post_code':post_code,'menu_url':menu_url}, 553 url : '/ajax/move_post_popup.cm', 554 dataType : 'json', 555 success : function(result){ 556 if(result.msg == 'SUCCESS'){ 557 var html = $(result.html); 558 $.cocoaDialog.open({type : 'site_alert', custom_popup : html}); 559 }else{ 560 alert(result.msg); 561 } 562 } 563 }); 564 }; 565 566 /** 567 * ì¤ì ë ì¹´í ê³ ë¦¬ ìì± 568 * @returns {Array} 569 */ 570 var categoryList = function(str_category){ 571 var b_data = board_data; 572 var category_type_list_temp = []; 573 var category_list_default = {}; 574 category_list_default.key = 0; 575 category_list_default.value = str_category; 576 category_type_list_temp.push(category_list_default); 577 578 if(Array.isArray(b_data.category_list)){ 579 $.each(b_data.category_list, function(key, val){ 580 var category_list = {}; 581 var $name = val.name; 582 var $color = val.color; 583 category_list.key = key + 1; 584 category_list.value = '<span style="color:' + $color + '">' + RemoveTag($name) + '</span>'; 585 category_type_list_temp.push(category_list); 586 }); 587 } 588 return category_type_list_temp; 589 }; 590 591 /** 592 * ë¶ë¥ 리ì¤í¸ ì¶ë ¥ 593 * @param $obj 594 * @param default_code 595 */ 596 var categoryTypeSelect = function($obj,default_code){ 597 $obj.find('._category_type_list').setSelectBox({ 598 option: category_list, 599 'set' : { 600 select_custom_cls:'category_select', 601 custom_cls:'category_dropdown', 602 width:180 603 }, 604 'default' : default_code, 605 change: function (o) { 606 $('#category_type').val(o.key); 607 } 608 }); 609 }; 610 611 var viewReviewPostDetail = function(idx, board_code){ 612 $(function(){ 613 $.ajax({ 614 type : 'POST', 615 data : {idx : idx, board_code : board_code}, 616 url : ('/ajax/review_post_detail_view.cm'), 617 dataType : 'json', 618 async : false, 619 cache : false, 620 success : function(res){ 621 if(res.msg === 'SUCCESS'){ 622 $.cocoaDialog.open({ 623 type : 'prod_detail review', custom_popup : res.html, width : 800}); 624 if(history.replaceState && history.pushState){ 625 // ëª¨ë¬ íì¤í 리 커ì¤í (IE 10 ì´ì) 626 var current_url = location.href.indexOf('#') === -1 ? location.href : location.href.substr(0, location.href.indexOf('#')); 627 var back_url = document.referrer.indexOf('#') === -1 ? document.referrer : document.referrer.substr(0, document.referrer.indexOf('#')); 628 history.pushState(null, null, current_url); 629 history.replaceState(null, null, current_url + "#prod_detail_review!/" + res.idx); 630 }else{ 631 location.hash = "prod_detail_review!/" + res.idx; 632 } 633 $(window).off('hashchange').on('hashchange',function(){ 634 var hash_qna_spilt = location.hash.split('!/')[1]; 635 if(!hash_qna_spilt){ 636 $.cocoaDialog.close(); 637 }else{ 638 var hash_spilt_tab = location.hash.split('!/')[0]; 639 if(hash_spilt_tab === '#prod_detail_review'){ 640 viewReviewPostDetail(hash_qna_spilt,board_code); 641 }else if(hash_spilt_tab === '#prod_detail_qna'){ 642 viewQnaPostDetail(hash_qna_spilt,board_code); 643 } 644 } 645 }); 646 $('.modal_prod_detail').off('hidden.bs.modal').on('hidden.bs.modal', function (e) { 647 removeReviewHash(); 648 }); 649 }else{ 650 alert(res.msg); 651 } 652 } 653 }); 654 }); 655 }; 656 657 var removeReviewHash = function(){ 658 $(window).off('hashchange'); 659 $('html').toggleClass('modal-scroll-control', false); 660 var hash_review_spilt = location.hash.split('!/')[1]; 661 if(hash_review_spilt){ 662 if(history.replaceState && history.pushState){ 663 history.back(); 664 }else{ 665 location.href = '#prod_detail_review'; 666 } 667 } 668 }; 669 670 var viewQnaPostDetail = function(idx, board_code){ 671 $(function(){ 672 $.ajax({ 673 type : 'POST', 674 data : {idx : idx, board_code : board_code}, 675 url : ('/ajax/qna_post_detail_view.cm'), 676 dataType : 'json', 677 async : false, 678 cache : false, 679 success : function(res){ 680 if(res.msg === 'SUCCESS'){ 681 $.cocoaDialog.open({ 682 type : 'prod_detail review', custom_popup : res.html, width : 800}); 683 if(history.replaceState && history.pushState){ 684 // ëª¨ë¬ íì¤í 리 커ì¤í (IE 10 ì´ì) 685 var current_url = location.href.indexOf('#') === -1 ? location.href : location.href.substr(0, location.href.indexOf('#')); 686 var back_url = document.referrer.indexOf('#') === -1 ? document.referrer : document.referrer.substr(0, document.referrer.indexOf('#')); 687 history.pushState(null, null, current_url); 688 history.replaceState(null, null, current_url + "#prod_detail_qna!/" + res.idx); 689 }else{ 690 location.hash = "prod_detail_qna!!/" + res.idx; 691 } 692 $(window).off('hashchange').on('hashchange',function(){ 693 var hash_qna_spilt = location.hash.split('!/')[1]; 694 if(!hash_qna_spilt){ 695 $.cocoaDialog.close(); 696 }else{ 697 var hash_spilt_tab = location.hash.split('!/')[0]; 698 if(hash_spilt_tab === '#prod_detail_review'){ 699 viewReviewPostDetail(hash_qna_spilt, board_code); 700 }else if(hash_spilt_tab === '#prod_detail_qna'){ 701 viewQnaPostDetail(hash_qna_spilt, board_code); 702 } 703 } 704 }); 705 $('.modal_prod_detail').off('hidden.bs.modal').on('hidden.bs.modal', function (e) { 706 removeQnaHash(); 707 }); 708 }else{ 709 alert(res.msg); 710 } 711 } 712 }); 713 }); 714 }; 715 716 var removeQnaHash = function(){ 717 $(window).off('hashchange'); 718 $('html').toggleClass('modal-scroll-control', false); 719 var hash_qna_spilt = location.hash.split('!/')[1]; 720 if(hash_qna_spilt){ 721 if(history.replaceState && history.pushState){ 722 history.back(); 723 }else{ 724 location.href = '#prod_detail_qna'; 725 } 726 } 727 }; 728 729 var alertNoSale = function(){ 730 $.cocoaDialog.open({ 731 type: 'site_alert', 732 custom_popup: ` 733 <div class="layer_pop"> 734 <div class="container-fluid"> 735 <p class="tw-text-center tw-mb-0"> 736 ${getLocalizeString('ì¤ëª _ìííì´ì§ì´ëë¶ê°ìë´', '', 'í´ë¹ ìí íì´ì§ë¡ ì´ëí ì ììµëë¤.')} 737 </p> 738 </div> 739 <div class="btn-group-justified"> 740 <a href="javascript:" class="btn" onclick="$('.modal_site_alert').modal('hide');">${getLocalizeString('ë²í¼_íì¸', '', 'íì¸')}</a> 741 </div> 742 </div>` 743 }, function(){ 744 $('.modal_site_alert').css('z-index', 100002); 745 }); 746 } 747 748 return { 749 'init' : function(code, data, str_category) { 750 postInitWrite(code, data, str_category); 751 },
752 'initMoreList' : function(widget_code,board_code,listing_type) { 753 return postInitMoreList(widget_code,board_code,listing_type); 754 }, 755 'submit' : function(){ 756 postSubmit(); 757 }, 758 'submit_error': function(msg){ 759 endSubmit(msg); 760 }, 761 // ìë²ê° ì구í 문ì 캡차(ì 매í ì¤í¸ ì ì)를 ë±ë¡ ë²í¼ ìëì ëì´ë¤ â iframe ìì 762 // ìëµ ì¤í¬ë¦½í¸(post_add.cm)ê° ë¶ë¥¸ë¤. í¨ì ì´ë¦Â·ì¸ì 모ìì´ ìë²ìì ê³ì½ì´ë¤. 763 'showBandCaptcha': function(data){ 764 showBandCaptcha(data); 765 }, 766 'postCancel': function(back_url){ 767 postCancel(back_url); 768 }, 769 'addFile' : function(filename,file_code,tmp_idx,size){ 770 postAddFile(filename,file_code,tmp_idx,size); 771 }, 772 'androidAppPostImageUploadComplete' :function(image){ 773 androidAppPostImageUploadComplete(image); 774 }, 775 'androidAppPostImageUploadAllComplete' :function(){ 776 androidAppPostImageUploadAllComplete(); 777 }, 778 'deletePost' : function (board_code,code,return_url,secret_pass) { 779 postDeletePost(board_code,code,return_url,secret_pass); 780 }, 781 'moreList' : function(keyword,keyword_type,q){ 782 moreList(keyword,keyword_type,q); 783 }, 784 'toggleAlarmPopup' : function(){ 785 toggleAlarmPopup(); 786 }, 787 'MovePostPopup' : function(post_code,menu_url){ 788 MovePostPopup(post_code,menu_url); 789 }, 790 'deleteCoverImage' : function(){ 791 deleteCoverImage(); 792 }, 793 'deleteLibraryImage' : function(url){ 794 deleteLibraryImage(url); 795 }, 796 'categoryTypeSelect' : function($obj,defult_code){ 797 categoryTypeSelect($obj,defult_code); 798 }, 799 'categoryList' : function(str_category){ 800 categoryList(str_category); 801 }, 802 'viewReviewPostDetail' : function(idx, board_code){ 803 viewReviewPostDetail(idx, board_code); 804 }, 805 'removeReviewHash' : function(){ 806 removeReviewHash(); 807 }, 808 'viewQnaPostDetail' : function(idx, board_code){ 809 viewQnaPostDetail(idx, board_code); 810 }, 811 'removeQnaHash' : function(){ 812 removeQnaHash(); 813 }, 814 'alertNoSale' : function(){ 815 alertNoSale(); 816 } 817 }; 818}(); 819 820function POST_INIT_LIST(code,data){ 821 var that = this; 822 that.type_data = data; 823 that.code = code; 824 that.windowWidth = $(window).width(); 825 that.change_timer = setTimeout(function(){},1); 826 that.listing_obj = $('#post_card_'+that.code); 827 828 that.listing_obj.imagesLoaded().always(function(ins) { 829 that.listResize(); 830 }); 831 832 $('body').off('gridChange.'+that.code).on('gridChange.'+that.code,function(){ 833 that.listing_obj.imagesLoaded().always(function(ins) { 834 that.listResize(); 835 }); 836 }); 837 838 $(window).off('resize.'+that.code).on('resize.'+that.code,function(){ 839 if ($(window).width() != that.windowWidth) { 840 that.windowWidth = $(window).width(); 841 }else{ 842 return; 843 } 844 clearTimeout(that.change_timer); 845 that.change_timer = setTimeout(function(){ 846 that.listResize(); 847 },1000); 848 }); 849 850 this.listResize = function(){ 851 that.listing_obj.imagesLoaded() 852 .always(function(){ 853 var window_width = $(window).width(); 854 if(!that.type_data.grid_gutter){ 855 that.type_data.grid_gutter = 15; 856 } 857 if($('body').hasClass('device_type_m')) 858 window_width = 370; 859 if(window_width <= 991) 860 that.type_data.grid_gutter = that.type_data.grid_gutter/2; 861 that.listing_obj.css({'margin':'0 -'+that.type_data.grid_gutter+'px'}); 862 if(that.type_data['design_type'] == 'grid' || that.type_data['design_type'] == 'masonry'){ 863 that.listing_obj.css({'margin-top':'-'+that.type_data.grid_gutter+'px'}); 864 } 865 866 var cnt = parseInt(that.type_data.grid_col_count); 867 var inner_width = that.listing_obj.width(); 868 869 if(window_width <= 991){ 870 if(typeof that.type_data.grid_mobile_col_count == "undefined") 871 cnt = 2; 872 else 873 cnt = parseInt(that.type_data.grid_mobile_col_count); 874 }else{ 875 if(that.type_data.design_type == 'slide'){ 876 inner_width = that.listing_obj.parent().width(); 877 }else{ 878 inner_width = that.listing_obj.width(); 879 } 880 881 if(that.type_data.grid_extend_fix != 'Y'){ 882 var s_width = (that.type_data.max_width - (that.type_data.document_margin * 2)) + that.type_data.grid_gutter * 2; 883 var item_max = s_width - ((cnt - 1) * parseInt(that.type_data.grid_gutter)); 884 var grid_width = Math.floor(item_max / cnt); 885 var current_width = Math.floor((inner_width - ((cnt - 1) * parseInt(that.type_data.grid_gutter))) / cnt); 886 if(current_width > grid_width){ 887 cnt = Math.floor(inner_width / grid_width); 888 } 889 } 890 } 891 892 var width = Math.floor(inner_width / cnt); 893 if(that.type_data['design_type'] == 'grid'){ 894 that.listing_obj.find('._post_item_wrap').css({'padding' : that.type_data.grid_gutter + 'px'}); 895 that.runColSize(cnt); 896 }else if(that.type_data['design_type'] == 'masonry'){ 897 var $masonry_item = that.listing_obj.find('.ma-item'); 898 var masonry_item_count = $masonry_item.length; 899 that.listing_obj.find('.ma-item').css({'width' : width,'padding' : that.type_data.grid_gutter + 'px'}); 900 that.runMasonry(masonry_item_count); 901 } 902 }); 903 }; 904 905 this.runColSize = function(col_cnt){ 906 that.listing_obj.find('._card_wrap').show(); 907 var i = 1; 908 var $_row = $('<div />').addClass('_post_row post_row'); 909 var is_append = false;
910 that.listing_obj.find('._dummy_item').remove(); 911 var $item = that.listing_obj.find('._card_wrap'); 912 var item_count = $item.length; 913 914 $item.each(function(e,$_obj){ 915 $_row.append($_obj); 916 is_append = false; 917 if(i % col_cnt == 0){ 918 that.listing_obj.append($_row); 919 is_append = true; 920 $_row = $('<div />').addClass('_post_row post_row'); 921 } 922 i++; 923 }); 924 925 if(!is_append){ 926 var $tmp_item = $_row.find('._post_item_wrap'); 927 if($tmp_item.length >0 ){ 928 if($tmp_item.length < col_cnt){ 929 var remain_cnt = col_cnt - $tmp_item.length; 930 for(var i = 0; i <remain_cnt; i++){ 931 var $dummy_col = $('<div/>').addClass('dummy_col item_post _item _dummy_item list-style-card'); 932 $_row.append($dummy_col); 933 } 934 } 935 that.listing_obj.append($_row); 936 } 937 } 938 939 that.listing_obj.find('._post_row').each(function(){ 940 var $tmp_item = $(this).find('._post_item_wrap'); 941 if($tmp_item.length ==0 ){ 942 $(this).remove(); 943 } 944 }); 945 946 that.imgHeight(); 947 }; 948 949 this.imgHeight = function(){ 950 if(that.type_data['design_type'] == 'grid'){ 951 var height = Math.ceil(that.listing_obj.find('._post_item_wrap').eq(0).width() / (that.type_data.img_ratio / 100)); 952 that.listing_obj.find('._img_wrap').height(height); 953 } 954 }; 955 956 this.runMasonry = function(count){ 957 if(count > 0){ 958 let is_masonry_timeout; 959 that.listing_obj.off('layoutComplete').on( 'layoutComplete', function() { 960 if(that.listing_obj.css('visibility') !== 'visible'){ 961 that.listing_obj.css('visibility', 'visible'); 962 that.listing_obj.find('img').lazyload({ 963 'effect' : 'fadeIn', 964 'effect_speed' : 50, // fadeIn ìê° ë¨ì¶(기본 400msâ50ms) 965 'load' : function() { 966 if(typeof is_masonry_timeout === 'number'){ 967 clearTimeout(is_masonry_timeout); 968 } 969 is_masonry_timeout = setTimeout(function(){ 970 /* ë ì´ì§ ë¡ë ìë£ í 100ms íì masonry layout ì¬ì¤í */ 971 that.listing_obj.masonry('layout'); 972 }, 100); 973 }, 974 'threshold': (window.innerHeight * 2) 975 }); 976 } 977 }); 978 that.listing_obj.masonry({ 979 itemSelector: '.ma-item' 980 }); 981 }else{ 982 that.listing_obj.css('visibility','visible'); 983 } 984 }; 985}
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.