/********************************************************
* FILE NAME 	: Validator.js
* DESC			: Æû À¯È¿¼º°Ë»ç
* DATE  		: 2004-06-28
* AUTHOR  	: ¹Ú¸í±Ô
* HISTORY 
					: 
*********************************************************/

/**
*	[HTML Æû ÅÂ±×¿¡ ValidationÀ» À§ÇØ Ãß°¡ÇÑ ¼Ó¼º
*
*	- GROUP : 
*	- HNAME : 
*	- REQUIRED : 
*	- MINBYTE : 
*	- MAXBYTE : 
*	- OPTION : 
*		- email 
*		- homepage
*		- phone
*		- mobile
*		- jumin
*		- biznum
*		- number
*		- real
*		- kor
*		- kornum
*		- eng
*		- engnum
*		- engspace
*		- koreng
*		- char
*		- id
*		- password
*		- date
*
*/
function Validator(form) {
	this.form = form;
	
	var ERROR_MSG_REQUIRED = "{name+Àº´Â} ÇÊ¼öÇ×¸ñÀÔ´Ï´Ù.";
	var ERROR_MSG_OPTION = "{name+ÀÌ°¡} ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù";
	var ERROR_MSG_MAXBYTE = "{name+Àº´Â} ÃÖ´ë {length}±ÛÀÚ ÀÌÇÏÀÌ¾î¾ß ÇÕ´Ï´Ù.";
	var ERROR_MSG_MINBYTE = "{name+Àº´Â} ÃÖ¼Ò {length}±ÛÀÚ ÀÌ»óÀÌ¾î¾ß ÇÕ´Ï´Ù.";
	
	/// ½ºÆ®¸µ °´Ã¼¿¡ ¸Þ¼Òµå Ãß°¡ ///
	String.prototype.trim = function(str) { 
		str = this != window ? this : str; 
		return str.replace(/^\s+/g,'').replace(/\s+$/g,''); 
	}
	
	String.prototype.hasFinalConsonant = function(str) {
		str = this != window ? this : str; 
		var strTemp = str.substr(str.length-1);
		
		return ((strTemp.charCodeAt(0)-16)%28!=0);
	}
    
    function hasValue(group) {
        var el;
        
        for(i=0; i<form.elements.length; i++) {
            el = form.elements[i];
            
            // hidden, submit Å¸ÀÔÀº °Ë»çÇÏÁö ¾ÊÀ½
            if( el.type == 'hidden' || el.type == 'submit')
                continue;
                
            // ±×·ì°Ë»ç
            if(group != null && el.getAttribute('GROUP') != group)
                continue;
           
            if( el.value != null && el.value ) {
                return true;
            }
        }
        
        return false;
    }
    this.hasValue = hasValue;

	/**
	*	validate() : ÆûÀÇ À¯È¿¼º °Ë»ç¸¦ ½Ç½ÃÇÕ´Ï´Ù.
	*/
	function validate(group) {
		var el;
		
		for(i=0; i<form.elements.length; i++) {
			el = form.elements[i];
            
            // hidden, submit Å¸ÀÔÀº °Ë»çÇÏÁö ¾ÊÀ½
            if( el.type == 'hidden' || el.type == 'submit' )
                continue;
                
            // ±×·ì°Ë»ç
            if(group != null && el.getAttribute('GROUP') != group)
                continue;
			
			// ÇÊ¼ö¿©ºÎ°Ë»ç
			if(el.getAttribute('REQUIRED') != null) {
				if(el.value == null || el.value.trim() == '') {
					return doError(el, ERROR_MSG_REQUIRED, false);
				}
			}
			
			// ÃÖ´ë±æÀÌ°Ë»ç
			if(el.getAttribute('MAXBYTE') != null) {
				if(el.value != null && el.value.length > el.getAttribute('MAXBYTE') ) {
					return doError(el, ERROR_MSG_MAXBYTE, false);
				}
			}
			
			// ÃÖ¼Ò±æÀÌ°Ë»ç
			if(el.getAttribute('MINBYTE') != null) {
				if(el.value != null && el.value.length < el.getAttribute('MINBYTE') ) {
					return doError(el, ERROR_MSG_MINBYTE, false);
				}
			}
			
			// Æ¯¼öÆÐÅÏ°Ë»ç
			var option = el.getAttribute('OPTION');
			if(option != null ) {
            
                // ÇÊ¼öµ¥ÀÌÅÍ°¡ ¾Æ´Ñ °æ¿ì °ªÀÌ ¾øÀ¸¸é °Ë»çÇÏÁö ¾ÊÀ½
                if( el.getAttribute('REQUIRED') == null && (el.value == null || el.value == '') )
                    continue;
                    
				if(option == 'email') {
					if( !isValidEmail(el.value) ) {
						return doError(el, ERROR_MSG_OPTION, false);
					}
				} else if(option == 'homepage') {
					if( !isValidHomepage(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿Ã¹Ù¸¥ È¨ÆäÀÌÁöÁÖ¼Ò°¡ ¾Æ´Õ´Ï´Ù.", false);
					}
				} else if(option == 'phone') {
					if( !isValidPhone(el.value) ) {
						return doError(el,"{name+ÀÌ°¡} ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.", false);
					}
				} else if(option == 'mobile') {
                    if( !isValidMobilePhone(el.value) ) {
                        return doError(el,"{name+ÀÌ°¡} ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.", false);
                    }
                } else if(option == 'jumin') {
					if( !isValidJumin(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿Ã¹Ù¸¥ ÁÖ¹Îµî·Ï¹øÈ£°¡ ¾Æ´Õ´Ï´Ù.", false);
					}
				} else if(option == 'biznum') {
					if( !isValidBiznum(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿Ã¹Ù¸¥ »ç¾÷ÀÚµî·Ï¹øÈ£°¡ ¾Æ´Õ´Ï´Ù.", false);
					}
				} else if(option == 'number') {
					if( !isValidNumber(el.value) ) {
						return doError(el,"{name+Àº´Â} ¼ýÀÚ¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'real') {
					if( !isValidReal(el.value) ) {
						return doError(el,"{name+Àº´Â} ½Ç¼ö¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'kor') {
					if( !isValidKor(el.value) ) {
						return doError(el,"{name+Àº´Â} ÇÑ±Û¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'kornum') {
					if( !isValidKorNum(el.value) ) {
						return doError(el,"{name+Àº´Â} ÇÑ±Û+¼ýÀÚ¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'eng') {
					if( !isValidEng(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿µ¾î¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'engnum') {
					if( !isValidEngNum(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿µ¾î+¼ýÀÚ¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'engspace') {
                    if( !isValidEngSpace(el.value) ) {
                        return doError(el,"{name+Àº´Â} ¿µ¾î¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
                    }
                } else if(option == 'koreng') {
					if( !isValidKorengEng(el.value) ) {
						return doError(el,"{name+Àº´Â} ÇÑ±ÛÀÌ³ª ¿µ¾î¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'char') {
					if( !isValidChar(el.value) ) {
						return doError(el,"{name+Àº´Â} ÇÑ±Û, ¿µ¾î, ¼ýÀÚ ¸¸ ÀÔ·ÂÇØ¾ßÇÕ´Ï´Ù.", false);
					}
				} else if(option == 'id') {
					if( !isValidID(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿Ã¹Ù¸¥ ¾ÆÀÌµð°¡ ¾Æ´Õ´Ï´Ù.", false);
					}
				} else if(option == 'password') {
					if( !isValidPassword(el.value) ) {
						return doError(el,"{name+Àº´Â} ¿Ã¹Ù¸¥ ºñ¹Ð¹øÈ£°¡ ¾Æ´Õ´Ï´Ù.", false);
					}
				} else if(option == 'date') {
                    if( !isValidDate(el.value) ) {
                        return doError(el,"³¯Â¥ Çü½ÄÀÌ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.\nÇü½Ä)YYYY-MM-DD ·Î ÀÔ·ÂÇØ ÁÖ½Ê½Ã¿ä.", false);
                    } else if( isDate(el.value) ) {
                        return doError(el, "Á¸ÀçÇÏÁö ¾Ê´Â ³¯Â¥ÀÔ´Ï´Ù.");
                    }
                }
			}
		}
		
		return true;
	}
	this.validate = validate;
	
	/**
	*	doError() : ¿¡·¯ ¹ß»ý¿¡ ´ëÇÑ Ã³¸®¸¦ ¼öÇàÇÕ´Ï´Ù.
	*
	* @param el : ÆûÀÇ ¿¤¸®¸ÕÆ® °´Ã¼
	* @param type : ¿¡·¯±¸ºÐ
	*/
	function doError(el, msg, del) {
		var pattern = /{([a-zA-Z0-9_]+)\+?([°¡-Èþ]{2})?}/;
		var pattern2 = /{length}/;
		var tail;
		var eName;
		
		eName = el.getAttribute('HNAME');
		if(eName == null) {
			eName = el.name;
		}
		
		// ÀÌ¸§
		pattern.exec(msg);
		tail = (RegExp.$2) ? josa(eName, RegExp.$2) : "";
		var reMsg = eName + msg.replace(pattern, tail);

		// ÃÖ¼Ò±æÀÌ
		if( el.getAttribute('MINBYTE') && el.getAttribute('MINBYTE') != 'null' && el.value.length < el.getAttribute('MINBYTE') ) {
			pattern2.exec(reMsg);
			reMsg = reMsg.replace(pattern2, el.getAttribute('MINBYTE'));
		}
		
		// ÃÖ´ë±æÀÌ
		if( el.getAttribute('MAXBYTE') != null && el.value != null && el.value.length > el.getAttribute('MAXBYTE') ) {
			pattern2.exec(reMsg);
			reMsg = reMsg.replace(pattern2, el.getAttribute('MAXBYTE'));
		}
		
		alert(reMsg);
		
		if( del ) {
			el.value = '';
		}
		el.focus();
		
		return false;
	}
	
	/**
	*	josa() : ¹®ÀÚ¿­ÀÇ Á¶»ç¿¡µû¶ó 'Àº', '´Â' °áÁ¤
	*/
	function josa(str,tail) {
		return (str.hasFinalConsonant()) ? tail.substring(0,1) : tail.substring(1,2);
	}
	
	function isValidEmail(email) {
		var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
		return (pattern.test(email)) ? true : false;
	}
    this.isValidEmail = isValidEmail;
	
    /**
    *   isValidHomepage() : ¿Ã¹Ù¸¥ È¨ÆäÀÌÁö ÁÖ¼ÒÀÎÁö °Ë»ç
    *
    *   Çü½Ä) http://www.homepage.com : 'http://'·Î ½ÃÀÛÇØ¾ß ÇÔ.
    */
	function isValidHomepage(homepage) {
        var pattern = /http:\/\/([a-zA-Z0-9]{2,}).(([a-zA-Z0-9]{2,}).){0,2}([a-zA-Z]{2,3})$/;
        
        if( pattern.test(homepage) ) {
            return true;
        } else {
            return false;
        }
	}
    this.isValidHomepage = isValidHomepage;
	
    /**
    *   isValidMobilePhone() : ¿Ã¹Ù¸¥ ÈÞ´ëÀüÈ­ ¹øÈ£ÀÎÁö °Ë»ç
    *
    *   Çü½Ä) 019-973-1004 : '-'·Î ±¸ºÐÇØ¾ß ÇÔ.
    */
	function isValidMobilePhone(phone) {
		var pattern = /^([0]{1}[1]{1}[016789]{1})-([0-9]{3,4})-([0-9]{4})$/;
        
		if( pattern.test(phone) ) {
			return true;
		} else {
			return false;
		}
	}
    this.isValidMobilePhone = isValidMobilePhone;

    
    /**
    *   isValidPhone() : ¿Ã¹Ù¸¥ ÀüÈ­ ¹øÈ£ÀÎÁö °Ë»ç
    *
    *   Çü½Ä) 042-486-9876 : '-' ·Î ±¸ºÐÇØ¾ß ÇÔ.
    */
    function isValidPhone(phone) {
        var pattern = /^[0]{1}[0-9]{1,2}-[0-9]{3,4}-[0-9]{4}$/;
        if (pattern.test(phone)) {
            return true;
        } else {
            return false;
        }
    }
    this.isValidPhone = isValidPhone;
	
	/**
	*	isValidJumin() : ÁÖ¹Îµî·Ï¹øÈ£°¡ ¿Ã¹Ù¸¥Áö °Ë»ç
	*/
	function isValidJumin(jumin) {
		var pattern = /^([0-9]{6})-?([0-9]{7})$/; 
	    if (!pattern.test(jumin)) 
	    	return false; 
	    jumin = RegExp.$1 + RegExp.$2;
	
		var sum = 0;
		var last = jumin.charCodeAt(12) - 0x30;
		var bases = "234567892345";

		for (var i=0; i<12; i++) {
			if (isNaN(jumin.substring(i,i+1))) 
				return false;
			sum += (jumin.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
		}
		var mod = sum % 11;
		return ((11 - mod) % 10 == last) ? true : false;
	}
    this.isValidJumin = isValidJumin
	
	/**
	*	isValidBiznum() : »ç¾÷ÀÚ¹øÈ£°¡ ¿Ã¹Ù¸¥Áö °Ë»ç
	*/
	function isValidBiznum(biznum) {
		var pattern = /([0-9]{3})-?([0-9]{2})-?([0-9]{5})/; 
	    if (!pattern.test(biznum)) 
	    	return false; 
	    	
	    biznum = RegExp.$1 + RegExp.$2 + RegExp.$3;
	    var cVal = 0; 
	    for (var i=0; i<8; i++) { 
	        var cKeyNum = parseInt(((_tmp = i % 3) == 0) ? 1 : ( _tmp  == 1 ) ? 3 : 7); 
	        cVal += (parseFloat(biznum.substring(i,i+1)) * cKeyNum) % 10; 
	    } 
	    var li_temp = parseFloat(biznum.substring(i,i+1)) * 5 + '0'; 
	    cVal += parseFloat(li_temp.substring(0,1)) + parseFloat(li_temp.substring(1,2)); 
	    return (parseInt(biznum.substring(9,10)) == 10-(cVal % 10)%10) ? true : false; 
	}
    this.isValidBiznum = isValidBiznum;
	
	function isValidNumber(number) {
		var pattern = /^[0-9]+$/;
		return (pattern.test(number)) ? true : false;
	}
	
	function isValidReal(real) {
		return true;
	}
	
	function isValidKor(kor) {
		var pattern = /^[°¡-Èþ]+$/;
		return (pattern.test(kor)) ? true : false;
	}

	function isValidKorNum(kornum) {
		var pattern = /^[°¡-Èþ0-9]+$/;
		return (pattern.test(kornum)) ? true : false;
	}
	
	function isValidEng(eng) {
		var pattern = /^[a-zA-Z]+$/;
		return (pattern.test(eng)) ? true : false;
	}

	function isValidEngNum(engnum) {
		var pattern = /^[a-zA-Z0-9]+$/;
		return (pattern.test(engnum)) ? true : false;
	}
    
    function isValidEngSpace(eng) {
        var pattern = /^[a-zA-Z\s]+$/;
        return (pattern.test(eng)) ? true : false;
    }
	
	function isValidKorEng(koreng) {
		return (isValidKor(koreng) && isValidEng(koreng));
	}
	
	function isValidChar(ch) {
		var pattern = /^[°¡-Èþ-a-zA-Z0-9]+$/;
		return (pattern.test(ch)) ? true : false;
	}
	
	function isValidID(id) {
		var pattern = /^[a-z]{1}[a-z0-9]{2,}$/;
		return (pattern.test(id)) ? true : false;
	}
	
	function isValidPassword(password) {
		var pattern = /^[a-z0-9]{1}[a-zA-Z0-9]{3,9}$/;
		return (pattern.test(password)) ? true : false;
	}
    
    /**
    *   isValidDate() : ³¯Â¥Çü½ÄÀÌ ¸Â´ÂÁö °Ë»ç(YYYY-MM-DD¸¸ °¡´ÉÇÏµµ·Ï)
    */
    function isValidDate(s) {
        var pattern = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
        return (pattern.test(s)) ? true : false;
    }
    
    /**
    *   isDate() : Á¸ÀçÇÏ´Â ³¯Â¥ÀÎÁö °Ë»ç (YYYY-MM-DD ¸¸ °¡´ÉÇÏµµ·Ï)
    */
    function isDate(s) {
        var pattern = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/;
        var year, month, date;
        
        pattern.exec(s);
        year = RegExp.$1;
        month = RegExp.$2;
        day = RegExp.$3;
        
        if( year && month && day ) {
        } else {
            return false;
        }
        
        var time = new Date(year, month, date);
        if( time.getFullYear() == year && time.getMonth() == month && time.getDate() == date )
            return true;
        else
            return false;
    }
    this.isDate = isDate;
}
