PageSourceSearch

http://comiworks.kr/static/js/mapboard.js?20260922

js comiworks.kr collected 2026-10-08 23:30:56 UTC 20,346 bytes, 488 lines download raw bytes

1const map_board = function () {
2
3    var moreReplyM = function (el) {
4        var more = $(el).attr('data-more');
5        var comment_no = $(el).attr('data-no');
6        var page_no = Number($("#replySortBoxM").find("input[name='page_no']").val()) + 1;
7        var sort_btn = $("#replySortBoxM").find(".reply-sort-type");
8        var sort = '';
9        $.each(sort_btn, function () {
10            if ($(this).hasClass('active')) {
11                sort = $(this).val();
12            }
13        });
14        var visible = checkVisible($(el).find("li:last"), 'visible');
15        if (visible === true) {
16            visible = false;
17            if (more == 'true') {
18                $.ajax({
19                    type: "Get",
20                    url: getLocale() + '/mapboard/ajaxboardreply',
21                    data: 'comment_index=1' + '&comment_no=' + comment_no + '&page_no=' + page_no + '&sort=' + sort,
22                    dataType: 'Json',
23                    async: false,
24                    success: function (result) {
25                        if (result.code) {
26                            let lists = result.data['lists'];
27                            let more = result.data['more'];
28                            const html = _makeReplyHtml(lists);
29                            $("#replyCommentM").append(html);
30                            const DetailCommentM = document.getElementById('DetailCommentM');
31                            DetailCommentM.dataset.more = more;
32                            DetailCommentM.dataset.no = comment_no;
33                        }
34                    }
35                })
36                $("#replySortBoxM").find("input[name='page_no']").val(page_no)
37            }
38        }
39    }
40
41    //답글 더보기
42    var moreReply = function (el, comment_no) {
43        var more = $(el).attr('data-more');
44        var page_no = Number($("#replySortBox" + comment_no).find("input[name='page_no']").val()) + 1;
45        var sort_btn = $("#replySortBox" + comment_no).find(".reply-sort-type");
46        var sort = '';
47        $.each(sort_btn, function () {
48            if ($(this).hasClass('active')) {
49                sort = $(this).val();
50            }
51        });
52        var visible = checkVisible($(el).find("li:last"), 'visible');
53        if (visible === true) {
54            visible = false;
55            if (more == 'true') {
56                $.ajax({
57                    type: "Get",
58                    url: getLocale() + '/mapboard/ajaxboardreply',
59                    data: 'comment_index=1' + '&comment_no=' + comment_no + '&page_no=' + page_no + '&sort=' + sort,
60                    dataType: 'Json',
61                    async: false,
62                    success: function (result) {
63                        if (result.code) {
64                            let lists = result.data['lists'];
65                            let more = result.data['more'];
66                            const html = _makeReplyHtml(lists);
67                            $("#replyList" + comment_no).append(html);
68                            const replySortBox = document.getElementById('replyList' + comment_no);
69                            replySortBox.dataset.more = more;
70                        }
71                    }
72                })
73                $("#replySortBox" + comment_no).find("input[name='page_no']").val(page_no)
74            }
75        }
76    }
77
78    //모바일용 댓글상세보기 출력
79    var openMobileComment = function (el, comment_no) {
80        $('.m-comment-wrap').addClass('on');
81        $('html').addClass('comments-on');
82        $.ajax({
83            type: "Get",
84            url: getLocale() + '/mapboard/ajaxBoardComment',
85            data: 'no=' + comment_no,
86            dataType: 'Json',
87            success: function (result) {
88                if (result.code) {
89                    var writer = '';
90                    if (result.data[0].post_master == 1) {
91                        writer = result.data[0].user_name + '<label>' + getLangMsg('writer') + '</label>';
92                    } else {
93                        writer = result.data[0].user_name;
94                    }
95                    $("#mainCommentM").find(".name").html(writer);
96                    $("#mainCommentM").find(".delete-btn").data('no', comment_no);
97                    $("#mainCommentM").find(".contents").text(result.data[0].contents);
98                    $("#mainCommentM").find(".date").text(result.data[0].insert_date);
99                    $("#mainCommentM").find(".reply-cnt").text(result.data[0].reple_cnt);
100                    if (result.data[0].reple_cnt > 0) {
101                        $("#mainCommentM").find(".reply-info").show()
102                    } else {
103                        $("#mainCommentM").find(".reply-info").hide()
104                    }
105                    var sort_btn = $("#replySortBoxM").find(".reply-sort-type");
106                    var sort = '';
107                    $.each(sort_btn, function () {
108                        if ($(this).hasClass('active')) {
109                            sort = $(this).val();
110                        }
111                    });
112                    // var page_no = $("#replySortBoxM").find("input[name='page_no']").val();
113                    var comment_index = Number(result.data[0].comment_index);
114                    viewReplyM(comment_index, comment_no, 1, sort, el);
115                } else {
116                    alert(result.message);
117                }
118
119            }
120        });
121    }
122
123
124    //모바일용 답글쓰기 출력
125    var openReplyWriteM = function () {
126        $('.m-comment-wrap, .m-comment-write-wrap').addClass('on');
127        $('html').addClass('comments-on');
128        var comment_no = $("#replySortBoxM").find("input[name='comment_no']").val()
129        $("#replyfrmM").find("input[name='comment_no']").val(comment_no);
130    }
131
132    //모바일용 답글출력
133    var viewReplyM = function (comment_index, comment_no, page_no = 1, sort = 1, el = null) {
134        $("#replySortBoxM").find("button").focus();
135        $.ajax({
136            type: "Get",
137            url: getLocale() + '/mapboard/ajaxboardreply',
138            data: 'comment_index=' + (comment_index + 1) + '&comment_no=' + comment_no + '&sort=' + sort,
139            dataType: 'Json',
140            success: function (result) {
141                if (result.code) {
142                    let lists = result.data['lists'];
143                    let more = result.data['more'];
144                    const html = _makeReplyMHtml(lists);
145                    $("#replyCommentM").html(html);
146                    const DetailCommentM = document.getElementById('DetailCommentM');
147                    DetailCommentM.dataset.more = more;
148                    DetailCommentM.dataset.no = comment_no;
149
150                    $("#replySortBoxM").show();
151                } else {
152                    $("#replyCommentM").html('');
153
154                }
155                $("#replySortBoxM").find("input[name='page_no']").val(page_no);
156                $("#replySortBoxM").find("input[name='comment_no']").val(comment_no);
157
158            }
159        });
160    }
161
162    //답글출력
163    var viewReply = function (comment_index, comment_no, page_no = 1, sort = 'old', el = null) {
164        $.ajax({
165            type: "Get",
166            url: getLocale() + '/mapboard/ajaxboardreply',
167            data: 'comment_index=' + (comment_index + 1) + '&comment_no=' + comment_no + '&sort=' + sort,
168            dataType: 'Json',
169            success: function (result) {
170                if (result.code) {
171                    let lists = result.data['lists'];
172                    let more = result.data['more'];
173                    const html = _makeReplyHtml(lists);
174                    const replySortBox = document.getElementById('replyList' + comment_no);
175                    replySortBox.dataset.more = more;
176                    if (el != null) {
177                        if ($(el).hasClass('reply-sort-type')) {
178                            $(el).parent().find('.reply-sort-type').removeClass('active');
179                            $(el).addClass('active');
180                        } else {
181
182                            $(el).hide();
183                            $(el).next('button').show();
184                        }
185                        $("#replyList" + comment_no).html(html);
186                        $("#replyList" + comment_no).show();
187                        $("#replySortBox" + comment_no).show();
188                    }
189                } else {
190                    $("#replyList" + comment_no).html('');
191                }
192
193                $("#replySortBox" + comment_no).find("input[name='page_no']").val(page_no);
194            }
195        });
196    }
197
198    //답글 닫기
199    var closeReply = function (el, comment_no) {
200        $("#replyList" + comment_no).html('');
201        $("#replyList" + comment_no).hide();
202        $("#replySortBox" + comment_no).hide();
203        $(el).prev('button').show();
204        $(el).hide();
205    }
206    //답글 html 생성
207    var _makeReplyHtml = function (obj) {
208        var html = '';
209        $.each(obj, function (idx, val) {
210            post_master = '';
211            if (val.post_master == 1) {
212                post_master = '<label>' + LANGS.writer + '</label>';
213            }
214            html += '<li class="comments-level-2">';
215            html += '    <div class="info">';
216            html += '        <span class="name">' + val.user_name + ' ' + post_master + '</span>';
217            html += '        <div class="btn-list">';
218            if (val.mod_perm) {
219                html += '            <button type="button" class="btn text-btn delete-btn" data-toggle="modal" data-target="#modal2" data-no="' + val.no + '">' + LANGS.delete + '</button>';
220            }
221            html += '        </div>';
222            html += '    </div>';
223            html += '    <div class="contents">' + val.contents + '</div>';
224            html += '    <div class="bottom">';
225            html += '        <span class="date">' + val.insert_date + '</span>';
226            html += '    </div>';
227            html += '</li>';
228        });
229        return html;
230    }
231    //답글 모바일용 html 생성
232    var _makeReplyMHtml = function (obj) {
233        var html = '';
234        $.each(obj, function (idx, val) {
235            post_master = '';
236            if (val.post_master == 1) {
237                post_master = '<label>' + LANGS.writer + '</label>';
238            }
239            html += '<li class="comments-level-2">';
240            html += '    <div class="info">';
241            html += '        <span class="name">' + val.user_name + ' ' + post_master + '</span>';
242            html += '        <div class="btn-list">';
243            if (val.mod_perm) {
244                html += '            <button type="button" class="btn text-btn delete-btn" data-toggle="modal" data-target="#modal2" data-no="' + val.no + '">' + LANGS.delete + '</button>';
245            }
246            html += '        </div>';
247            html += '    </div>';
248            html += '    <div class="contents">' + val.contents + '</div>';
249            html += '    <div class="bottom">';
250            html += '        <span class="date">' + val.insert_date + '</span>';
251            html += '    </div>';
252            html += '</li>';
253        });
254        return html;
255    }
256
257    var save_map_board = function (form_id) {
258        $(".modal").modal("hide");
259        var direct = $("#direct_input").is(":checked");
260        if (direct === true) {
261            var address = $("#address").val();
262            geocoder.geocode({
263                'address': address
264            }, googlePlacesSearchCB);
265            return false;
266        }
267
268        _submitMapBoard(form_id);
269    }
270    var _submitMapBoard = function (form_id) {
271        var form = document.getElementById(form_id);
272        var data = new FormData(form);
273        var url = $("#" + form_id).attr('action');
274        $.ajax({
275            type: "post",
276            url: url,
277            processData: false,
278            contentType: false,
279            data: data,
280            dataType: 'Json',
281            success: function (result) {
282                $('.modal').modal('hide');
283                $('#modal_reload .modal-body').html("<div class='text-center'>" + result.message + "</div>");
284                if (result.code) {
285                    $('.modal').modal('hide');
286                    if (result.hasOwnProperty('redirect')) {
287                        redirect = result.redirect;
288                    } else {
289                        redirect = 'reload';
290                    }
291                    $("#modal_reload_btn").data("type", redirect);
292                } else {
293                    reloadCsrf();
294                    $("#modal_reload_btn").data("type", "none");
295                    $(".text-danger").hide();
296                    $.each(result.data, function (id, text) {
297                        $("#valid_" + id).text(text);
298                        $("#valid_" + id).show();
299                    });
300                    var valid_id = Object.keys(result.data)[0];
301                    $("[name='" + valid_id + "']").focus();
302                }
303                $('#modal_reload').modal('show');
304            }
305        });
306    }
307
308
309    var captcha_map_board = function (form_id, capcha_g_id) {
310        grecaptcha.ready(function () {
311            try {
312                grecaptcha.execute(capcha_g_id, {
313                    action: 'submit'
314                }).then(function (token) {
315                    save_map_board(form_id);
316                });
317            } catch (err) {
318                $('#modal_reload .modal-body').html("<div class='text-center'>The captcha API is incorrect.<br/>Please check again.</div>");
319                $("#modal_reload_btn").data("type", 'none');
320                $('#modal_reload').modal('show');
321            }
322        });
323    }
324
325    function gallery_upload(it) {
326        $(it).closest('.gal-upload-box').find('.MultiFile-wrap').find("input[name='gallery_file[]']").last().click();
327    }
328
329    var board_type = $("#board_type").val();
330    var geocoder = null;
331    if (board_type == 'kakao-map') {
332        geocoder = new kakao.maps.services.Geocoder();
333    } else if (board_type == 'google-map') {
334        geocoder = new google.maps.Geocoder();
335    }
336    var searchAddr = function () {
337        var direct = $("#direct_input").is(":checked");
338        if (direct === true) {
339            return false;
340        }
341        address = $("#address");
342        new daum.Postcode({
343            oncomplete: function (data) {
344                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
345
346                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
347                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
348                var addr = ''; // 주소 변수
349                var extraAddr = ''; // 참고항목 변수
350
351                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
352                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
353                    addr = data.roadAddress;
354                } else { // 사용자가 지번 주소를 선택했을 경우(J)
355                    addr = data.jibunAddress;
356                }
357
358                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
359                if (data.userSelectedType === 'R') {
360                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
361                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
362                    if (data.bname !== '' && /[동|로|가]$/g.test(data.bname)) {
363                        extraAddr += data.bname;
364                    }
365                    // 건물명이 있고, 공동주택일 경우 추가한다.
366                    if (data.buildingName !== '' && data.apartment === 'Y') {
367                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
368                    }
369                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
370                    if (extraAddr !== '') {
371                        extraAddr = ' (' + extraAddr + ')';
372                    }
373                    // 조합된 참고항목을 해당 필드에 넣는다.
374                    //                    document.getElementById("sample6_extraAddress").value = extraAddr;
375
376                } else {
377                    //                    document.getElementById("sample6_extraAddress").value = '';
378                }
379                if (board_type == 'kakao-map') {
380                    geocoder.addressSearch(addr, kakaoPlacesSearchCB);
381                } else if (board_type == 'naver-map') {
382                    naver.maps.Service.geocode({
383                        query: addr
384                    }, naverPlacesSearchCB);
385                } else if (board_type == 'google-map') {
386                    geocoder.geocode({
387                        'address': addr
388                    }, googlePlacesSearchCB);
389                }
390                address.val(addr);
391            }
392        }).open();
393    }
394
395    // 장소검색이 완료됐을 때 호출되는 콜백함수 입니다
396    function kakaoPlacesSearchCB(data, status, pagination) {
397        if (status === kakao.maps.services.Status.OK) {
398            var lat = data[0].y;
399            var lng = data[0].x;
400            $("input[name='lng']").val(lng);
401            $("input[name='lat']").val(lat);
402        } else if (status === kakao.maps.services.Status.ZERO_RESULT) {
403            return alert(getLangMsg('not-found-addr-geocode'));
404
405        } else if (status === kakao.maps.services.Status.ERROR) {
406            return alert(getLangMsg('search-error-result'));
407        }
408    }
409
410    function naverPlacesSearchCB(status, response) {
411        if (status === naver.maps.Service.Status.ERROR) {
412            if (!address) {
413                return alert('Geocode Error, Please check address');
414            }
415            return alert(getLangMsg('search-error-result'));
416        }
417        if (response.v2.meta.totalCount === 0) {
418            return alert(getLangMsg('not-found-addr-geocode'));
419        }
420        var data = response.v2.addresses[0];
421        var lat = data.y;
422        var lng = data.x;
423        $("input[name='lng']").val(lng);
424        $("input[name='lat']").val(lat);
425    }
426
427    function googlePlacesSearchCB(response, status) {
428        if (status == 'OK') {
429            var data = response[0].geometry.location;
430            var lat = data.lat();
431            var lng = data.lng();
432            $("input[name='lng']").val(lng);
433            $("input[name='lat']").val(lat);
434
435
436            var direct = $("#direct_input").is(":checked");
437            if (direct === true) {
438                _submitMapBoard("form1");
439            }
440        } else {
441            return alert(getLangMsg('not-found-addr-geocode'));
442        }
443    }
444    var setEventListener = function () {
445
446        $(".upload-gal-list ul").sortable({
447            placeholder: 'placeholder',
448            cancel: 'disabled',
449        }).disableSelection();
450
451        var direct = $("#direct_input").is(":checked");
452
453        $("#direct_input").click(function () {
454            direct = $(this).is(":checked");
455            if (direct === true) {
456                $("#address").prop("readonly", false);
457                $("#address").removeClass("readonly");
458            } else {
459                $("#address").prop("readonly", true);
460                $("#address").addClass("readonly")
461            }
462        });
463    };
464
465    $(document).ready(function () {
466        setEventListener();
467    });
468
469    return {
470        'save_map_board': save_map_board,
471        'captcha_map_board': captcha_map_board,
472        'gallery_upload': gallery_upload,
473        'googlePlacesSearchCB': googlePlacesSearchCB,
474        'naverPlacesSearchCB': naverPlacesSearchCB,
475        'kakaoPlacesSearchCB': kakaoPlacesSearchCB,
476        'searchAddr': searchAddr,
477        'more_reply_m': moreReplyM,
478        'more_reply': moreReply,
479        'open_mobile_comment': openMobileComment,
480        'open_reply_write_m': openReplyWriteM,
481        'view_reply': viewReply,
482        'view_reply_m': viewReplyM,
483        'close_reply': closeReply,
484    }
485
486
487};
488

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.