PageSourceSearch

https://hct.co.kr/common/libs/util.js?ver=551

js hct.co.kr collected 2026-10-05 11:18:45 UTC 19,381 bytes, 417 lines download raw bytes

1(function() {
2    // 상단 header daum 주소 API 추가
3    var headTag = document.getElementsByTagName("head")[0];
4    var daumPostcodeJs = document.createElement('script');
5    daumPostcodeJs.type = 'text/javascript';
6    daumPostcodeJs.src = 'https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js';
7    headTag.appendChild(daumPostcodeJs);
8    function RSObject(){
9    }
10
11    RSObject.prototype.uuidv4Unique = function(){
12        return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
13            (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
14        );
15    }
16    RSObject.prototype.htmlUnescape  = function(str){
17        const textarea = document.createElement("textarea");
18        textarea.innerHTML = str;
19        return textarea.value;
20    }
21    RSObject.prototype.multiFileImg = function(thisTarget, contentOfFiles){
22        var deferred = $.Deferred();
23        var resultFileObj = new Object();
24        var datacode = thisTarget.data("datacode");
25        var categorytype = thisTarget.data("categorytype");
26        var multitype = thisTarget.data("filemultitype");
27        var accepttype = thisTarget.data("accepttype");
28        var filecode = thisTarget.data("filecode");
29        var lengType = thisTarget.data("langtype");
30        var extchecklist = JSON.parse(thisTarget.data("extchecklist").replace(/'/gi, '"'));
31
32        var resultHtml = "";
33        if(accepttype == 'normal') {
34            resultHtml += "<div class='badge list' id='" + categorytype + datacode + "file_item_{{ index }}' data-uid='{{ uuid }}' data-filecode='' >";
35            resultHtml += "    <i class='icon icon-doc'></i>";
36            resultHtml += "    <a href='javascript:void()' download=''>{{file_name}}</a>";
37            resultHtml += "    <button type='button' class='icon icon-close' onclick='deleteItemAction({{ index }},\"" + categorytype + datacode + "file_item_{{ index }}\")'>삭제</button>";
38            resultHtml += "</div>";
39        }
40
41        var acceptlist = '';
42        extchecklist.forEach(function (el, idx, arr) {
43            if (idx == 0) {
44                acceptlist += '.' + el;
45            } else {
46                acceptlist += ',.' + el;
47            }
48        });
49
50        $file = $('<input type="file" ' + (multitype == 'multifile' ? 'multiple="multiple"' : '')+' accept="'+acceptlist+'">');
51        var files_wrap = thisTarget.closest(".files_wrap");
52        $file.change(function(){
53            $('#save_btn').prop("disabled",true);
54            var files = $file[0].files;
55            var filesArr = Array.prototype.slice.call(files);
56            var fileRowCnt = 0;
57            var fileTimes = 0;
58
59            if(multitype == 'onefile'){
60                contentOfFiles = [];
61            }
62
63            if(lengType === 'kor'){
64                if( (files_wrap.children(".list").length+1) > parseInt(thisTarget.data("uploadcnt"))){
65                    alert('업로드는 최대 '+thisTarget.data("uploadcnt")+' 개 까지 가능합니다.');
66                    return false;
67                }
68
69
70                if((filesArr.length) > parseInt(thisTarget.data("uploadcnt"))){
71                    alert('업로드는 최대 '+thisTarget.data("uploadcnt")+' 개 까지 가능합니다.');
72                    return false;
73                }
74            }else{
75                if( (files_wrap.children(".list").length+1) > parseInt(thisTarget.data("uploadcnt"))){
76                    alert('You can upload up to '+thisTarget.data("uploadcnt")+' files.');
77                    return false;
78                }
79
80                if((filesArr.length) > parseInt(thisTarget.data("uploadcnt"))){
81                    alert('You can upload up to '+thisTarget.data("uploadcnt")+' files.');
82                    return false;
83                }
84
85            }
86
87            filesArr.forEach(function(f, idx) {
88                var _fileLen = f.name.length;
89                var _lastDot = f.name.lastIndexOf('.');
90                var ext = f.name.substring(_lastDot+1, _fileLen).toLowerCase();
91                if($.inArray(ext, extchecklist) == -1) {
92                    if(lengType === 'kor'){
93                        alert(ext+'파일은 업로드 하실수 없습니다.');
94                    }else{
95                        alert(ext + ' files cannot be uploaded.');
96                    }
97                    return;
98                }
99
100                function readFileAsync(file) {
101                    return new Promise((resolve, reject) => {
102                        const reader = new FileReader();
103                        reader.readAsDataURL(file);
104                        reader.onload = function(e) {
105                            var fileUUID = $util.uuidv4Unique();
106                            var data = {
107                                "uuid": fileUUID,
108                                "num": contentOfFiles.length+1,
109                                "index": contentOfFiles.length,
110                                "file_name": f.name,
111                                "url_src":e.target.result,
112                                "is_delete":false
113                            };
114                            // fileElement.push(data);
115
116                            var _fileLen = f.name.length;
117                            var _lastDot = f.name.lastIndexOf('.');
118
119                            // 파일명, 확장자 명만 추출한 후 소문자로 변경
120                            var _fileName = f.name.substring(0,_lastDot);
121                            var _fileExt = f.name.substring(_lastDot, _fileLen).toLowerCase();
122                            const filenameFirst = _fileName;
123                            const fileExtension = _fileExt;
124                            const newFile = new File([f], filenameFirst+"|"+fileUUID+"|"+datacode+fileExtension, {type: f.type});
125                            // contentOfFiles.push(newFile);
126                            fileRowCnt++;
127                            // var template = $("#temp_item").html();
128                            var html = Mustache.render(resultHtml, data);
129                            console.log(multitype == 'multifile');
130                            if(multitype == 'multifile'){
131                                files_wrap.append(html);
132                            }else{
133                                files_wrap.html(html);
134                            }
135                            resolve(newFile);
136                        };
137                        reader.onerror = reject;
138                    });
139                }
140
141                async function processFile() {
142                    try {
143                        const file = f;
144                        const newFile = await readFileAsync(file);
145                        contentOfFiles.push(newFile);
146                        if(thisTarget.parent().find("ul>li").length > 1){
147                            $('.fileLoading').find('.loading-container').css('margin-top','57px');
148                        }
149                    } catch(err) {
150                        console.log(err);
151                    }
152                }
153                processFile();
154            });
155            $file.val('');
156            setTimeout(function() {
157                resultFileObj = {
158                    contentOfFiles: contentOfFiles,
159                    categorytype : categorytype,
160                };
161                deferred.resolve(resultFileObj);
162                $('.fileLoading').remove();
163            }, fileTimes);
164        });
165        $file.trigger('click');
166        return deferred.promise();
167    }
168
169    RSObject.prototype.multiFiles = function(thisTarget, contentOfFiles){
170        var deferred = $.Deferred();
171        var resultFileObj = new Object();
172        var datacode = thisTarget.data("datacode");
173        var categorytype = thisTarget.data("categorytype");
174        var multitype = thisTarget.data("filemultitype");
175        var accepttype = thisTarget.data("accepttype");
176        var filecode = thisTarget.data("filecode");
177        var lengType = thisTarget.data("langtype");
178        var extchecklist = JSON.parse(thisTarget.data("extchecklist").replace(/'/gi, '"'));
179
180        var resultHtml = "";
181        if(accepttype == 'normal') {
182            resultHtml += "<div class='badge list' id='" + categorytype + datacode + "file_item_{{ index }}' data-uid='{{ uuid }}' data-filecode='' >";
183            resultHtml += "    <i class='icon icon-doc'></i>";
184            resultHtml += "    <a href='javascript:void()' download=''>{{file_name}}</a>";
185            resultHtml += "    <button type='button' class='icon icon-close' onclick='deleteItemAction({{ index }},\"" + categorytype + datacode + "file_item_{{ index }}\")'>삭제</button>";
186            resultHtml += "</div>";
187        }
188
189        var acceptlist = '';
190        extchecklist.forEach(function (el, idx, arr) {
191            if (idx == 0) {
192                acceptlist += '.' + el;
193            } else {
194                acceptlist += ',.' + el;
195            }
196        });
197
198        $file = $('<input type="file" ' + (multitype == 'multifile' ? 'multiple="multiple"' : '')+' accept="'+acceptlist+'">');
199        var files_wrap = thisTarget.closest(".files_wrap");
200        $file.change(function(){
201            $('#save_btn').prop("disabled",true);
202            var files = $file[0].files;
203            var filesArr = Array.prototype.slice.call(files);
204            var fileRowCnt = 0;
205            var fileTimes = 0;
206
207            if(multitype == 'onefile'){
208                contentOfFiles = [];
209            }
210
211
212            filesArr.forEach(function(f, idx) {
213                var _fileLen = f.name.length;
214                var _lastDot = f.name.lastIndexOf('.');
215                var ext = f.name.substring(_lastDot+1, _fileLen).toLowerCase();
216                if($.inArray(ext, extchecklist) == -1) {
217                    alert(ext+'파일은 업로드 하실수 없습니다.');
218                    return;
219                }
220
221                function readFileAsync(file) {
222                    return new Promise((resolve, reject) => {
223                        const reader = new FileReader();
224                        reader.readAsDataURL(file);
225                        reader.onload = function(e) {
226                            var fileUUID = $util.uuidv4Unique();
227                            var data = {
228                                "uuid": fileUUID,
229                                "num": contentOfFiles.length+1,
230                                "index": contentOfFiles.length,
231                                "file_name": f.name,
232                                "url_src":e.target.result,
233                                "is_delete":false
234                            };
235                            // fileElement.push(data);
236
237                            var _fileLen = f.name.length;
238                            var _lastDot = f.name.lastIndexOf('.');
239
240                            // 파일명, 확장자 명만 추출한 후 소문자로 변경
241                            var _fileName = f.name.substring(0,_lastDot);
242                            var _fileExt = f.name.substring(_lastDot, _fileLen).toLowerCase();
243                            const filenameFirst = _fileName;
244                            const fileExtension = _fileExt;
245                            const newFile = new File([f], filenameFirst+"|"+fileUUID+"|"+datacode+fileExtension, {type: f.type});
246                            // contentOfFiles.push(newFile);
247                            fileRowCnt++;
248                            // var template = $("#temp_item").html();
249                            var html = Mustache.render(resultHtml, data);
250                            console.log(multitype == 'multifile');
251                            if(multitype == 'multifile'){
252                                files_wrap.append(html);
253                            }else{
254                                files_wrap.html(html);
255                            }
256                            resolve(newFile);
257                        };
258                        reader.onerror = reject;
259                    });
260                }
261
262                async function processFile() {
263                    try {
264                        const file = f;
265                        const newFile = await readFileAsync(file);
266                        contentOfFiles.push(newFile);
267                        if(thisTarget.parent().find("ul>li").length > 1){
268                            $('.fileLoading').find('.loading-container').css('margin-top','57px');
269                        }
270                    } catch(err) {
271                        console.log(err);
272                    }
273                }
274                processFile();
275            });
276            $file.val('');
277            setTimeout(function() {
278                resultFileObj = {
279                    contentOfFiles: contentOfFiles,
280                    categorytype : categorytype,
281                };
282                deferred.resolve(resultFileObj);
283                $('.fileLoading').remove();
284            }, fileTimes);
285        });
286        $file.trigger('click');
287        return deferred.promise();
288    }
289
290    // -------------- 다음 주소 api -------------------- //
291    /**
292     * 다음 주소 api 기능 ###
293     * 설명)
294     * 주소 api를 연동해 각 input 조건에 맞게 설정.
295     *
296     * @since 2023.08.08
297     * @param
298     * @return
299     * *************************
300     * ## 코드 히스토리 ##
301     *    날짜    | 수정내용 | 작성자
302     * 2023.08.08 | 최초작성 | 황경현
303     * *************************
304     */
305    RSObject.prototype.daumPostcode = function(e,type){
306        // 현재 scroll 위치를 저장해놓는다.
307        $('.addressSrch').remove();
308        var postcodeHtml = '';
309        postcodeHtml +='<div id="'+type+'AddressSrch" class="addressSrch" style="display:none;border:1px solid;width:92%;height:300px;margin:-8px 0;position:absolute; z-index: 1;">'
310        postcodeHtml +='	<img src="//t1.daumcdn.net/postcode/resource/images/close.png" style="cursor:pointer;position:absolute;right:0px;top:-1px;z-index:1" onclick="$util.foldDaumPostcode(\''+type+'\')" alt="접기 버튼">';
311        postcodeHtml +='</div>';
312        $(e).parent().parent().find('div').eq(0).after(postcodeHtml);
313
314        var currentScroll = Math.max(document.body.scrollTop, document.documentElement.scrollTop);
315        var addressSrch = document.getElementById(type+'AddressSrch');
316        new daum.Postcode({
317            oncomplete: function(data) {
318                // 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
319
320                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
321                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
322                var addr = ''; // 주소 변수
323                var extraAddr = ''; // 참고항목 변수
324
325                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
326                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
327                    addr = data.roadAddress;
328                } else { // 사용자가 지번 주소를 선택했을 경우(J)
329                    addr = data.jibunAddress;
330                }
331
332                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
333                if(data.userSelectedType === 'R'){
334                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
335                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
336                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
337                        extraAddr += data.bname;
338                    }
339                    // 건물명이 있고, 공동주택일 경우 추가한다.
340                    if(data.buildingName !== '' && data.apartment === 'Y'){
341                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
342                    }
343                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
344                    if(extraAddr !== ''){
345                        extraAddr = ' (' + extraAddr + ')';
346                    }
347                    // 조합된 참고항목을 해당 필드에 넣는다.
348                    document.getElementById(type+"Address").value = extraAddr;
349
350                } else {
351                    document.getElementById(type+"Address").value = '';
352                }
353
354                // 우편번호와 주소 정보를 해당 필드에 넣는다.
355                document.getElementById(type+"Postcode").readOnly = false;
356                document.getElementById(type+"Address").readOnly = false;
357
358                document.getElementById(type+"Postcode").value = data.zonecode;
359                document.getElementById(type+"Address").value = addr;
360                // 커서를 상세주소 필드로 이동한다.
361                document.getElementById(type+"DetailAddress").focus();
362
363                // iframe을 넣은 element를 안보이게 한다.
364                // (autoClose:false 기능을 이용한다면, 아래 코드를 제거해야 화면에서 사라지지 않는다.)
365                addressSrch.style.display = 'none';
366                $('.addressSrch').remove();
367
368                document.getElementById(type+"Postcode").readOnly = true;
369                document.getElementById(type+"Address").readOnly = true;
370
371                // 우편번호 찾기 화면이 보이기 이전으로 scroll 위치를 되돌린다.
372                document.body.scrollTop = currentScroll;
373            },
374            // 우편번호 찾기 화면 크기가 조정되었을때 실행할 코드를 작성하는 부분. iframe을 넣은 element의 높이값을 조정한다.
375            onresize : function(size) {
376                addressSrch.style.height = size.height+'px';
377            },
378            width : '100%',
379            height : '100%',
380            maxSuggestItems: 5
381        }).embed(addressSrch);
382
383        // iframe을 넣은 element를 보이게 한다.
384        addressSrch.style.display = 'block';
385    }
386
387    RSObject.prototype.foldDaumPostcode = function(type){
388        $('.addressSrch').remove();
389    }
390
391    RSObject.prototype.autoHyphen = function(target){
392        let str = target.value.replace(/[^0-9]/g, '');
393        // 유선전화 (02) 처리
394        if (str.startsWith('02')) {
395            if (str.length > 2 && str.length <= 5) {
396                str = str.replace(/^(\d{2})(\d{1,3})$/, '$1-$2');
397            } else if (str.length > 5 && str.length <= 9) {
398                str = str.replace(/^(\d{2})(\d{3,4})(\d{0,4})$/, '$1-$2-$3');
399            } else if (str.length >= 10) {
400                str = str.replace(/^(\d{2})(\d{4})(\d{4})$/, '$1-$2-$3');
401            }
402        }
403        // 휴대전화 또는 기타 지역번호 (010, 031 등)
404        else {
405            if (str.length > 3 && str.length <= 7) {
406                str = str.replace(/^(\d{3})(\d{1,4})$/, '$1-$2');
407            } else if (str.length > 7) {
408                str = str.replace(/^(\d{3})(\d{3,4})(\d{4})$/, '$1-$2-$3');
409            }
410        }
411        target.value = str;
412    }
413
414    if(!window.$util){
415        window.$util = new RSObject();
416    }
417})();

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.