/**
 * 자바스크립트 공통함수
 */

/** 
 * string String::cut(int len)
 * 글자를 앞에서부터 원하는 바이트만큼 잘라 리턴합니다.
 * 한글의 경우 2바이트로 계산하며, 글자 중간에서 잘리지 않습니다.
 */
String.prototype.cut = function(len) {
	var str = this;
	var l = 0;
	for (var i=0; i<str.length; i++) {
		l += (str.charCodeAt(i) > 128) ? 2 : 1;
		if (l > len) return str.substring(0,i) + "...";
	}
	return str;
}
/** 
 * string String::trim()
 * 글자를 앞 뒤 공백을 삭제 합니다.
 */
String.prototype.trim = function() { 
	var str = this;
	str = this != window ? this : str; 
	return str.replace(/^\s+/g,'').replace(/\s+$/g,''); 
}
 
/** 
 * bool String::bytes(void)
 * 해당스트링의 바이트단위 길이를 리턴합니다. (기존의 length 속성은 2바이트 문자를 한글자로 간주합니다)
 */
String.prototype.bytes = function() {
	var str = this;
	var l = 0;
	for (var i=0; i<str.length; i++) l += (str.charCodeAt(i) > 128) ? 2 : 1;
	return l;
}

/**
 * 입력값이 NULL인지 체크
 */
function isNull(value) {
    if (value == null || value == "") {
        return true;
    }
    return false;
}

/**
 * 입력값에 스페이스 이외의 의미있는 값이 있는지 체크
 * ex) if (isEmpty(form.keyword)) {
 *         alert("검색조건을 입력하세요.");
 *     }
 */
function isEmpty(value) {
    if (value == null || value.replace(/ /gi,"") == "") {
        return true;
    }
    return false;
}

/**
 * 입력값에 특정 문자(chars)가 있는지 체크
 * 특정 문자를 허용하지 않으려 할 때 사용
 * ex) if (containsChars(form.name,"!,*&^%$#@~;")) {
 *         alert("이름 필드에는 특수 문자를 사용할 수 없습니다.");
 *     }
 */
function containsChars(value,chars) {
    for (var inx = 0; inx < value.length; inx++) {
       if (chars.indexOf(value.charAt(inx)) != -1)
           return true;
    }
    return false;
}

/**
 * 입력값이 특정 문자(chars)만으로 되어있는지 체크
 * 특정 문자만 허용하려 할 때 사용
 * ex) if (!containsCharsOnly(form.blood,"ABO")) {
 *         alert("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다.");
 *     }
 */
function containsCharsOnly(value,chars) {
    for (var inx = 0; inx < value.length; inx++) {
       if (chars.indexOf(value.charAt(inx)) == -1)
           return false;
    }
    return true;
}

/**
 * 입력값이 알파벳인지 체크
 * 아래 isAlphabet() 부터 isNumComma()까지의 메소드가
 * 자주 쓰이는 경우에는 var chars 변수를 
 * global 변수로 선언하고 사용하도록 한다.
 * ex) var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 *     var lowercase = "abcdefghijklmnopqrstuvwxyz"; 
 *     var number    = "0123456789";
 *     function isAlphaNum(value) {
 *         var chars = uppercase + lowercase + number;
 *         return containsCharsOnly(value,chars);
 *     }
 */
function isAlphabet(value) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값이 알파벳 대문자인지 체크
 */
function isUpperCase(value) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값이 알파벳 소문자인지 체크
 */
