﻿


// ############################ Extends 프로토 타입 #################################################
// 작성자 : Roy
// 작성일 : 2009/10/20
// 내용   : 프로토 타입 확장함수


//////////////////////// String Prototype ////////////////////////////////////////////////////////////
//
// decode : Sql의 decode 함수와 같음
// trim   : 공백제거 함수
// format : .Net의 String.format과 같음
// cHtml  : Html 컨버젼
// toDate : date 형식으로 변환
// toBase64 : Base64 형식으로 변환
// 


// decode 함수
String.prototype.decode = function() {

    var args = $A(arguments);
    if (args.length <= 1) return "";

    for (var i = 0; i < args.length - 1; i += 2) {
        if (this == args[i]) return args[i + 1];
    }
    
    if (args.length % 2 == 1)
        return args.last();
    else return "";

}


// 공백 제거
String.prototype.trim = function() { var re = /^\s+|\s+$/g; return function() { return this.replace(re, ""); }; } ();


// format
String.prototype.format = function(format) {
    var args = $A(arguments);
    return this.replace(/\{(\d+)\}/g, function(m, i) { return args[i]; });
}

String.format = function(str) {

    var args = $A(arguments);
    var args2 = [];
    for (var i = 1; i < args.length; i++) {
        args2.push(args[i]);
    }

    return str.replace(/\{(\d+)\}/g, function(m, i) { return args2[i]; });
}

// HTML 컨버젼
String.prototype.cHtml = function() {
    return this.replace(/(\&)/g, "&amp;").replace(/\</g, "&lt;").replace(/\>/g, "&gt;");
}

// Date 형식으로 변환
String.prototype.toDate = function() {

    var str = String(this);


    if (str.indexOf("/") == 0) {
        return eval("new " + str.gsub("/", ""));
    }

    else if (str.length == 8) {
        return new Date(str.substr(0, 4), Number(str.substr(4, 2)) - 1, str.substr(6, 2));
    }
    else if (str.length == 10) {
        return new Date(str.substr(0, 4), Number(str.substr(5, 2)) - 1, str.substr(8, 2));
    }
    else if (str.indexOf("T") >= 0) {
        return new Date(str.substr(0, 4), Number(str.substr(5, 2)) - 1, Number(str.substr(8, 2)),
						    str.substr(11, 2), str.substr(14, 2), str.substr(17, 2));
    }
    else if (str.length == 14) {
        return new Date(str.substr(0, 4), Number(str.substr(4, 2)) - 1, str.substr(6, 2),
							    str.substr(8, 2), str.substr(10, 2), str.substr(12, 2));
    }
    else if (str.length > 15) {
        return new Date(str.substr(0, 4), str.substr(5, 2), str.substr(8, 2),
							    str.substr(11, 2), str.substr(14, 2), str.substr(17, 2));
    }

}

// Base64형식으로 변환
String.prototype.encodeBase64 = function() {

    // private property
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    var input = this.encodeUTF8(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
		   _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
		   _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
    }

    return output;
}

String.prototype.decodeBase64 = function () {
     
     var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	 var output = "";
	 var chr1, chr2, chr3;
	 var enc1, enc2, enc3, enc4;
	 var i = 0;

	 var input = this.replace(/[^A-Za-z0-9\+\/\=]/g, "");

	 while (i < input.length) {

		 enc1 = _keyStr.indexOf(input.charAt(i++));
		 enc2 = _keyStr.indexOf(input.charAt(i++));
		 enc3 = _keyStr.indexOf(input.charAt(i++));
		 enc4 = _keyStr.indexOf(input.charAt(i++));

		 chr1 = (enc1 << 2) | (enc2 >> 4);
		 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
		 chr3 = ((enc3 & 3) << 6) | enc4;

		 output = output + String.fromCharCode(chr1);

		 if (enc3 != 64) {
			 output = output + String.fromCharCode(chr2);
		 }
		 if (enc4 != 64) {
			 output = output + String.fromCharCode(chr3);
		 }

	 }

	 output = output.decodeUTF8();

	 return output;

 }


// utf8 형식으로 변환
String.prototype.encodeUTF8 = function() {

   var string = this.replace(/\r\n/g,"\n");
   var utftext = "";

   for (var n = 0; n < string.length; n++) {

	   var c = string.charCodeAt(n);

	   if (c < 128) {
		   utftext += String.fromCharCode(c);
	   }
	   else if((c > 127) && (c < 2048)) {
		   utftext += String.fromCharCode((c >> 6) | 192);
		   utftext += String.fromCharCode((c & 63) | 128);
	   }
	   else {
		   utftext += String.fromCharCode((c >> 12) | 224);
		   utftext += String.fromCharCode(((c >> 6) & 63) | 128);
		   utftext += String.fromCharCode((c & 63) | 128);
	   }

   }

   return utftext;
			   

}


