PageSourceSearch

https://cbsmnc.co.kr/WebResource.axd?d=U8YRzLdB71zH2TMNJoBgrgV_pk_…5DV9-r-Y3hEVCNU6DQjl00&t=639256075461152658

js cbsmnc.co.kr collected 2026-10-08 08:08:41 UTC 18,057 bytes, 599 lines download raw bytes

1/// <reference path="enums.js" />
2/// <reference path="../jquery/jquery.js" />
3
4!function ($) {
5	if (!$) return false;
6	$.extend({
7		"patterns": {
8			"id": /^[a-z0-9_]{5,20}$/,
9			"pwd": /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{6,14}$/,
10			"rrn": /^\d{6}-\d{7}$/,
11			"email": /^\w+(?:[-.]\w+)*@\w+(?:[-.]\w+)*\.[a-zA-Z]{2,5}$/i,
12			"date": /^(?:19|20)\d{2}[-/.]+(?:0?\d|1[0-2])[-/.]+(?:0?\d|[1-2]\d|3[0-1])(?:\s+(?:0?\d|1\d|2[0-3])(?::(?:0?\d|[1-5]\d)){0,2})?$/,
13			"time": /^(?:[01]?\d|2[0-4])(?::(?:[0-5]?\d)){0,2}$/,
14			"ssi": /^(?:s?html?|cgi|[aj]s[apchm]x?|exe|dll|php\d?|bat|com|[cj]s|vbs?|msi|sys|ocx|msc|cmd|axd|master|java|htw|exclude|cdx|cer|config|webinfo)$/i,
15			"xss": /<\/?(?:script|iframe)\s[^>]*>?|\son[cbfklmrsu][a-z]+\s*=/i,
16			"tag": /<\/?[a-z][^>]*>/gi,
17			"phone": /\+?\d+(?:-\d+)+(?:,d+)?/,
18			"url": /^(?:https?:)?\/\/(?:(?:[a-z\d가-힣](?:-?[a-z\d가-힣])*)\.)*(?:[a-z\d-]+)(?::\d{1,5})?(?:\/(?:[^/?#\s\.](?:\.?[^/?#.\s])*)?)*(?:\?[^?#\s]*)?(?:#\w*)?$/i
19			//"url": /^(?:https?|ftps?|rtsp?):\/\/(?:[a-z\d-]+\.)+[a-z\d]{2,4}.*$/i
20		},
21		unselectable() {
22			this.bind("selectstart.jq", function () { return false; })
23				.css({ "MozUserSelect": "none", "KhtmlUserSelect": "none" })
24				.get(0).unselectable = "on";
25		},
26		selectable() {
27			this.unbind("selectstart.jq")
28				.css({ "MozUserSelect": "text", "KhtmlUserSelect": "text" })
29				.get(0).unselectable = "off";
30		},
31		jsString(value) {
32			return value
33				.replace(/\\/g, "\\\\")
34				.replace(/\r/g, "\\r")
35				.replace(/\n/g, "\\n")
36				.replace(/"/g, "\\\"");
37		},
38		stringify(obj) {
39			let t = typeof obj;
40			if (t !== "object" || obj === null) {
41				// simple data type
42				if (t === "string") obj = '"' + this.jsString(obj) + '"';
43				return String(obj);
44			} else {
45				// recurse array or object
46				let date, n, v;
47				const json = [], arr = obj && obj.constructor === Array;
48
49				if (obj.constructor === Date)
50					return "\"" + this.formatDateTime(obj, DateTimeFormat.JsShortDateTime) + "\"";
51
52				for (n in obj) {
53					v = obj[n];
54					t = typeof v;
55					date = v && v.constructor === Date;
56
57					//if (obj.hasOwnProperty(n)) {
58					if (t === "function") continue;
59					if (t === "string")
60						v = '"' + this.jsString(v) + '"';
61					else if (t === "object" && v !== null) {
62						if (date)
63							v = "\"" + this.formatDateTime(v, DateTimeFormat.JsShortDateTime) + "\"";
64						else
65							v = jQuery.stringify(v);
66					}
67					json.push((arr ? "" : '"' + n + '":') + String(v));
68				}
69				return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
70			}
71		},
72		// 정수로 변환
73		parseInt(val) {
74			if (val === undefined || val === null) return 0;
75			if (typeof val === "boolean") return val ? 1 : 0;
76			if (val === "selected" || val === "checked") return 1;
77			if (isNaN(val) || val === "") return 0;
78			return parseInt(val, 10);
79		},
80		parseTime(str) {
81			if (!$.patterns.time.test(str)) return null;
82			const val = str.split(":");
83			const rst = new Date();
84			rst.setHours(parseInt(val[0], 10));
85			if (val.length > 1) {
86				rst.setMinutes(parseInt(val[1], 10));
87				if (val.length === 3)
88					rst.setSeconds(parseInt(val[2], 10));
89			}
90			return rst;
91		},
92		// 날짜문자열을 데이트객체로 변환
93		parseDate(str) {
94			let rst;
95			if ($.patterns.date.test(str)) {
96				const dtm = str.split(/\s+/);
97				dtm[0] = dtm[0].split(/[-/.]+/);
98
99				rst = new Date(parseInt(dtm[0][0], 10), parseInt(dtm[0][1], 10) - 1, parseInt(dtm[0][2], 10));
100
101				if (dtm.length === 2) {
102					dtm[1] = dtm[1].split(":");
103					if (dtm[1].length >= 1) rst.setHours(parseInt(dtm[1][0], 10));
104					if (dtm[1].length >= 2) rst.setMinutes(parseInt(dtm[1][1], 10));
105					if (dtm[1].length === 3) rst.setSeconds(parseInt(dtm[1][2], 10));
106				}
107			} else
108				rst = null;
109			return rst;
110		},
111		// 부울 값으로 변환
112		parseBool(value) {
113			const t = typeof value;
114			if (value === undefined || value === null) return false;
115			if (t === "boolean") return value;
116			if (t === "number") return value > 0;
117			if (t === "object" || t === "string" && !isNaN(value) && parseInt(value, 10) > 0) return true;
118
119			let rst = false;
120			switch (value.toLowerCase()) {
121				case "true":
122				case "yes":
123				case "checked":
124				case "selected":
125					rst = true;
126					break;
127			}
128			return rst;
129		},
130		// 팝업
131		popup(url, name, scroll, w, h, l, t, status) {
132			const opt = {
133				"url": "",
134				"fullscreen": "no",
135				"toolbar": "no",
136				"location": "no",
137				"directories": "no",
138				"menubar": "no",
139				"resizable": "no",
140				"scroll": "no",
141				"status": "yes",
142				"width": 0,
143				"height": 0,
144				"left": 0,
145				"top": 0
146			};
147			if (typeof url === "string")
148				$.extend(opt, {
149					"url": url,
150					"name": name,
151					"scroll": scroll ? "yes" : "no",
152					"status": status ? "yes" : "no",
153					"width": w || 0,
154					"height": h || 0,
155					"left": l || 0,
156					"top": t || 0
157				});
158			else
159				$.extend(opt, url);
160
161			if (opt.name === undefined)
162				return window.open(opt.url);
163			else {
164				const aw = window.screen.availWidth;
165				const ah = window.screen.availHeight;
166
167				opt.width = opt.width ? Math.min(opt.width, aw) : aw;
168				opt.height = opt.height ? Math.min(opt.height, ah) : ah;
169				if (opt.left)
170					opt.left = Math.min(opt.left, aw - opt.width);
171				else
172					opt.left = Math.floor((aw - opt.width) / 2);
173				if (opt.top)
174					opt.top = Math.min(opt.top, ah - opt.height);
175				else
176					opt.top = Math.floor((ah - opt.height) / 2);
177
178				const features = [
179					"width =" + opt.width,
180					"height=" + opt.height,
181					"left=" + opt.left,
182					"top=" + opt.top,
183					"fullscreen=" + opt.fullscreen,
184					"toolbar=" + opt.toolbar,
185					"location=" + opt.location,
186					"directories=" + opt.directories,
187					"menubar=" + opt.menubar,
188					"resizable=" + opt.resizable,
189					"scrollbars=" + opt.scroll,
190					"status=" + opt.status
191				];
192				return window.open(opt.url, opt.name, features.join(","));
193			}
194		},
195		// 개체 복사
196		objectCopy(obj) {
197			if (obj === null || obj === undefined || typeof obj !== "object") return obj;
198			if (obj.constructor === Date) return this.dateCopy(obj);
199			if (obj.constructor === RegExp) return new RegExp(obj);
200			const clone = Array.isArray(obj) ? [] : {};
201			for (let i in obj) clone[i] = this.objectCopy(obj[i]);
202			return clone;
203		},
204		// 날짜 복사
205		dateCopy(d) {
206			if (d === undefined || d === null) return null;
207			const rst = new Date(
208				d.getFullYear(), d.getMonth(), d.getDate(),
209				d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()
210			);
211			return rst;
212		},
213		// URL 개체
214		"url": {
215			qstr(key, t) {
216				let search = location.search;
217				if (search) search = search.substring(1);
218
219				if (!key) return search;
220				if (!t) t = "string";
221
222				const query = search.split("&");
223
224				let rst;
225				switch (t.toLowerCase()) {
226					case "number":
227						rst = 0;
228						break;
229					case "bool":
230						rst = false;
231						break;
232					case "date":
233						rst = null;
234						break;
235					default:
236						rst = "";
237						break;
238				}
239				let kv;
240				for (let i = 0; i < query.length; i++) {
241					kv = query[i].split("=");
242					if (kv[0].toLowerCase() !== key.toLowerCase()) continue;
243
244					rst = kv.length < 2 ? "" : kv[1];
245					switch (t.toLowerCase()) {
246						case "number":
247							rst = $.parseInt(rst);
248							break;
249						case "bool":
250							rst = $.parseBool(rst);
251							break;
252						case "date":
253							rst = $.parseDate(rst);
254							break;
255						default:
256							rst = decodeURIComponent(rst);
257							break;
258						break;
259					}
260					break;
261				}
262				return rst;
263			},
264			// URL 인코딩
265			enc(url) {
266				if (!url || url === "") return "";
267				rst = encodeURIComponent(url);
268				rst = rst.replace(/\./g, "%2E");
269
270				return rst;
271			},
272			// URL 디코딩
273			dec(url) {
274				let rst;
275				try {
276					rst = decodeURIComponent(url);
277				} catch {
278					rst = unescape(url);
279				}
280				return rst;
281			},
282			parse(url) {
283				url = url || location.href;
284				const rst = new URL(url);
285				rst.pathAndQuery = rst.pathname + rst.search;
286				rst.filename = rst.pathname.substring(rst.pathname.lastIndexOf("/") + 1);
287				const ext = rst.filename.split(".");
288				rst.extension = ext.length > 1 ? `.${ext[ext.length - 1]}` : "";
289
290				return rst;
291			},
292			host(url) { return this.parse(url).host; },
293			hostname(url) { return this.parse(url).hostname; },
294			// 경로와 쿼리 문자열 반환
295			pathAndQuery(url) { return this.parse(url).pathAndQuery; },
296			// 파일명 반환
297			filename(url) { return this.parse(url).filename; },
298			// URL에서 확장자 반환
299			extension(url) { return this.parse(url).extension; },
300			// 페이지 인덱스(0부터 시작)를 가져옵니다.
301			pageIndex(key) {
302				const rst = this.qstr(key, "number");
303				return Math.max(0, rst - 1);
304			}
305		},
306		// 날짜 포멧
307		formatDateTime(dat, dtFormat) {
308			if (dat === null) return "";
309			if (!dtFormat) dtFormat = DateTimeFormat.JsShortDate;
310
311			let rst = "";
312			const week = ["일", "월", "화", "수", "목", "금", "토"];
313
314			switch (dtFormat) {
315				case DateTimeFormat.JsShortDate:
316					rst = dat.getFullYear() + "-" +
317						this.formatNumber(dat.getMonth() + 1, 2) + "-" +
318						this.formatNumber(dat.getDate(), 2);
319					break;
320				case DateTimeFormat.JsShortDateTime:
321					rst = this.formatDateTime(dat, DateTimeFormat.JsShortDate) +
322						" " + this.formatNumber(dat.getHours(), 2) +
323						":" + this.formatNumber(dat.getMinutes(), 2) +
324						":" + this.formatNumber(dat.getSeconds(), 2);
325					break;
326				case DateTimeFormat.JsLongDate:
327					rst = dat.getFullYear() + "년 " +
328						(dat.getMonth() + 1) + "월 " +
329						dat.getDate() + "일 " +
330						week[dat.getDay()] + "요일";
331					break;
332				case DateTimeFormat.JsLongDateTime:
333					rst = this.formatDateTime(dat, DateTimeFormat.JsLongDate) + " " +
334						this.formatDateTime(dat, DateTimeFormat.JsLongTime);
335					break;
336				case DateTimeFormat.JsShortTime:
337					rst = this.formatDateTime(dat, DateTimeFormat.JsHourMinute) + ":" +
338						this.formatNumber(dat.getSeconds(), 2);
339					break;
340				case DateTimeFormat.JsLongTime:
341					rst = (dat.getHours() > 12 ? "오후 " : "오전 ") +
342						(dat.getHours() % 12) + "시 " +
343						dat.getMinutes() + "분 " +
344						dat.getSeconds() + "초";
345					break;
346				case DateTimeFormat.JsHourMinute:
347					rst = this.formatNumber(dat.getHours(), 2) + ":" +
348						this.formatNumber(dat.getMinutes(), 2);
349					break;
350				case DateTimeFormat.JsMonthDate:
351					rst = this.formatNumber(dat.getMonth() + 1, 2) + "/" +
352						this.formatNumber(dat.getDate(), 2);
353					break;
354				case DateTimeFormat.JsShortYear:
355					rst = dat.getFullYear() + "/" +
356						this.formatDateTime(dat, DateTimeFormat.JsMonthDate) + " " +
357						this.formatDateTime(dat, DateTimeFormat.JsHourMinute);
358					break;
359			}
360			return rst;
361		},
362		// 숫자 포멧
363		formatNumber(num, len) {
364			let rst = ""
365			if (len === undefined)
366				rst = num.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
367			else {
368				rst = num.toString();
369				for (let i = rst.length; i < len; i++) rst = "0" + rst;
370			}
371			return rst;
372		},
373		// 문자열 자르기
374		cutString(str, len) {
375			if (str === "" || str === null) return "";
376			return this.len(str) > len ? this.left(str, len) + ".." : str;
377		},
378		// 문자열 길이
379		len(str) {
380			let len = 0;
381			for (let i = 0; i < str.length; i++)
382				str.charCodeAt(i) > 1000 ? len += 2 : len++;
383			return len;
384		},
385		// 왼쪽 문자열 반환
386		left(str, len) {
387			if (str === null) return "";
388
389			let k = 0, rst = "";
390			for (let i = 0; i < str.length; i++) {
391				str.charCodeAt(i) > 1000 ? k += 2 : k++;
392				if (k > len) break;
393				rst += str.charAt(i);
394			}
395			return rst;
396		},
397		// 오른쪽 문자열 반환
398		right(str, len) {
399			if (!str) return "";
400			return str.substring(str.length - len);
401		},
402		// 쿠키 개체
403		"cookie": {
404			// 쿠키 반환
405			get(name) {
406				let nameOfCookie = name + "=";
407				let x = 0;
408
409				while (x <= document.cookie.length) {
410					const y = (x + nameOfCookie.length);
411
412					if (document.cookie.substring(x, y) === nameOfCookie) {
413						if ((endOfCookie = document.cookie.indexOf(";", y)) === -1)
414							endOfCookie = document.cookie.length;
415						return decodeURIComponent(document.cookie.substring(y, endOfCookie));
416					}
417					x = document.cookie.indexOf(" ", x) + 1;
418					if (x === 0) break;
419				}
420				return "";
421			},
422			// 쿠키 저장
423			set(name, value, domain, expiredays) {
424				let cookie = name + "=" + encodeURIComponent(value) + "; path=/";
425				if (domain) cookie += "; domain=" + domain;
426				if (expiredays) {
427					const todayDate = new Date();
428					todayDate.setDate(todayDate.getDate() + expiredays);
429
430					cookie += "; expires=" + todayDate.toUTCString();
431				}
432				document.cookie = cookie;
433			}
434		},
435		// 유효성 검사
436		"validator": {
437			// 아이디
438			id(val) { return $.patterns.id.test(val); },
439			// 패스워드
440			pwd(val) { return $.patterns.pwd.test(val); },
441			// 유효 이메일 체크
442			email(email) { return $.patterns.email.test(email); },
443			// 이미지 여부 반환
444			image(url) {
445				const ext = $.url.extension(url).toLowerCase();
446				let ret;
447				switch (ext) {
448					case ".jpg":
449					case ".gif":
450					case ".png":
451						ret = true;
452						break;
453					default:
454						ret = false;
455						break;
456				}
457				return ret;
458			},
459			// URL 체크
460			url(value) { return $.patterns.url.test(value); },
461			// 전화번호
462			phone(value) { return $.patterns.phone.test(value); }
463		},
464		// 키프레스 이벤트 핸들러
465		"keypressHandlers": {
466			//숫자
467			number(e) {
468				const keyCode = Math.max(e.which, e.keyCode);
469				const availCharPattern = /\d/;
470				const ch = String.fromCharCode(keyCode);
471				return availCharPattern.test(ch) || this.isControlKey(keyCode);
472			},
473			// 전자 메일 주소
474			email(e) {
475				const keyCode = Math.max(e.which, e.keyCode);
476				const availCharPattern = /[-\w.@]/i;
477				const ch = String.fromCharCode(keyCode);
478				return availCharPattern.test(ch) || this.isControlKey(keyCode);
479			},
480			// 전자 메일 주소 이름
481			emailUserName(e) {
482				const keyCode = Math.max(e.which, e.keyCode);
483				const availCharPattern = /[\w-.]/i;
484				const ch = String.fromCharCode(keyCode);
485				return availCharPattern.test(ch) || this.isControlKey(keyCode);
486			},
487			// 전자 메일 주소 도메인
488			emailDomain(e) {
489				const keyCode = Math.max(e.which, e.keyCode);
490				const availCharPattern = /[a-z\d-.]/i;
491				const ch = String.fromCharCode(keyCode);
492				return availCharPattern.test(ch) || this.isControlKey(keyCode);
493			},
494			// 휴대폰, 전화번호
495			phone(e) {
496				const keyCode = Math.max(e.which, e.keyCode);
497				const availCharPattern = /[\d-,+]/;
498				const ch = String.fromCharCode(keyCode);
499				return availCharPattern.test(ch) || this.isControlKey(keyCode);
500			},
501			// 제어키 여부를 나타내는 값을 반환합니다.
502			isControlKey(keyCode) {
503				return keyCode === 8 ||	// Backspace
504					keyCode === 9 ||	// Tab
505					keyCode === 13 ||	// Enter
506					keyCode === 16 ||	// Shift
507					keyCode === 17 ||	// Ctrl
508					keyCode === 18 ||	// Alt
509					keyCode === 19 ||	// Pause
510					keyCode === 20 ||	// Caps Lock
511					keyCode === 27 ||	// Esc
512					keyCode === 33 ||	// PgUp
513					keyCode === 34 ||	// PgDn
514					keyCode === 35 ||	// End
515					keyCode === 36 ||	// Home
516					keyCode === 37 ||	// ←
517					keyCode === 38 ||	// ↑
518					keyCode === 39 ||	// →
519					keyCode === 40 ||	// ↓
520					keyCode === 45 ||	// Insert
521					keyCode === 46;		// Del
522			}
523		},
524		"html": {
525			// HTML 인코딩
526			enc(str) {
527				let r;
528				r = str.replace(/&/g, "&amp;");
529				r = r.replace(/"/g, "&quot;");
530				r = r.replace(/'/g, "&apos;");
531				r = r.replace(/</g, "&lt;");
532				r = r.replace(/>/g, "&gt;");
533				r = r.replace(/·/g, "&middot;");
534
535				return r;
536			},
537			dec(str) {
538				let r;
539				r = str.replace(/&amp;/g, "&");
540				r = r.replace(/&quot;/g, "\"");
541				r = r.replace(/&apos;/g, "'");
542				r = r.replace(/&lt;/g, "<");
543				r = r.replace(/&gt;/g, ">");
544				r = r.replace(/&middot;/g, "·");
545				r = r.replace(/&nbsp;/g, " ")
546
547				return r;
548			},
549			// 이미지
550			img(src, alt, w, h, css) {
551				let rst = null;
552				if (src === undefined || src === null || src.length === 0) return rst;
553
554				alt = alt || "";
555				rst = $(document.createElement("img"))
556					.attr({ "src": src, "alt": alt, "title": alt });
557				if (w) rst.width(w + "px");
558				if (h) rst.height(h + "px");
559				if (css) rst.addClass(css);
560
561				return rst;
562			},
563			// 링크 이미지
564			linkedImage(attr) {
565				const a = $(document.createElement("a"));
566
567				if (attr.href) a.attr("href", attr.href);
568				if (attr.className) a.addClass(attr.className);
569				if (attr.title) a.attr("title", attr.title);
570				if (attr.target) a.attr("target", attr.target);
571				if (attr.onclick) a.on("click", attr.onclick);
572
573				const img = $(document.createElement("img"));
574				if (attr.title) img.attr("alt", attr.title);
575				if (attr.src) img.attr("src", attr.src);
576				a.append(img);
577				return a;
578			},
579			// 줄바꿈 태그(<br />)
580			newLineTag(text) {
581				let rst = text.replace(/\r\n/g, "<br />");
582				rst = rst.replace(/\n/g, "<br />");
583				return rst;
584			}
585		}
586	});
587	const types = [
588		"text", "search", "number", "email", "datetime",
589		"datetime-local", "date", "month", "week", "time",
590		"tel", "url", "color", "range"
591	];
592	const len = types.length;
593	$.expr[":"]["textall"] = function (elem) {
594		const type = elem.getAttribute('type');
595		for (let i = 0; i < len; i++)
596			if (type === types[i]) return true;
597		return false;
598	};
599}(jQuery);

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.