function isLowerCase(value) {
    var chars = "abcdefghijklmnopqrstuvwxyz";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값에 숫자만 있는지 체크
 */
function isNumber(value) {
    var chars = "0123456789";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값이 알파벳,숫자로 되어있는지 체크
 */
function isAlphaNum(value) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값이 숫자,대시(-)로 되어있는지 체크
 */
function isNumDash(value) {
    var chars = "-0123456789";
    return containsCharsOnly(value,chars);
}

/**
 * 입력값이 숫자,콤마(,)로 되어있는지 체크
 */
function isNumComma(value) {
    var chars = ",0123456789";
    return containsCharsOnly(value,chars);
}
/**
 * 한글인지 체크
 */
function isHangul(value){
    strarr = new Array(value.length);
    schar = new Array('/','.','>','<',',','?','}','{',' ','\\','|','(',')','+','=');
    for (i=0; i<value.length; i++) {
        for (j=0; j<schar.length; j++) {
            if (schar[j] == value.charAt(i)) {
                return false;
            }else continue;
        }
        strarr[i] = value.charAt(i)
        if ((strarr[i] >=0) && (strarr[i] <=9)) { // 숫자체크
            return false;
        } else if ((strarr[i] >='a') && (strarr[i] <='z')) { // 알파벳 체크
            return false;
        } else if ((strarr[i] >='A') && (strarr[i] <='Z')) { // 알파벳 체크
            return false;
        } else if ((escape(strarr[i]) > '%60') && (escape(strarr[i]) <'%80') ) { // 특수문자체크
            return false;
        } else {
            continue;
        }
    } 
    return true;
}
function isValidName(value) {
	strarr = new Array(value.length);
	schar = new Array('`','~','!','@','#','$','%','^','&','*','(',')','-','_','+','=','\\','|','[',']','{','}',';',':','\'','\"',',','<','.','>','/','?');
	for (i=0; i<value.length; i++) {
		for (j=0; j<schar.length; j++) {
			if (schar[j] == value.charAt(i)) {
				return false;
			}else{
				continue;
			}
		}
		strarr[i] = value.charAt(i)
		if ((strarr[i] >=0) && (strarr[i] <=9)) {
			return false;
		} else if ((strarr[i] >='a') && (strarr[i] <='z')) {
			return false;
		} else if ((strarr[i] >='A') && (strarr[i] <='Z')) {
			return false;
		} else if ((escape(strarr[i]) > '%60') && (escape(strarr[i]) <'%80') ) {
			return false;
		} else {
			continue;
		}
	}
	return true;
}


/**
 * 입력값이 사용자가 정의한 포맷 형식인지 체크
 * 자세한 format 형식은 자바스크립트의 ''regular expression''을 참조
 */
function isValidFormat(value,format) {
    if (value.search(format) != -1) {
        return true; //올바른 포맷 형식
    }
    return false;
}
/**
 * 입력값이 올바른 ID 형식인지 체크
 */
function isValidId(value){
    var pattern = /^[a-zA-Z0-9_-]{1}[a-zA-Z0-9_-]{3,19}$/;
    return (pattern.test(value)) ? true : false;
}
/**
 * 입력값이 올바른 이름 형식인지 체크
 
function isValidName(value){
	var pattern = /\s+/g;
	if(pattern.test(value)){
		return false;
	}else{
		pattern = /[가-힝]/;
	    return (pattern.test(value)) ? true : false;
	}
}*/

/**
 * 주민번호체크
 */
function isValidRegnum(regnum1, regnum2){
    var pattern = /^([0-9]{6})-?([0-9]{7})$/; 
	var num = regnum1+"-"+regnum2;
    if (!pattern.test(num)) return false; 
    num = RegExp.$1 + RegExp.$2;

	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return false;
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return ((11 - mod) % 10 == last);

}
/**
 * 입력값이 이메일 형식인지 체크
 * ex) if (!isValidEmail(form.email)) {
 *         alert("올바른 이메일 주소가 아닙니다.");
 *     }
 */
function isValidEmail(value) {
    var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
	return pattern.test(value);
}

/**
 * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크
 */
function isValidPhone(value) {
    var pattern = /^([0]{1}[0-9]{1,2}[0]?)-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	return pattern.test(value);
}
/**
 * 입력값의 바이트 길이를 리턴
 * ex) if (getByteLength(form.title) > 100) {
 *         alert("제목은 한글 50자(영문 100자) 이상 입력할 수 없습니다.");
 *     }
 * Author : Wonyoung Lee
 */
function getByteLength(value) {
    var byteLength = 0;
    for (var inx = 0; inx < value.length; inx++) {
        var oneChar = escape(value.charAt(inx));
        if ( oneChar.length == 1 ) {
            byteLength ++;
        } else if (oneChar.indexOf("%u") != -1) {
            byteLength += 2;
        } else if (oneChar.indexOf("%") != -1) {
            byteLength += oneChar.length/3;
        }
    }
    return byteLength;
}

/**
 * 입력값에서 콤마를 없앤다.
 */
function removeComma(value) {
    return value.replace(/,/gi,"");
}
/**
 * 공백제거
 */
function removeBlank(value) { 
   for (; value.indexOf(" ") != -1 ;){ 
     value = value.replace(" ",""); 
   } 
   return value; 
}
/**
 * 선택된 라디오버튼이 있는지 체크
 */
function hasCheckedRadio(input) {
    if (input.length > 1) {
        for (var inx = 0; inx < input.length; inx++) {
            if (input[inx].checked) return true;
        }
    } else {
        if (input.checked) return true;
    }
    return false;
}

/**
 * 선택된 체크박스가 있는지 체크
 */
function hasCheckedBox(input) {
    return hasCheckedRadio(input);
}
/**
 * 재외국인 번호 체크
 */
function check_fgnno(fgnno) {
    var sum=0;
    var odd=0;
    buf = new Array(13);
    for(i=0; i<13; i++) { buf[i]=parseInt(fgnno.charAt(i)); }
    odd = buf[7]*10 + buf[8];
    if(odd%2 != 0) { return false; }
    if( (buf[11]!=6) && (buf[11]!=7) && (buf[11]!=8) && (buf[11]!=9) ) {
            return false;
    }
    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
    for(i=0, sum=0; i<12; i++) { sum += (buf[i] *= multipliers[i]); }
    sum = 11 - (sum%11);
    if(sum >= 10) { sum -= 10; }
    sum += 2;
    if(sum >= 10) { sum -= 10; }
    if(sum != buf[12]) { return false }
    return true;
}

// 주민번호 체크
function check_juminno(juminno) {
    if(juminno=="" || juminno==null || juminno.length!=13) {
        alert("주민등록번호를 적어주세요.");
        return false;
    }
    var jumin1 = juminno.substr(0,6);
    var jumin2 = juminno.substr(6,7);
    var yy     = jumin1.substr(0,2);        // 년도
    var mm     = jumin1.substr(2,2);        // 월
    var dd     = jumin1.substr(4,2);        // 일
    var genda  = jumin2.substr(0,1);        // 성별
    var msg, ss, cc;

    // 숫자가 아닌 것을 입력한 경우
    if (!isNumeric(jumin1)) {
        alert("주민등록번호 앞자리를 숫자로 입력하세요.");
        return false;
    }
    // 길이가 6이 아닌 경우
    if (jumin1.length != 6) {
        alert("주민등록번호 앞자리를 다시 입력하세요.");
        return false;
    }
    // 첫번째 자료에서 연월일(YYMMDD) 형식 중 기본 구성 검사
    if (yy < "00" || yy > "99" ||
        mm < "01" || mm > "12" ||
        dd < "01" || dd > "31") {
        alert("주민등록번호 앞자리를 다시 입력하세요.");
        return false;
    }
    // 숫자가 아닌 것을 입력한 경우
    if (!isNumeric(jumin2)) {
        alert("주민등록번호 뒷자리를 숫자로 입력하세요.");
        return false;
    }
    // 길이가 7이 아닌 경우
    if (jumin2.length != 7) {
        alert("주민등록번호 뒷자리를 다시 입력하세요.");
        return false;
    }
    // 성별부분이 1 ~ 4 가 아닌 경우
    if (genda < "1" || genda > "4") {
        alert("주민등록번호 뒷자리를 다시 입력하세요.");
        return false;
    }
    // 연도 계산 - 1 또는 2: 1900년대, 3 또는 4: 2000년대
    cc = (genda == "1" || genda == "2") ? "19" : "20";
    // 첫번째 자료에서 연월일(YYMMDD) 형식 중 날짜 형식 검사
    if (isYYYYMMDD(parseInt(cc+yy), parseInt(mm), parseInt(dd)) == false) {
        alert("주민등록번호 앞자리를 다시 입력하세요.");
        return false;
    }
    // Check Digit 검사
    if (!isSSN(jumin1, jumin2)) {
        alert("입력한 주민등록번호를 검토한 후, 다시 입력하세요.");
        return false;
    }
    return true;
}

// 사업자등록번호 체크
function check_busino(vencod) {
    var sum = 0;
    var getlist =new Array(10);
    var chkvalue =new Array("1","3","7","1","3","7","1","3","5");
    for(var i=0; i<10; i++) { getlist[i] = vencod.substring(i, i+1); }
    for(var i=0; i<9; i++) { sum += getlist[i]*chkvalue[i]; }
    sum = sum + parseInt((getlist[8]*5)/10);
    sidliy = sum % 10;
    sidchk = 0;
    if(sidliy != 0) { sidchk = 10 - sidliy; }
    else { sidchk = 0; }
    if(sidchk != getlist[9]) { return false; }
    return true;
}


function isYYYYMMDD(y, m, d) {
    switch (m) {
    case 2:        // 2월의 경우
        if (d > 29) return false;
        if (d == 29) {
            // 2월 29의 경우 당해가 윤년인지를 확인
            if ((y % 4 != 0) || (y % 100 == 0) && (y % 400 != 0))
               return false;
        }
        break;
    case 4:        // 작은 달의 경우
    case 6:
    case 9:
    case 11:
        if (d == 31) return false;
    }
    // 큰 달의 경우
    return true;
}
function isNumeric(s) {
    for (i=0; i<s.length; i++) {
        c = s.substr(i, 1);
        if (c < "0" || c > "9") return false;
    }
    return true;
}
function isLeapYear(y) {
    if (y < 100)
    y = y + 1900;
    if ( (y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0) ) {
            return true;
    } else {
            return false;
    }
}
function getNumberOfDate(yy, mm) {
    month = new Array(29,31,28,31,30,31,30,31,31,30,31,30,31);
    if (mm == 2 && isLeapYear(yy)) mm = 0;
    return month[mm];
}
function isSSN(s1, s2) {
    n = 2;
    sum = 0;
    for (i=0; i<s1.length; i++)
            sum += parseInt(s1.substr(i, 1)) * n++;
    for (i=0; i<s2.length-1; i++) {
            sum += parseInt(s2.substr(i, 1)) * n++;
            if (n == 10) n = 2;
    }
    c = 11 - sum % 11;
    if (c == 11) c = 1;
    if (c == 10) c = 0;
    if (c != parseInt(s2.substr(6, 1))) return false;
    else return true;
}



