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, "&"); 529 r = r.replace(/"/g, """); 530 r = r.replace(/'/g, "'"); 531 r = r.replace(/</g, "<"); 532 r = r.replace(/>/g, ">"); 533 r = r.replace(/·/g, "·"); 534 535 return r; 536 }, 537 dec(str) { 538 let r; 539 r = str.replace(/&/g, "&"); 540 r = r.replace(/"/g, "\""); 541 r = r.replace(/'/g, "'"); 542 r = r.replace(/</g, "<"); 543 r = r.replace(/>/g, ">"); 544 r = r.replace(/·/g, "·"); 545 r = r.replace(/ /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.