/**
 * Form Process
 * @author oneorzero, sunny
 * @version 1.0
 * @since 1.0
 * @copyright Copyright (c), Godosoft
 */

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };
Array.prototype.in_array = function(needle)
{
	for (i = 0; i < this.length; i++) {
		if (this[i] == needle) return true;
	}
	return false;
};


(function($) {
	/**
	 * Form submit process
	 * @param string msgType 메시지 처리타입(msg / warn / alert)
	 * @param object validData Element 검증조건
	 * @param string finalFailMsgType 최종실패메시지 처리타입(warn / alert)
	 * @param bool finalIngMsg 최종메시지 출력여부
	 * @param bool selfBlockTarget Block 타겟
	 */
	$.fn.formProcess = function(msgType,validData,finalFailMsgType,finalIngMsg,selfBlockTarget)
	{
		finalFailMsgType = (finalFailMsgType == null ? 'warn' : finalFailMsgType);
		finalIngMsg = (finalIngMsg == null ? true : finalIngMsg);
		selfBlockTarget = (selfBlockTarget == null ? false : selfBlockTarget);

		var thisForm = $(this);
		if (!thisForm.is('form')) {return;}
		if (thisForm.attr('target') == '') {
			thisForm.attr('target','ifrmProcess');
		}
		thisForm.unbind("submit");

		// 실패사유 출력
		var msgPrint = function(msg, eleId) {
			if (msgType == 'msg') {
				$('#'+eleId).css('display','inline-block');
				$('#'+eleId).css('margin','3px 0 0 3px');
				$('#'+eleId).text(msg);
			} else if (msgType == 'alert') {
				alert(msg);
			} else {
				$.warnUI('저장 실패', msg);
			}
		};

		TEXT_REQUIRED_INVALID	= '%s은(는) 필수 항목 입니다.';
		TEXT_LENGTH_INVALID		= '%s은(는) %s ~ %s 자로 입력하셔야 합니다.';
		TEXT_MAXLEN_INVALID		= '%s은(는) %s 자 이하로 입력하셔야 합니다.';
		TEXT_MINLEN_INVALID		= '%s은(는) %s 자 이상으로 입력하셔야 합니다.';
		TEXT_NUMBER_INVALID		= '%s은(는) 숫자형식에 맞지 않습니다.';
		TEXT_PASSWORD_INVALID	= '%s은(는) 비밀번호형식에 맞지 않습니다.(영문 대소문자,숫자,특수문자 사용)';
		TEXT_PATTERN_INVALID	= '%s은(는) 형식에 맞지 않습니다.';
		TEXT_USERID_INVALID		= '%s은(는) 아이디형식에 맞지 않습니다.(영문 소문자,숫자,특수기호(_)만 사용)';

		// 검증
		var eventValid = function(obj)
		{
			var tmp = obj.data('vaildData');
			var value = obj.val().trim();

			// 검증전 콜백
			if (tmp.before) {
				if (tmp.before(obj, msgPrint) === true) {
					return true;
				}
			}
			// 필수 검증
			if (tmp.required) {
				var isRequired = true;
				if (['radio','checkbox'].in_array(obj.attr('type'))) {
					if ($('[name='+obj.attr('name')+']:checked').length == 0) {
						isRequired = false;
					}
				} else if (value == '') {
					isRequired = false;
				}
				if (isRequired === false) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.requiredMsg == undefined || tmp.requiredMsg == '') {
						msg = TEXT_REQUIRED_INVALID.replace(/%s/, tmp.name);
					} else {
						msg = tmp.requiredMsg;
					}

					msgPrint(msg, tmp.msgId);
					return false;
				}
			}
			// 문자열 최소/최대길이 검증
			if (tmp.minlen && tmp.maxlen && value != '') {
				if (tmp.minlen > value.length || tmp.maxlen < value.length) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.lengthMsg == undefined || tmp.lengthMsg == '') {
						if (tmp.minlen != tmp.maxlen) {
							msg = TEXT_LENGTH_INVALID.replace(/%s/, tmp.name).replace(/%s/, tmp.minlen).replace(/%s/, tmp.maxlen);
						} else {
							msg = TEXT_LENGTH_INVALID.replace(/%s/, tmp.name).replace(/%s ~ %s/, tmp.minlen);
						}
					} else {
						msg = tmp.lengthMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			} else if (tmp.minlen && value != '') {
				if (tmp.minlen > value.length) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.lengthMsg == undefined || tmp.lengthMsg == '') {
						msg = TEXT_MINLEN_INVALID.replace(/%s/, tmp.name).replace(/%s/, tmp.minlen);
					} else {
						msg = tmp.lengthMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			} else if (tmp.maxlen && value != '') {
				if (tmp.maxlen < value.length) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.lengthMsg == undefined || tmp.lengthMsg == '') {
						msg = TEXT_MAXLEN_INVALID.replace(/%s/, tmp.name).replace(/%s/, tmp.maxlen);
					} else {
						msg = tmp.lengthMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			}
			// 숫자 검증
			if (tmp.number && value != '') {
				if (!/^[0-9]*$/.test(value)) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.patternMsg == undefined || tmp.patternMsg == '') {
						msg = TEXT_NUMBER_INVALID.replace(/%s/, tmp.name);
					} else {
						msg = tmp.patternMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			}
			// 패턴 검증
			if (tmp.pattern && value != '') {
				if (!tmp.pattern.test(value)) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.patternMsg == undefined || tmp.patternMsg == '') {
						msg = TEXT_PATTERN_INVALID.replace(/%s/, tmp.name);
					} else {
						msg = tmp.patternMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			}
			// 비밀번호 검증 (영문 대소문자,숫자,특수문자 사용)
			if (tmp.password && value != '') {
				if (!/^\S.*$/.test(value)) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.passwordMsg == undefined || tmp.passwordMsg == '') {
						msg = TEXT_PASSWORD_INVALID.replace(/%s/, tmp.name);
					} else {
						msg = tmp.passwordMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			}
			// 아이디 검증 (영문 소문자,숫자,특수기호(_)만 사용)
			if (tmp.userid && value != '') {
				if (!/^[a-z0-9_].*$/.test(value)) {
					if (msgType != 'msg') {
						obj.focus();
					}
					if (tmp.useridMsg == undefined || tmp.useridMsg == '') {
						msg = TEXT_USERID_INVALID.replace(/%s/, tmp.name);
					} else {
						msg = tmp.useridMsg;
					}
					msgPrint(msg, tmp.msgId);
					return false;
				}
			}

			// 메시지공간 초기화
			if (tmp.msgId) {
				$('#'+tmp.msgId).text('');
				$('#'+tmp.msgId).hide();
			}

			// 검증후 콜백
			if (tmp.callback) {
				if (tmp.callback(obj, msgPrint) !== true) {
					return false;
				}
			}

			return true;
		};

		// Element Object Validation 정의
		var i,length;
		if (validData != null) {
			length = validData.length;
		}
		var arInput = [];
		var arBefore = [];
		var arCallback = [];
		for (i = 0; i < length; i++) {
			if (validData[i].inputName && $('[name='+validData[i].inputName+']').length > 0) {
				arInput.push(thisForm.find('[name='+validData[i].inputName+']').data('vaildData',validData[i]));
			} else if (validData[i].inputName == null) {
				if (validData[i].before) {
					arBefore.push(validData[i].before);
				}
				if (validData[i].callback) {
					arCallback.push(validData[i].callback);
				}
			}
		}

		// Submit Checking
		thisForm.submit(function()
		{
			var result = true;
			var callbackResult;

			// 검증전 콜백
			length = arBefore.length;
			for (i = 0; i < length; i++) {
				if (arBefore[i]($(this)) !== true) {
					result = false;
					break;
				}
			}

			// Element 검증
			if (result) {
				length = arInput.length;
				if (msgType == 'msg') {
					for (i = 0; i < length; i++) {
						if (!eventValid(arInput[i])) {
							result = false; //alert(arInput[i].attr('name'));
						}
						if (['radio','checkbox'].in_array(arInput[i].attr('type'))) {
							arInput[i].click(function(e){
								eventValid($(this));
							});
						} else if (arInput[i].attr('type') == 'select-one') {
							arInput[i].change(function(e){
								eventValid($(this));
							});

						} else if (['text','password'].in_array(arInput[i].attr('type'))) {
							arInput[i].keyup(function(e){
								eventValid($(this));
							});
						}
					}
				} else {
					for (i = 0; i < length; i++) {
						if (!eventValid(arInput[i])) {
							result = false;
							break;
						}
					}
				}
			}

			// 검증후 콜백
			length = arCallback.length;
			for (i = 0; i < length; i++) {
				if (arCallback[i]($(this), result) !== true) {
					result = false;
					break;
				}
			}

			// 최종 경고 메시지 출력
			if (!result && finalFailMsgType == 'warn') {
				$.warnUI('저장 실패', '입력한 내용이 올바르지 않습니다');
			} else if (!result && finalFailMsgType == 'alert') {
				alert('[저장 실패]'+"\n"+'입력한 내용이 올바르지 않습니다');
			}

			// 처리중 메시지 출력
			if (result && finalIngMsg === true) {
				var $m = $('<div class="warnUI"></div>');
				var $ml = $('<div class="warnUI_Left"></div>');
				var $mr = $('<div class="warnUI_Right"></div>');
				var $mc = $('<div class="warnUI_Center"></div>');
				$mc.html('<h2 style="padding-top:50px;">처리중</h2>');
				$mr.append($mc);
				$ml.append($mr);
				$m.append($ml);

				var opt = {message: $m,css: { 'border-width': '0','background':'transparent' }};
				if (selfBlockTarget === true) {
					$(this).block(opt);
				} else {
					$.blockUI(opt);
				}
			}
			return result;
		});
	};
})(jQuery);
