// (2024.11.28, 차재복, Cha Jae Bok, http://www.ktword.co.kr)
// 숨기기/보이기 toggle
function itemShowHide(target, btn='') {
if (getComputedStyle(target,null).display == "none") {
target.style.display = "block";
if(btn)
if (btn.nodeName=='BUTTON' || btn.nodeName=='A') btn.innerHTML = btn.innerText.replace('∨','∧');
// btn.innerHTML = btn.innerText.replace('펼치기','접기');
} else {
target.style.display = "none";
if(btn)
if (btn.nodeName=='BUTTON' || btn.nodeName=='A') btn.innerHTML = btn.innerText.replace('∧','∨');
// btn.innerHTML = btn.innerText.replace('접기','펼치기');
}
}
// 자바스크립트에서, insertAfter 구현
// ([참고] https://blog.asamaru.net/2016/12/06/how-to-do-insertafter-in-javascript/)
function insertAfter(referenceNode, newNode) {
if (!!referenceNode.nextSibling) {
return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
} else {
return referenceNode.parentNode.appendChild(newNode);
}
}
// 비동기 xhr 실행으로, 서버 데이터 가져오고, 이를 sessionStorage에 저장
function asyncProcess(id, type) {
return new Promise( (resolve, reject) => {
let xhr = new XMLHttpRequest();
let choice;
if(type=='each') choice = 'ol';
else if(type=='auto') choice = 'all_ol';
let method = 'GET';
let url = '../reform/reform_item.php?ch='+choice+'&id='+id;
xhr.open(method, url);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// if (glob_var.user_type > 0) alert('id='+id+', all_data_store ajax 함수 호출됨');
var data = JSON.parse(xhr.responseText);
if (data == null) return;
// console.log(xhr.responseText);
var cur;
for (var parent in data ) {
var sid = 'sid_'+parent; // sessionStorage 내 id 식별
var storage = JSON.stringify(data[parent]);
sessionStorage.setItem(sid, storage);
if(parent==id) current = data[parent];
}
// resolve(성공) 수행
if (sessionStorage[sid]) resolve(current);
// reject(실패) 수행
else reject('asyncProcess 실패');
}
};
xhr.send();
});
}
// 보다 일반화된 ajax promise 실행
function ajaxPromise (url, method, parms) {
// url, method 'get'/'post', parms {'formData':'...','textOnly':true/false}
return new Promise ( (resolve,reject) => {
let xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// 디버깅용
// console.log(xhr.responseText);
// promise resolve(성공) 수행
if (xhr.responseText) {
// 결과 텍스트 그대로 출력을 원할 때
if (parms && parms.textOnly)
resolve(xhr.responseText);
// 결과 텍스트에 대한 JSON parse를 원할 때
else {
try {
let resultObj = JSON.parse(xhr.responseText);
resolve(resultObj);
} catch (e) {
alert(xhr.responseText + ' : JSON 포멧 아닌듯함');
console.log(e.message);
}
}
// promise reject(실패) 수행
} else {
reject('ajaxPromise 실패 (서버로부터 빈 결과) : console.log 확인 필요');
// 에러 관련 로그를 웹브라우저 콘솔에 기록
console.log(url);
console.log(parms);
}
}
};
// ajax 호출용 쿼리 파라미터
if (method=='post') {
// FormData 형식이 아닌 경우 : HTTP 헤더 mime 타입 지정
if (!parms.formData && !parms.json) {
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
let sendData = '';
for (const property in parms) {
sendData += property + '=' + encodeURIComponent(parms[property]) + '&';
}
xhr.send(sendData);
// 일상적인 FormData 형식인 경우
} else if (parms.formData && !parms.json) {
xhr.send(parms.formData);
// JSON 형식인 경우에, HTTP 헤더 mime 타입 지정하고, JSON 포멧 스트링으로 정보 송출
} else if (!parms.formData && parms.json) {
xhr.setRequestHeader('Content-Type','application/json');
const sendData = JSON.stringify(parms.obj);
xhr.send(sendData);
}
} else if (method=='get') {
xhr.send();
}
});
}
// 외부 javascript 코드 불러와서 삽입 실행
// ([참고] https://asfirstalways.tistory.com/236)
function includeJS(jsFilePath, id_name) {
let js = document.createElement('script');
js.type = 'text/javascript';
// 캐싱 방지 : '?dt='+dateString' (일 단위 캐시)
const date = new Date();
const year = date.getFullYear();
const month = new String(date.getMonth()+1);
const day = new String(date.getDate());
const hour = new String(date.getHours());
urlDateQuery = '?dt='+ year+month+day+hour;
js.src = jsFilePath + urlDateQuery;
if(name) js.id = id_name;
return document.body.appendChild(js);
}
// 한글 처리 (1) (참고문헌 : https://dev.uhoon.co.kr/entry/한글-포함-문자열-바이트로-자르기-substring [Dev 저장소:티스토리])
function getTextLength4Hangul(str) {
let len = 0;
for (let i = 0; i < str.length; i++) {
if (escape(str.charAt(i)).length == 6) {
len++;
}
len++;
}
return len;
}
// 한글 처리 (2)
function cutStr4Hangul(str, start, size) { // size : 바이트수
let i = 0;
let lim = 0;
let pos = 0;
let beg = 0;
let minus = 0;
let len = getTextLength4Hangul(str);
for (let i = 0; pos < start; i++) {
pos += (str.charCodeAt(i) > 128) ? 2 : 1;
}
beg = i;
for (i = beg; i < len; i++) {
lim += (str.charCodeAt(i) > 128) ? 2 : 1;
if (lim > size) {
break;
}
}
return str.substring(beg, i);
}
// fadeIn, fadeOut 구현
function fadeIn(target) {
let level = 0;
let inTimer = setInterval( function() {
level = fadeInAction(target, level, inTimer);
}, 35);
}
function fadeInAction(target, level, inTimer) {
level = level + 0.05;
target.style.opacity = level;
if(level > 1 ) clearInterval(inTimer);
return level;
}
function fadeOut(target) {
let level = 1;
let outTimer = setInterval( function() {
level = fadeOutAction(target, level, outTimer);
}, 35);
}
function fadeOutAction(target, level, outTimer) {
level = level - 0.05;
target.style.opacity = level;
if(level < 0) clearInterval(outTimer);
return level;
}
function isEmpty(param) {
if (
param === undefined ||
param === null ||
param === "" ||
(Array.isArray(param) && param.length === 0) ||
(typeof param === "object" && Object.keys(param).length === 0)
) return true;
else return false;
}
function escapeHTML(str) {
return str.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/'/g, "'")
.replace(/"/g, """);
}
// 기능 : 접속 통계 등록
// 호출 : [navi_source.js] collapseSpanHandle()
function stat_enroll(reqType,find='') {
let xhr = new XMLHttpRequest();
let method = 'get';
let url = '/test/base_utils/stat_utils.php?reqType='+reqType+'&find='+find;
xhr.open(method, url);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) { // 요청이 완료된 상태
if (xhr.status === 200) { // 요청이 성공적으로 처리됨
console.log("Response:", xhr.responseText); // 응답 데이터 처리
} else {
console.error("Error:", xhr.status, xhr.statusText); // 오류 처리
}
}
};
xhr.send();
}