/**
 * TLD ¾øÀÌ ÀÔ·ÂÇßÀ» ¶§: Validator.check('example', 'com')
 * TLD °°ÀÌ ÀÔ·ÂÇßÀ» ¶§: Validator.check('example.com')
 *
 * @return µî·Ï °¡´ÉÇÑ µµ¸ÞÀÎ (ex, example.com)
 *         Ã¼Å© ½ÇÆÐÇÑ ¿¡·¯¸Þ½ÃÁö°¡ ÇÊ¿äÇÏ¸é Validator.errmsg¸¦ »ç¿ë.
 */
var Validator = 
{
	errmsg: '',
	
	_check_default: function(input, tld) {
		var pattern_special_chars = /[~!@\#$%<>^&*\()=+_\'\";\?\|\\{}\[\]\/]/gi;
		if (pattern_special_chars.test(input)) {
			this.errmsg = "Æ¯¼ö¹®ÀÚ´Â »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.";
			return false;
		}

		if (input.charAt(0) == '.') {
			this.errmsg = "µµ¸ÞÀÎ¸íÀº '.'À¸·Î ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù.";
			return false;
		}
		
		if (input.charAt(0) == '-') {
			this.errmsg = "µµ¸ÞÀÎ¸íÀº '-'À¸·Î ½ÃÀÛÇÒ ¼ö ¾ø½À´Ï´Ù.";
			return false;
		}
		
		if (input.charAt(input.length - 1) == '.') {
			this.errmsg = "µµ¸ÞÀÎ¸íÀº '.'À¸·Î ³¡³¯ ¼ö ¾ø½À´Ï´Ù.";
			return false;
		}
		
		if (input.charAt(input.length - 1) == '-') {
			this.errmsg = "µµ¸ÞÀÎ¸íÀº '-'À¸·Î ³¡³¯ ¼ö ¾ø½À´Ï´Ù.";
			return false;
		}

        if (input.charAt(2) == '-' && input.charAt(3) == '-') {
            this.errmsg = "µµ¸ÞÀÎ¸íÀÇ 3, 4¹øÂ° '-'À» ¿¬¼ÓÀ¸·Î »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.";
            return false;
        }
	
		var pattern_available = /^[°¡-ÆRa-zA-Z0-9\-.]+$/i;
		if (!pattern_available.test(input)) {
			this.errmsg = "µµ¸ÞÀÎ Çü½Ä¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù.";
			return false;
		}

		// µî·Ï °¡´É µµ¸ÞÀÎµé
		var avail_regist = ['com', 'net', 'org',  'kr', 'biz', 'info', 'name', 'cc', 'tv', 'tel', 'asia',
							 'co', 'vc', 'so', 'ch', 'es', 'tm', 'eu', 'cn', 'seoul.kr', 'busan.kr', 'daegu.kr', 'incheon.kr', 'gwangju.kr',
							 'daejeon.kr', 'ulsan.kr', 'gyeonggi.kr', 'gangwon.kr', 'chungbuk.kr', 'chungnam.kr', 'jeonbuk.kr', 'jeonnam.kr',
							 'gyeongbuk.kr', 'gyeongnam.kr', 'jeju.kr', 'co.kr', 'ne.kr', 'or.kr', 'pe.kr', 'ac.kr', 'go.kr', 're.kr',
							 'hs.kr', 'ms.kr', 'es.kr', 'sc.kr', 'kg.kr', 'in', 'jp', 'us', 'de', 'ag', 'at', 'la', 'sh', 'am', 'be', 'pl',
							 'bz', 'fm', 'gs', 'io', 'md', 'ms', 'nu', 'sc', 'sg', 'tc', 'tk', 'tw', 'vg', 'ws', 'ac', 'mobi', 'jobs', 'travel',
							 'cx', 'cz', 'gd', 'hk', 'hn', 'ki', 'lc', 'li', 'mn', 'mu', 'nf', 'fr', 'ph', 'pk', 'lu', 'im', 'ae', 'ht', 'lt',
							 'mg', 'pe', 'si', 'sk', 'uz', 'af', 'gl', 'me', 'tl',
							 'co.in', 'net.in', 'org.in', 'firm.in', 'gen.in', 'ind.in',
							 'com.cn', 'net.cn', 'org.cn', 'com.tw', 'org.tw', 'club.tw', 'ebiz.tw', 'game.tw', 'idv.tw',
							 'com.ph', 'net.ph', 'org.ph', 'com.pk', 'net.pk', 'org.pk', 'co.uz', 'com.uz', 'org.uz', 'com.sg',
							 'com.af', 'net.af', 'org.af', 'com.mx', 'com.ag', 'net.ag', 'org.ag', 'co.gl', 'com.gl', 'edu.gl', 'net.gl', 'org.gl',
							 'com.hn', 'net.hn', 'org.hn', 'com.ht', 'net.ht', 'org.ht', 'com.lc', 'net.lc', 'org.lc', 'com.vc', 'net.vc', 'org.vc',
							 'co.uk', 'me.uk', 'org.uk', 'com.es', 'nom.es', 'org.es', 'com.pl', 'net.pl', 'org.pl', 'biz.pl', 'info.pl',
							 'co.cm', 'com.cm', 'net.cm', 'com.mu', 'net.mu', 'org.mu', 'com.sc', 'net.sc', 'org.sc', 'co.za',
							 'co.nz', 'net.nz', 'org.nz', 'com.ki', 'net.ki', 'org.ki', 'com.nf', 'net.nf', 'com.sb', 'net.sb', 'org.sb', 'Å°¿öµå'];

		if ($.inArray(tld, avail_regist) == -1) {
			this.errmsg = "°Ë»ö °¡´ÉÇÑ µµ¸ÞÀÎÀÌ ¾Æ´Õ´Ï´Ù.";
			return false;
		}

		// ÇÑ±Û °¡´É µµ¸ÞÀÎµé
		var avail_korean = ['Å°¿öµå', 'com', 'net', 'org',  'kr', 'biz', 'info', 'name', 'cc', 'tv', 'tel', 'asia'];
		if (/[^a-zA-Z0-9\-.]/.test(input) && $.inArray(tld, avail_korean) == -1) {
			this.errmsg = "ÇÑ±Û µµ¸ÞÀÎÀº com, net, org, ÇÑ±¹, kr, biz, info, name, cc, tv, tel, asia¸¸ µî·Ï °¡´ÉÇÕ´Ï´Ù.";
			return false;
		}

		return true;
	},

	_check_length: function(min, max, input, tld) {
		if (input.length < min) {
			this.errmsg = tld + " µµ¸ÞÀÎÀº ÃÖ¼Ò " + min + "ÀÚ ÀÌ»óÀÌ¾î¾ß ÇÕ´Ï´Ù.";
			return false;
		}
		if (input.length > max) {
			this.errmsg = tld + " µµ¸ÞÀÎÀº ÃÖ´ë " + max + "ÀÚ ÀÌÇÏ¿©¾ß ÇÕ´Ï´Ù.";
			return false;
		}
		return true;
	},

	check: function(input, tld) {
		tld = typeof tld == 'undefined' ? false : tld;
		this.errmsg = '';
		input = $.trim(input).toLowerCase();
	
		if (input.length == 0) {
			this.errmsg = "°Ë»öÇÒ µµ¸ÞÀÎÀ» ÀÔ·ÂÇØÁÖ¼¼¿ä.";
			return false;
		}

		if (!tld) {
			var arr = input.split('.');
			if (arr.length > 2) {
				input = '';
				for (var i = 0; i < arr.length - 2; i++) {
					input += arr[i] + '.';
				}
				input = input.substr(0, input.length - 1);
				if (input.indexOf(".") != -1) {
					this.errmsg = "µµ¸ÞÀÎ¸í¿¡ '.'À» µÎ ¹ø ÀÌ»ó »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.";
					return false;
				}
				tld  = arr[arr.length - 2] + '.' + arr[arr.length - 1];
			} else {
				input = arr[0];
				tld   = arr[1];
			}
		}

		if (!this._check_default(input, tld))
			return false;
		
		if (!this._check_per_tld(input, tld))
			return false;

		if (tld == 'Å°¿öµå')
			return input;
		else
			return (input + '.' + tld);
	},


	//  XXX: Æ¯º°ÇÑ tldº° Ã¼Å©°¡ ÀÖÀ¸¸é ¿©±â´Ù ³ÖÀ¸¸é µÊ.
	_check_per_tld: function(input, tld) {
		switch (tld) {
/*
		case 'ÇÑ±¹':
			if (!this._check_length(1, 17, input, tld)) return false;
			break;
*/
		case 'kr': case 'seoul.kr': case 'busan.kr': case 'daegu.kr': case 'incheon.kr':
		case 'gwangju.kr': case 'daejeon.kr': case 'ulsan.kr': case 'gyeonggi.kr':
		case 'gangwon.kr': case 'chungbuk.kr': case 'chungnam.kr': case 'jeonbuk.kr':
		case 'jeonnam.kr': case 'gyeongbuk.kr': case 'gyeongnam.kr': case 'jeju.kr':
		case 'co.kr': case 'ne.kr': case 'or.kr': case 'pe.kr': case 'ac.kr': case 'go.kr':
		case 're.kr': case 'hs.kr': case 'ms.kr': case 'es.kr': case 'sc.kr': case 'kg.kr':
			if (!this._check_length(2, 63, input, tld)) return false;
			break;
		case 'tel':
			// TODO: 2ÀÚ/¼ýÀÚ ÀÏ °æ¿ì ±æÀÌ Ã¼Å© ´Ù¸§...
			break;
		case 'tv':
			if (!this._check_length(4, 63, input, tld)) return false;
			break;
		case 'cn':
			this.errmsg = '½ÃÇà»çÀÇ µî·Ï½Ã½ºÅÛ º¯°æÀ¸·Î ½Å±Ôµî·Ï ÀÏ½ÃÁßÁö';
			return false;
		default:
			if (!this._check_length(3, 63, input, tld)) return false;
			break;
		}

		return true;
	}
}


