Object.extend(String.prototype, {
  	trim : function() {
		return this.replace(/(^\s*)|(\s*$)/g, "");
  	},
	ltrim : function() {
		return this.replace(/(^\s*)/, "");
	},
	rtrim : function() {
		return this.replace(/(\s*$)/, "");	
	},
	getByteSize : function(){
		var count = 0;
		for (var i = 0; i < this.length; i++) {
			if (this.charCodeAt(i) > 127)
				count += 2;
			else
				count++;
		}
		return count;
	},
	toInt : function(){
		return (!isNaN(this)) ? parseInt(this) : null	;
	},
	toFloat : function(){
		return (!isNaN(this)) ? parseFloat(this) : null	;
	},
	getOnlyNumber : function(){
		return (this.trim().replace(/[^0-9]/g, ""));
	},
	getMoney : function(){
		var money = this.trim();
		while((/(-?[0-9]+)([0-9]{3})/).test(money)){
			money = money.replace((/(-?[0-9]+)([0-9]{3})/), "$1,$2");
		}
		return money;
	},
	fillZero : function(count){
		var zeros = "";
		if (this.length < count) {
			for(var i = 0; i < count - this.length; i++) zeros += "0";
		}
		return zeros + this;
	},
	toQuota : function(){
		return this.replace(/"/g, "&#34;").replace(/'/g, "&#39;");	
	},
	getExt	: function(){
		return (this.indexOf(".") < 0) ? "" : this.substring(this.lastIndexOf(".") + 1, this.length);	
	},
	getOnlyURL : function(){
		var arr = this.split("?");
		arr = arr[0].split("#");
		return arr[0];
	},
	removeRegExp : function(pattern){
		var retStr = ""
		for(var i = 0; i < this.length; i++) {
			if((/([\$\(\)\*\+\.\[\]\?\\\^\{\}\|]{1})/).test(this.charAt(i))) {
				retStr += this.charAt(i).replace((/([\$\(\)\*\+\.\[\]\?\\\^\{\}\|]{1})/), "\\$1");
			} else {
				retStr += this.charAt(i);
			}
		}
		return (pattern == null) ? this : eval("this.replace(/[" + retStr + "]/g, \"\")");
	},
	isLength : function(){
		var min = arguments[0] ? arguments[0] : 0 ;
		var max = arguments[1] ? arguments[1] : null;
		var isOK = true;
		if(this.length < min) isOK = false;
		if(max && this.length > max) isOK = false;
		return isOK;
	},
	isByteLength : function(){
		var min = arguments[0] ? arguments[0] : 0 ;
		var max = arguments[1] ? arguments[1] : null;
		var isOK = true;
		if(this.getByteSize() < min) isOK = false;
		if(max && this.getByteSize() > max) isOK = false;
		return isOK;
	},
	isNumber : function(){
		return (/^[0-9]+$/).test(this.removeRegExp(arguments[0])) ? true : false;	
	},
	isFloat : function(){
		return (/^[0-9.]+$/).test(this.removeRegExp(arguments[0])) ? true : false;	
	},
	isAlphabet : function(){
		return (/^[a-zA-Z]+$/).test(this.removeRegExp(arguments[0])) ? true : false;
	},
	isAlphabetNumber : function(){
		return (/^[0-9a-zA-Z]+$/).test(this.removeRegExp(arguments[0])) ? true : false;	
	},
	isID : function(){
		return (/^[a-z]{1}[0-9a-z]+$/).test(this.removeRegExp(arguments[0])) ? true : false;	
	},
	isKorean : function(){
		return (/^[°¡-ÆR]+$/).test(this.remove(arguments[0])) ? true : false;
	},
	isJumin : function(){
		var arg = arguments[0] ? arguments[0] : "";
		var jumin = eval("this.match(/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}" + arg + "[1234]{1}[0-9]{6}$/)");
		if(jumin == null)
			return false;
		else
			jumin = jumin.toString().getOnlyNumber().toString();
	
		var birthYY = (parseInt(jumin.charAt(6)) == (1 ||2)) ? "19" : "20";
		birthYY += jumin.substr(0, 2);
		var birthMM = jumin.substr(2, 2) - 1;
		var birthDD = jumin.substr(4, 2);
		var birthDay = new Date(birthYY, birthMM, birthDD);
		if(birthDay.getYear() % 100 != jumin.substr(0,2) || birthDay.getMonth() != birthMM || birthDay.getDate() != birthDD) return false;
		var sum = 0;
		var num = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]
		var last = parseInt(jumin.charAt(12));
		for(var i = 0; i < 12; i++) sum += parseInt(jumin.charAt(i)) * num[i];
		return ((11 - sum % 11) % 10 == last) ? true : false;
	},
	isForeign : function(){
		var arg = arguments[0] ? arguments[0] : "";
		var jumin = eval("this.match(/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}" + arg + "[5678]{1}[0-9]{1}[02468]{1}[0-9]{2}[6789]{1}[0-9]{1}$/)");
		if(jumin == null)
			return false;
		else
			jumin = jumin.toString().getOnlyNumber().toString();
	
		var birthYY = (parseInt(jumin.charAt(6)) == (5 || 6)) ? "19" : "20";
		birthYY += jumin.substr(0, 2);
		var birthMM = jumin.substr(2, 2) - 1;
		var birthDD = jumin.substr(4, 2);
		var birthDay = new Date(birthYY, birthMM, birthDD);
		if(birthDay.getYear() % 100 != jumin.substr(0,2) || birthDay.getMonth() != birthMM || birthDay.getDate() != birthDD) return false;
		if((parseInt(jumin.charAt(7)) * 10 + parseInt(jumin.charAt(8))) % 2 != 0) return false;
		var sum = 0;
		var num = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]
		var last = parseInt(jumin.charAt(12));
		for(var i = 0; i < 12; i++) sum += parseInt(jumin.charAt(i)) * num[i];
		return (((11 - sum % 11) % 10) + 2 == last) ? true : false;		
	},
	isRegistrationNumber : function(){
		var arg = arguments[0] ? arguments[0] : "";
		var registrationnumber = eval("this.match(/[0-9]{3}" + arg + "[0-9]{2}" + arg + "[0-9]{5}$/)");
		if(registrationnumber == null) {
			return false;
		} else {
			registrationnumber = registrationnumber.toString().getOnlyNumber().toString();
		}
		var sum = parseInt(registrationnumber.charAt(0));
		var num = [0, 3, 7, 1, 3, 7, 1, 3];
		for(var i = 1; i < 8; i++) sum += (parseInt(registrationnumber.charAt(i)) * num[i]) % 10;
		sum += Math.floor(parseInt(parseInt(registrationnumber.charAt(8))) * 5 / 10);
		sum += (parseInt(registrationnumber.charAt(8)) * 5) % 10 + parseInt(registrationnumber.charAt(9));
		return (sum % 10 == 0) ? true : false;
	},
	isCorpNumber : function(){
		var arg = arguments[0] ? arguments[0] : "";
		var corpnum = eval("this.match(/[0-9]{6}" + arg + "[0-9]{7}$/)");
		if(corpnum == null) {
			return false;
		} else {
			corpnum = corpnum.toString().getOnlyNumber().toString();
		}
		var sum = 0;
		var num = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
		var last = parseInt(corpnum.charAt(12));
		for(var i = 0; i < 12; i++) sum += parseInt(corpnum.charAt(i)) * num[i];
		return ((10 - sum % 10) % 10 == last) ? true : false;		
	},
	isEmail : function(){
		return (/\w+([-+.]\w+)*@\w+([-.]\w+)*\.[a-zA-Z]{2,4}$/).test(this.trim());	
	},
	isPhoneNumber : function(){
		var arg = arguments[0] ? arguments[0] : "";
		return eval("(/(02|070|0502|0505|0506|0[3-6]{1}[1-5]{1})" + arg + "[1-9]{1}[0-9]{2,3}" + arg + "[0-9]{4}$/).test(this)");
	},
	isMobileNumber : function(){
		var arg = arguments[0] ? arguments[0] : "";
		return eval("(/01[016789]" + arg + "[1-9]{1}[0-9]{2,3}" + arg + "[0-9]{4}$/).test(this)");
	},
	isURL : function(){
		return (/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/).test(this.trim());	
	},
	isDate : function(){
		var regstr = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/;
		var now = new Date();
		var nowYear = now.getFullYear();
		var minYear = nowYear - 100;
		var maxYear = nowYear + 10;
		var matchArr = this.match(regstr);
		if ( matchArr == null || matchArr[1] == null || matchArr[3] == null || matchArr[5] == null ){
			return false;
		}
		else{
			var year = matchArr[1];
			var month = matchArr[3];
			var day = matchArr[5];
			if ( year < minYear || year > maxYear || month < 1 || month > 12 || day < 1 || day > 31 || (( month==4 || month==6 || month==9 || month==11 ) && day == 31 ) ){
				return false;
			}
			else{
				if ( month == 2 ){
					var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
					if ( day > 29 || ( day == 29 && !isleap ) ){
						return false;
					}
				}
			}				
		}
		return true;
	}
});

