PageSourceSearch

https://m.seesaw.land/api.js?ver=68

js seesaw.land collected 2026-10-02 02:00:20 UTC 16,911 bytes, 407 lines download raw bytes

1<!-- 바라미 추가 : 번역 용 -->
2//-------------------------------------------------
3// 구글 번역기 연동
4//-------------------------------------------------
5// - 번역 API 호출 함수
6// 추가내용 : xMode : title:제목, content:내용
7//function FuncAJaxPost(ContID, PD, objSuc, objErr) {
8function FuncAJaxPost(xMode, ContID, PD, objSuc, objErr) {
9	//alert("번역진행 : 1111");
10	$.ajax({
11		url:'api.trans.google.php',
12		method:'POST',
13		dataType: 'json',//'text',////
14		//contentType: 'application/json',
15		data: PD,//JSON.stringify(PD),
16		success: function(data, textStatus, jQxhr) {
17			// 에러 응답 처리
18			if(data['stateCode'] != '200') {
19				console.error('[번역 오류]', data['stateMsg'], data['msg']);
20				alert('[번역 오류] ' + data['msg']);
21				return;
22			}
23			// 정상 일 경우 해당 div 에 영문 데이터 넣기
24			if(xMode == "title") $("#view_subjid_"+ContID).html(data['data']);
25			if(xMode == "content") $("#view_contid_"+ContID).html(data['data']);
26		}
27		, error: objErr
28	});
29}
30// 테스트 전송
31function FuncT() {
32	var PostData = {
33						"LenSource" : "ko",
34						"LenTarget" : "ja",
35						"strContent": "안녕"
36					};
37	FuncAJaxPost(PostData, FuncSuccess, FuncError);
38}
39//	- 정상
40function FuncSuccess(data, textStatus, jQxhr) {
41	//alert("정상 결과 :", data['data']);
42	//alert(data);
43	if(data['stateCode'] == "200") {
44		console.log("정상 결과 : 정상");
45	} else {
46		console.log("정상 결과 : 오류");
47	}
48}
49//	- 오류 일때 결과값
50function FuncError(jqXhr, textStatus, errorThrown) {
51	alert("통신 오류가 발생했습니다. (HTTP Status: " + jqXhr.status + ")\n\n응답 내용:\n" + jqXhr.responseText);
52	console.error("오류 결과 :", jqXhr);
53}
54
55/**
56	ContID		: 콘텐트 내용 ID
57	LenSource	: 원본 언어
58	LenTarget	: 변경할 언어
59**/
60function FuncTrans(ContID, LenSource, LenTarget) {
61	//alert("ContID : "+ContID);
62	let contStr = $("#contid_"+ContID).html();
63	let subjStr = $("#subjid_"+ContID).html();
64	//alert("제목 : "+subjStr);
65	// 타겟이 한글 이면 원문을 돌리기
66	if(LenTarget == "ko") {
67		//$("#view_contid_"+ContID).html(contStr);
68		//$("#view_subjid_"+ContID).html(subjStr);
69		//return ;
70	}
71
72	console.log("번역 진행 :", LenTarget);
73
74	// 제목 번역
75	var PostData = {"LenSource" : LenSource,"LenTarget" : LenTarget,"strContent": subjStr};
76	FuncAJaxPost("title", ContID, PostData, FuncSuccess, FuncError);
77	// 본문 번역
78	var PostData2 = {"LenSource" : LenSource,"LenTarget" : LenTarget,"strContent": contStr};
79	FuncAJaxPost("content", ContID, PostData2, FuncSuccess, FuncError);
80}
81
82
83/******************************************
84	실시간 댓글 화면 감지 용
85******************************************/
86
87// 댓글 전용 번역 함수
88function FuncCommentAJaxPost(xThis, PD, oldTxt, objErr) {
89	$.ajax({
90		url:'api.trans.google.php',
91		method:'POST',
92		dataType: 'json',//'text',////
93		//contentType: 'application/json',
94		data: PD,//JSON.stringify(PD),
95		success: function(data, textStatus, jQxhr) {
96			// 에러 응답 처리
97			if(data['stateCode'] != '200') {
98				console.error('[댓글 번역 오류]', data['stateMsg'], data['msg']);
99				alert('[번역 오류] ' + data['msg']);
100				return;
101			}
102			let strTran = data['data'];
103			// 정상 일 경우 해당 div 에 영문 데이터 넣기
104			console.log("data['data']", data['data']);
105			let oldHtml = $(xThis).closest('div[comment]').html();
106			let oldHtml1 = $(xThis).closest('div[comment]').children("div[commentHtml]").html();
107			console.log("oldHtml1", oldHtml1, "contents() ", $(xThis).closest('div[comment]').contents().length);
108			// 댓글의 내용 중 html 테그가 들어 있으면 별도 처리
109			let newHtml = "";
110			if($(xThis).closest('div[comment]').contents().length > 5) { // 특수문자 html 테그가 있을 때
111				console.log("oldTxt", oldTxt);
112				console.log("oldHtml1", oldHtml1);
113				console.log("strTran", strTran);
114
115				//newHtml = oldHtml.replace(new RegExp('' + oldTxt + '', 'g'), strTran);
116				//newHtml = oldHtml1.replace(oldHtml1, strTran);
117				newHtml = strTran;
118				$(xThis).closest('div[comment]').children("div[commentHtml]").html(newHtml);
119
120				// 작성자 이름 원래로 변경
121				var WriterName = $(xThis).closest('div[addTrans]').prev().html();
122				$(xThis).closest('div[comment]').children("div[commentHtml]").children("span[user_id]").html(WriterName);
123				// 댓글 이름이 앞으로 오게 하기.
124				var span = $(xThis).closest('div[comment]').children("div[commentHtml]").find("span[user_id]");
125				var text = span.clone().wrap('<div>').parent().html();
126				span.remove();
127				$(xThis).closest('div[comment]').children("div[commentHtml]").prepend(text);
128			} else {
129				newHtml = oldHtml1.replace(new RegExp('' + FuncEscapeHtml(oldTxt) + '', 'g'), strTran);
130				$(xThis).closest('div[comment]').html(newHtml);
131				// 작성자 이름 원래로 변경
132				var WriterName = $(xThis).closest('div[addTrans]').prev().html();
133				$(xThis).closest('div[comment]').children("div[commentHtml]").children("span[user_id]").html(WriterName);
134				// 댓글 이름이 앞으로 오게 하기.
135				//var span = $(xThis).closest('div[comment]').children("div[commentHtml]").find("span[user_id]");
136				//var text = span.text();
137				//span.remove();
138				//$(xThis).closest('div[comment]').children("div[commentHtml]").prepend(text);
139			}
140
141			//console.log(newHtml);
142		}
143		, error: objErr
144	});
145}
146//	- 오류 일때 결과값
147function FuncCommentError(jqXhr, textStatus, errorThrown) {
148	alert("통신 오류가 발생했습니다. (HTTP Status: " + jqXhr.status + ")\n\n응답 내용:\n" + jqXhr.responseText);
149	console.error("오류 결과 :", jqXhr);
150}
151
152// 대상 노드와 옵션을 설정합니다.
153$(window).ready(function() {
154
155
156	var targetNode = $('body')[0];
157	var observerOptions = {
158		childList: true, // 자식 노드의 변경 감지
159		subtree: true,   // 모든 하위 트리의 변경도 감지
160		characterData: true // 텍스트 내용 변경 감지
161	};
162
163	// MutationObserver 인스턴스를 생성하고 콜백 함수를 정의합니다.
164	var observer = new MutationObserver(function (mutations) {
165
166		mutations.forEach(function (mutation) {
167			// 변경이 감지되었을 때 실행할 코드를 작성합니다.
168			var changedNode = mutation.target;
169			var CommList = $(changedNode).find('div [comment]');
170			//console.log('변경 감지 mutation.target :', changedNode);
171
172			// 입력 박스에 링크 붙여 넣기 할때 아이폰에서 링크 삭제 되는 현상 확인
173			//var InputBox = $(changedNode).find('div [article]');
174			//var CommALink = $(changedNode).find('a [href]');
175			//console.log('변경 감지 입력 박스 : InputBox', InputBox);
176			//if(CommALink.text() == "") {
177			//	//console.log('변경 감지 A Link : 링크 텍스트 사라짐');
178			//}
179			/*
180			var divArticle = $(changedNode).find('div [article]');
181			//divArticle.each(function(index, element) {
182				var InputBox = $(changedNode).find('div [contenteditable]');
183				console.log('입력 박스 내용 HTML : ', $(changedNode).html());
184				console.log('입력 박스 내용 TEXT : ', $(changedNode).text());
185			//});
186			*/
187
188			//-------------------------------------------
189			//	광고 삽입 용
190			//	게시글이 일정 숫자가 되면 광고 영역 하나씩 넣어 주기.
191			//-------------------------------------------
192			//var chkAdUsed = "<?=$GLOBALS[conf][AD_SET][used]?>";
193			if( chkAdUsed == true) {
194				// 페이지가 로딩이 되면 현제 페이지 이름 확인해서 광고 보여주기 설정
195				//	- 현재는 오늘(today), 이벤트(event), 엘로우(yellow)에만 사용
196				var ThisPageName = $("div[body]").attr('href');
197				//console.log('ThisPageName:', ThisPageName);
198
199				var ContentBoxDiv = $(changedNode).find('div[post][data_id]');
200				let ListCnt = 0;
201				ContentBoxDiv.each(function(index, element) {
202					ListCnt ++;
203					//console.log("div [page] :", $(this).attr('data_id'), '카운터 :', ListCnt, '나머지값 :', (ListCnt % 3));
204					if( (ListCnt % AdCountIsInt) == 0 ) {
205						//console.log("div [page] 광고 삽입 :", ListCnt);
206						//console.log("div [page] adListBox 찾기 :", $(this).find('div[adListBox]').length);
207						// 있는지 여부 확인 후 추가
208						if( $(this).find('div[adListBox]').length == 0 ) {
209							var addAD = "<div style='width:calc(100vw - 0px);height:20px;background-color:#f5f5f5;margin-top:-10px;margin-left:-10px;border:solid 0px red;'></div><div adListBox style=\"width:calc(100vw - 1px);height:100px; border:solid 1px #fff; margin-bottom:-10px;margin-left:-10px; display: flex; vertical-align: middle;text-align:center; justify-content: center; align-items: center; background-position: center;background-repeat: no-repeat;background-size: cover; background-image: url('https://seesawmall.dreamtec.co.kr/upfiles/banner/3660695213.jpg');border:solid 1px #000;\">adbox</div>";
210							//$(this).find('div[act]').after(addAD);
211							//$(this).after(addAD); - 무한 룹 조심...ㅜ.ㅜ
212						}
213					}
214				});
215			}
216
217			//-------------------------------------------
218			// 댓글 번역 기능 자동 추가
219			// 태그에 대해 작업 수행
220			//-------------------------------------------
221			CommList.each(function(index, element) {
222				// 작성자 이름 가져오기
223				var WriterName = $(element).find('.name').contents().text().trim();
224				console.log('comment 태그 작성자 이름 WriterName:', '|'+WriterName+'|');
225
226				// 순수 코멘트 내용만 가져오기
227				var textContent = $(element).contents().filter(function() {
228					return this.nodeType === 3; // 텍스트 노드만 필터링
229				}).text().trim();
230				console.log('comment 태그 내용 textContent:', '|'+textContent+'|' + textContent.length);
231				if(textContent.length < 1) {
232					textContent = $(element).contents().text().trim();
233					//textContent = $(element).contents().html();
234					console.log('comment 태그 내용 2차 textContent:', '|'+textContent+'|' + textContent.length);
235				}
236
237				// 번역 내용 중 작성자 이름은 삭제 하기.
238				textContent = textContent.replace(WriterName, "");
239
240				// 중복으로 등록되는 부분 막기 설정 : 해당 영역에 번역 버튼이 없을 떄만 설정
241				var chkAddTrans = $(element).find('[addTrans]');
242				console.log('comment 태그 내용 chkAddTrans:', chkAddTrans.length);
243				if(chkAddTrans.length > 0) return ;
244
245				// - 번역기 자동 추가
246				//		- CommentTranPopup : 소스는 default.php 파일 참고
247				$(element).find('.name').css("width", "49%").css("float", "left");
248				$(element).find('div').first().after('<div addTrans class="dropdown" style="width:49%;height:22px;float:right;text-align:right;font-size: 22px;display: flex; vertical-align: middle;justify-content: right;" ><div data-toggle="dropdown"><i class="fa-solid fa-language " aria-hidden="true" onclick="FuncLanguageChange(this)"></i></div>'+CommentTranPopup+'</div><div orgtext style="display:none;">'+textContent+'</div>');
249				//
250			});
251
252			//-------------------------------------------
253			//	글쓰기 창이 열리는지 감지..
254			//-------------------------------------------
255			/*var DivContentEditable = $(changedNode).find('div[contentEditable]');
256			if(chkDivContentEditable == false) {
257				console.log("div [ContentEditable] :", DivContentEditable);
258				if(DivContentEditable.length > 0) {
259					chkDivContentEditable = true;
260				} else {
261					chkDivContentEditable = false;
262				}
263			}*/
264
265
266		});
267
268	});
269
270
271	// 대상 노드를 감시 대상으로 등록합니다.
272	if(targetNode) {
273		observer.observe(targetNode, observerOptions);
274	} else {
275		targetNode = $('.comment')[0];
276		try {
277			//console.log('변경 감지: 실행');
278			observer.observe(targetNode, observerOptions);
279		} catch { }
280	}
281
282	//-----------------------------------------------
283	//	붙여 넣기 이벤트 감지
284	//-----------------------------------------------
285	var chkHttpLinkEvent = "";
286	var chkHttpLinkVal = "";
287	$("div").on("paste", "[contentEditable]", function(event) {
288		var pastedData = event.originalEvent.clipboardData.getData('text');
289		if(pastedData.toLowerCase().indexOf('http') >= 0) {
290			chkHttpLinkEvent = "true";
291			chkHttpLinkVal = pastedData;
292			setTimeout(function() {
293				// 입력 박스의 값을 확인 해서 감지 여부
294				let InTxt = $('div [contenteditable]').text();
295
296				if( InTxt.indexOf(pastedData) < 0) {
297					//  링크가 없을 때 추가 입력 처리
298					var $div = jQuery('div [contenteditable]');
299					var caretPos = $div[0].selectionStart;
300					var textAreaTxt = $div.html();
301					var txtToAdd = pastedData;
302					//$div.html(textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos));
303					$div.html(textAreaTxt.substring(0, caretPos) + txtToAdd);
304				} else {
305					console.log("입력창의 텍스트 중 링크 값을 확인 : 링크값 있음");
306				}
307
308			}, 1500);
309		} else {
310			chkHttpLinkEvent = "";
311			chkHttpLinkVal = "";
312		}
313	});
314
315
316	var todayDiv = $('div[href="#today"]');
317	todayDiv.prependTo(todayDiv.parent());
318});
319
320// 동적으로 추가된 요소에 대한 클릭 이벤트 리스너
321$('.comment').on('click', '.languageChange', function() {
322	console.log('동적으로 추가된 div를 클릭했습니다.');
323});
324// 댓글 선택 항목 설정값
325var selectCommentThis	= null; // 클릭된 Obj 값
326var selectCommentTxt	= "";	// 번역 내용
327function FuncLanguageChange(xthis) {
328	console.log('번역기 팝업 열기 함수', xthis);
329
330	selectCommentThis = xthis;
331
332	// 작성자 이름 가져오기
333	var WriterName = $(xthis).closest('div[addTrans]').prev().html();//$(xthis).prev().html();
334	console.log('WriterName 값 참기 :', $(xthis).closest('div[addTrans]').next().text().trim());
335
336	// 댓글 ID
337	var groupValue = $(xthis).closest('div[group]').attr('group');
338	let CommentID = groupValue;
339	// 댓글 내용
340	var txtValue = $(xthis).closest('div[comment]').contents().filter(function() {
341						return this.nodeType === 3; // 텍스트 노드만 필터링
342					}).text().trim();
343	console.log('WriterName 값:', WriterName, 'txtValue 값:', txtValue);
344	if(txtValue.length < 1) {
345		txtValue = $(xthis).closest('div[comment]').children("div[commentHtml]").html();
346		//console.log('comment 태그 내용 2차 txtValue:', '|'+txtValue+'|' + txtValue.length);
347		console.log('comment 태그 내용 2차 txtValue:', txtValue);
348
349	}
350	selectCommentTxt = txtValue;
351
352	// 번역 호출
353	//var PostData = {"LenSource" : "","LenTarget" : "en", "strContent": txtValue};
354	//FuncCommentAJaxPost(xthis, PostData, txtValue, FuncCommentError);
355
356	return ;
357
358	// - 임기 변경 테스트
359	//$(xthis).closest('div[comment]').contents().replace(txtValue, "바보~~");
360	let oldHtml = $(xthis).closest('div[comment]').html();
361	let newHtml = oldHtml.replace(new RegExp('' + FuncEscapeHtml(txtValue) + '', 'g'), "바보~~");
362	$(xthis).closest('div[comment]').html(newHtml);
363	console.log(newHtml);
364}
365// - HTML 엔터티로 변환 처리 함수
366function FuncEscapeHtml(str) {
367	var div = document.createElement('div');
368	div.appendChild(document.createTextNode(str));
369	return div.innerHTML;
370}
371
372function FuncCommentTrans(LenSource, LenTarget) {
373	if(LenSource == "reset") {
374		let oldHtml = $(selectCommentThis).closest('div[comment]').html();
375		let orgText = $(selectCommentThis).closest('div[comment] div[orgtext]').html();
376		let newHtml = oldHtml.replace(new RegExp('' + FuncEscapeHtml(selectCommentTxt) + '', 'g'), orgText);
377		//console.log("리셋하기 > oldHtml ", oldHtml);
378		//console.log("리셋하기 > orgText ", orgText);
379		//console.log("리셋하기 > newHtml ", newHtml);
380		//$(selectCommentThis).closest('div[comment]').html(newHtml);
381	} else {
382		console.log("strContent :",  selectCommentTxt);
383		var PostData = {"LenSource" : "","LenTarget" : LenTarget, "strContent": selectCommentTxt};
384		console.log("PostData :",  PostData);
385		FuncCommentAJaxPost(selectCommentThis, PostData, selectCommentTxt, FuncCommentError);
386	}
387}
388
389
390//-----------------------------------------
391//	모델 등록 사용 일 경우 상단 채널 리스트 변경
392//-----------------------------------------
393$(window).on('hashchange', function() {
394	setTimeout(function() {
395		var chnElement = $('div[contentEditable]');
396		if (chnElement.length > 0) {
397			console.log('chn 속성이 있는 <div> 요소가 있습니다.');
398
399			//$('div[story]').filter(function() {
400			//	return $(this).find('button.act[badge_pen]').length > 0;
401			//}).remove();
402
403		} else {
404			console.log('chn 속성이 있는 <div> 요소가 없습니다.');
405		}
406	}, 300);
407});

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.