String.prototype.decodeUTF8 = function(utftext) {
    
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;
    var utftext = this;
    
    while (i < utftext.length) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if ((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i + 1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i + 1);
            c3 = utftext.charCodeAt(i + 2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }

    return string;
}

//String.encodeBase64(str) = function() {
//    return str.encodeBase64();
//}

//String.decodeBase64(str) = function() {
//    return str.decodeBase64();
//}

// 포맷된 숫자형 문자를 숫자형으로 변환
String.prototype.unformat = function() {
    return (this.trim().replace(/([^0-9\.\-])/g, '') * 1);
}

// Left 함수
String.prototype.left = function(length) {
    return this.substring(0, length - 1);
}

// Right 함수
String.prototype.right = function(length) {
    return this.substring(this.length - (length), this.length - (length) + length);
}

// Byte수 반환
String.prototype.bLength = function() {

    var str = this;
    var len = 0;

    if (str == null)
        return 0;

    for (var i = 0; i < str.length; i++) {
        var c = escape(str.charAt(i));
        if (c.length == 1) len++;
        else if (c.indexOf("%u") != -1) len += 2;
        else if (c.indexOf("%") != -1) len += c.length / 3;
    }

    return len;

}

// 파일 확장자 반환
String.prototype.getFileExt = function() {

    var filePath = this;

    if (filePath.lastIndexOf("\\") >= 0) {
        filePath = filePath.substr(filePath.lastIndexOf("\\") + 1, filePath.length - filePath.lastIndexOf("\\"));
    }

    if (filePath.lastIndexOf("/") >= 0) {
        filePath = filePath.substr(filePath.lastIndexOf("/") + 1, filePath.length - filePath.lastIndexOf("/"));
    }

    if (filePath.lastIndexOf(".") >= 0) {
        return filePath.substr(filePath.lastIndexOf(".") + 1, filePath.length - filePath.lastIndexOf(".")).toLowerCase();
    }

    return "";

}

// 파일 명 반환
// isExt : 확장자 포함여부 (def. false)
String.prototype.getFileName = function(isExt) {

    var filePath = this;
    if (isExt == undefined) isExt = false;

    if (filePath.lastIndexOf("\\") >= 0) {
        filePath = filePath.substr(filePath.lastIndexOf("\\") + 1, filePath.length - filePath.lastIndexOf("\\"));
    }

    if (filePath.lastIndexOf("/") >= 0) {
        filePath = filePath.substr(filePath.lastIndexOf("/") + 1, filePath.length - filePath.lastIndexOf("/"));
    }

    if (!isExt) {
        if (filePath.lastIndexOf(".") >= 0) {
            return filePath.substr(0, filePath.lastIndexOf("."));
        }
    }

    return filePath;

}



// 스트링을 Byte수에 따라 cut
String.prototype.cut = function(length) {

    var str = this;
    var len = 0;

    for (var i = 0; i < str.length; i++) {
        var c = escape(str.charAt(i));
        if (c.length == 1) len++;
        else if (c.indexOf("%u") != -1) len += 2;
        else if (c.indexOf("%") != -1) len += c.length / 3;

        if (len >= length) {
            return str.substring(0, i) + "...";
        }

    }

    return str;

}

// 해당 값이 파라미터에 있는지 체크
String.prototype.hasValue = function() {

    var args = $A(arguments);
    for (var i = 0; i < args.length; i++) {
        if (args[i] == this) return true;
    }
    return false;

}


//////////////////////// Number Prototype ////////////////////////////////////////////////////////////
//
// format : 포맷 문자열로 변환
//

Number.prototype.format = function(point, e, prefix) {

    point = point || 0;
    prefix = prefix || '';
    e = e || '';

    var number = this;
    number += '';


    var splitStr = number.split('.');

    if (splitStr[0] == "-" || splitStr[0] == "0-") {
        var splitLeft = "-";
    }
    else {
        var splitLeft = splitStr[0].unformat().toString();
    }

    var splitRight = splitStr.length > 1 ? '.' + splitStr[1].substring(0, point).unformat().toString() : '';

    var regx = /(\d+)(\d{3})/;

    while (regx.test(splitLeft)) {
        splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
    }

    if (e == '') {
        return prefix + splitLeft + splitRight;
    } else {
        if (number.indexOf(".") == -1 || point == 0) {
            number = prefix + splitLeft;
        }
        else {
            if (splitStr[1] == undefined) {
                number = prefix + splitLeft + ".";

            }
            else {
                number = prefix + splitLeft + splitRight;
            }
        }

        if (isNaN(this)) {
            e.value = 0
        }
        else {
            e.value = number
        }
    }


}

// 파일 사이즈 형태로 리턴
Number.prototype.toFileSize = function() {
    
    var size = this;

    if (Math.floor(size / (1024 * 1024 * 1024)) < 1)
    {
        if (Math.floor(size / (1024 * 1024)) < 1)
        {
            if (Math.floor(size / (1024)) < 1)
                return size + "B";
            else
                return (size / (1024)).format(1) + "KB";
        } else {
            return (size / (1024 * 1024)).format(2) + "MB";
        }
    }  else {
        return (size / (1024 * 1024 * 1024)).format(2) + "GB";
    }


}

// 해당 값이 파라미터에 있는지 체크
Number.prototype.hasValue = function() {

    var args = $A(arguments);
    for (var i = 0; i < args.length; i++) {
        if (args[i] == this) return true;
    }
    return false;

}

//////////////////////// Date Prototype ////////////////////////////////////////////////////////////
//
//

// 날짜를 format string 타입으로 변환
Date.prototype.format = function(dateFormat) {
    var result = "";

    var MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var MONTHS_FULL = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
    var DAYS_FULL = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

    dateFormat = dateFormat == 8 && "YYYY.MM.DD" ||
               dateFormat == 6 && "hh:mm:ss" ||
               dateFormat ||
               "YYYY.MM.DD hh:mm:ss";
    
    for (var i = 0; i < dateFormat.length; i++) {


        result += dateFormat.indexOf("YYYY", i) == i ? (i += 3, this.getFullYear()) :
				  dateFormat.indexOf("YY", i) == i ? (i += 1, String(this.getFullYear()).substring(2)) :
				  dateFormat.indexOf("MMMF", i) == i ? (i += 3, MONTHS_FULL[this.getMonth()]) :
				  dateFormat.indexOf("MMM", i) == i ? (i += 2, MONTHS[this.getMonth()]) :
				  dateFormat.indexOf("WEKF", i) == i ? (i += 3, DAYS_FULL[this.getDay()]) :
				  dateFormat.indexOf("WEK", i) == i ? (i += 2, DAYS[this.getDay()]) :
				  dateFormat.indexOf("MM", i) == i ? (i += 1, (this.getMonth() + 1).toPaddedString(2)) :
				  dateFormat.indexOf("M", i) == i ? (this.getMonth() + 1) :
				  dateFormat.indexOf("DDD", i) == i ? (i += 2, DAYS[this.getDay()]) :
				  dateFormat.indexOf("DD", i) == i ? (i += 1, this.getDate().toPaddedString(2)) :
				  dateFormat.indexOf("D", i) == i ? (this.getDate()) :
				  dateFormat.indexOf("hh", i) == i ? (i += 1, this.getHours().toPaddedString(2)) :
				  dateFormat.indexOf("h", i) == i ? (this.getHours()) :
				  dateFormat.indexOf("mm", i) == i ? (i += 1, this.getMinutes().toPaddedString(2)) :
				  dateFormat.indexOf("m", i) == i ? (this.getMinutes()) :
				  dateFormat.indexOf("ss", i) == i ? (i += 1, this.getSeconds().toPaddedString(2)) :
				  dateFormat.indexOf("s", i) == i ? (this.getSeconds()) :
														   (dateFormat.charAt(i));

    }


    return result;
}

// 일정한 날짜를 더한다.
// VB의 dateAdd와 같은 함수
Date.prototype.add = function(Interval, Number) {

    var NewDate = null;
    var RtnDate = null;
    var year = null;
    var month = null;
    var day = null;
    var Ryear = null;
    var Rmonth = null;
    var Rday = null;

    //date가 Date 객체일 경우
    if (this instanceof Date) {
        NewDate = this;
        year = NewDate.getFullYear();
        month = NewDate.getMonth();
        day = NewDate.getDate();
    }
    //date가 문자열일경우
    else {
        var temp = date.split("-");
        NewDate = new Date(temp[0], (temp[1] - 1), temp[2]);
        year = temp[0];
        month = temp[1] - 1;
        day = temp[2];
    }

    if (Interval == "y" || Interval == "Y") {
        year = parseInt(year) + Number;
    }
    else if (Interval == "m" || Interval == "M") {
        month = parseInt(month) + Number;
    }
    else if (Interval == "d" || Interval == "D") {
        day = parseInt(day) + Number;
    }

    RtnDate = new Date(year, month, day);

    Ryear = RtnDate.getFullYear();
    Rmonth = RtnDate.getMonth() + 1;
    Rday = RtnDate.getDate();

    if (Rmonth < 10) {
        Rmonth = "0" + Rmonth;
    }

    if (Rday < 10) {
        Rday = "0" + Rday;
    }

    return (Ryear + "-" + Rmonth + "-" + Rday).toDate();

}

// 날짜 사이의 차이를 구한다.
// VB의 dateDiff와 같음
Date.prototype.diff = function(Interval, date) {

    switch (Interval) {

        case "d": // 날짜
            return Math.round((date - this) / (1000 * 60 * 60 * 24))
            break;

        case "h": // 시간
            return Math.round((date - this) / (1000 * 60 * 60))
            break;

        case "m": // 분
            return Math.round((date - this) / (1000 * 60))
            break;

        case "s": // 초
            return Math.round((date - this) / (1000))
            break;
    }
}


//////////////////////// Array Prototype ////////////////////////////////////////////////////////////
//
//

// 해당 Array에 해당 값이 존재하는지 체크
Array.prototype.hasValue = function(val) {

    for (var i = 0; i < this.length; i++) {
        if (this[i] == val) return true;
    }

    return false;

}

// Array에 Array를 합치기
Array.prototype.addArray = function(arr) {

    for (var i = 0; i < arr.length; i++) {
        this.push(arr[i]);
    }

    return this;

}