/* mini library - form */

var toggleBoxCheck = false;
var Cube = {};

Element.extend({
	/** 폼 값 설정
	 * @class Element
	 * @param
			$setting: Object. 값
	 * @description document.forms[formname].setValue({ formName : formValue });
	 */
	setValue: function (setting) {
		var type = '';
		var targetForm = '';
		var value = '';
		var i = 0;

		// 타입에 따른 값 적용하기
		function adoptValue (targetForm, value) {
			switch (targetForm.type) {
				case 'textarea':
				case 'text':
				case 'hidden':
					targetForm.value = value;
					break;

				case 'checkbox':
					if (targetForm.value == value) {
						targetForm.checked = true;
					}
					break;

				case 'select-one':
					for (i=targetForm.length-1; i>=0; i--) {
						if (targetForm[i].value == value) {
							targetForm[i].selected = true;
							break;
						}
					}
					break;

				case 'select-multiple':
					for (i=targetForm.options.length-1; i>=0; i--) {
						if (value.toString().match(new RegExp('\\['+targetForm.options[i].value+'\\]', ''))) {
							targetForm.options[i].selected = true;				
						}
					}
					break;

				default:
					if ($chk(targetForm.length)) {
						for (i=targetForm.length-1; i>=0; i--) {
							if (value.toString().match(/\[/)) {
								if (value.toString().match(new RegExp('\\[' + targetForm[i].value + '\\]', ''))) {
									targetForm[i].checked = true;
								}
								else {
									targetForm[i].checked = false;
								}
							}

							else {
								if (targetForm[i].value == value) {
									targetForm[i].checked = true;
									break;
								}
							}
						}
					}
					break;
			}

			// 이름에 따른 특수처리
			if ($chk(targetForm.name)) {
				switch (targetForm.name) {
					case 'license':
						if (value.toString().match(/^CCL/i)) {
							if (value.toString().match(/$/i) && $chk($('ccl01_0'))) $('ccl01_0').checked = true;
							if (value.toString().match(/\=/i) && $chk($('ccl02_0'))) $('ccl02_0').checked = true;
						}
						break;
				}
			}
		};
	
		if ($chk(setting) && $type(setting) == 'object') {
			for (var item in setting) {
				value = setting[item];
				type = '';
				if ($chk(value) && $type(value) == 'string') {
					value = value.toString().nl2br2('write');
					type = $type(value);
				}

		
				if (type == 'string' || type == 'number') {
					targetForm = this.elements[item];
					if (!$chk(targetForm)) {
						targetForm = this.elements[item + '[]'];
					}
					if ($chk(targetForm) && $type(targetForm) != 'string') {
						adoptValue(targetForm, value);
					}
									
				}
			}
		}
		
		// 폼에 직접 할 때
		else {
			adoptValue(this, setting);
		}		
	}, // END setValue
	
	/** 체크박스 일괄 체크
	 * @class Element 
	 * @param
			$mode: [!|on|off]
			$nameStart: 고를이름
	 */
	toggleBox: function (mode, nameStart) {
		toggleBoxCheck = toggleBoxCheck ? false : true;
		if (mode) toggleBoxCheck = (mode == 'off') ? false : true;
	
		if (this.isTag('form')) {
			for (var i=0; i<this.elements.length; i++) {
				if (this.elements[i].nodeName.toString().match(/input/i) && this.elements[i].type == 'checkbox') {
					if ($chk(this.elements[i].name) && this.elements[i].name.toString().match(new RegExp(($chk(nameStart) ? "^" + nameStart : "") + "\\[", "i"))) {
						this.elements[i].checked = toggleBoxCheck;
					}
				}
			}
		}
		
		else if (this.isTag('select') && this.type == 'select-multiple') {
			for (var j=0; j<this.options.length; j++) {
				this.options[j].selected = toggleBoxCheck;
			}
		}
	},


	/** 폼 입력 체크(_inc.php 의 check 함수와 연동)
	 * @class Element
	 * @param
			$setting: Object
	 * @return Boolean
	 */
	check: function (setting) {
		var item = '';
		var item2 = '';
		var value = '';
		var target = '';
		var targetValue = '';
		var name = '';
		var msg = '';
		var checkNumber = '';
		var checkSum = 0;
		var checkResult = 0;
		var size = 0;
		var tmp = '';
		var i = 0;

		if ($chk(setting) && $type(setting) == 'object') {

			// 폼 루프
			for (item in setting) {

				// 폼이 있을 떄
				if ($chk(this.elements[item]) && $type(this.elements[item]) != 'string') {
					target = this.elements[item];
					target = $(target);
					targetValue = target.getValue();

					name = $chk(target.name) ? target.name : target[0].name; 
					name = $chk(setting[item]['name']) ? setting[item]['name'] : name;
					  
					if (!$chk(setting[item]['is_not']) && !targetValue) {
						msg += '[' + name + '] 의 값을 입력해 주세요\n';
					}
					
					// 설정 루프
					if ($type(setting[item]) == 'object') {
						for (item2 in setting[item]) {
							
							value = setting[item][item2];
							size = (targetValue) ? targetValue.getLength() : 0;
						
							switch (item2) {
								case 'min':
									if (size < value) {
										msg += '[' + name + '] 의 최소 길이는 ' + value + 'bytes(영문 1byte, 한글 2byte) 이상 이어야 합니다. (현재 ' + size + 'bytes)\n';
									}
									break;

								case 'max':
									if (size > value) {
										msg += '[' + name + '] 의 최대 길이는 ' + value + 'bytes(영문 1byte, 한글 2byte) 이하 이어야 합니다. (현재 ' + size + 'bytes)\n';
									}							
									break;

								case 'type':
									switch (value) {
										case 'mail':
											if (!targetValue.toString().match(/[a-z0-9\.\-\_\+]+\@[a-z0-9\.\-\_]+/ig) || !targetValue.toString().match(/\@/i) || size < 5 || !targetValue.toString().match(/\./i)) {
												msg += '[' + name + '] 의 형식이 올바르지 않습니다\n';
											}
											break;
											
										case 'homepage':
											if (targetValue.toString().match(/[ \t\n\r]/i)) {
												msg += '[' + name + '] 의 형식이 올바르지 않습니다\n';
											}
											break;
											
										case 'jumin':
											targetValue = targetValue.toString().replace(/\-/g, '');
											size = targetValue.getLength();
											if (size != 13 || targetValue.toString().match(/[^0-9]/ig)) {
												msg += '[' + name + '] 의 형식이 올바르지 않습니다\n';
											}
											
											checkSum = 0;
											checkNumber = '234567892345';
											
											for (i=0; i<12; i++) {
												checkSum += parseInt(targetValue.charAt(i)) * parseInt(checkNumber.charAt(i)); 
											}
											
											checkResult = (11 - (checkSum % 11)) % 10;
											if (checkResult != targetValue.charAt(12)) {
												msg += '[' + name + '] 가 유효하지 않습니다\n';
											}
											break;
											
										case 'co_num':
											targetValue = targetValue.toString().replace(/\-/g, '');
											size = targetValue.getLength();
											if (size != 10 || targetValue.toString().match(/[^0-9]/ig)) {
												msg += '[' + name + '] 의 형식이 올바르지 않습니다\n';
											}

											checkSum = 0;
											checkNumber = '137137135';
											for (i=0; i<9; i++) {
												checkSum += parseInt(targetValue.charAt(i)) * parseInt(checkNumber.charAt(i)); 
											}

											checkSum += ((parseInt(targetValue.charAt(8)) * 5) / 10);
											checkSum = Math.floor(checkSum);
											checkResult = (checkSum % 10 != 0) ? (10 - checkSum % 10) % 10 : 0;
											if (checkResult != parseInt(targetValue.charAt(9))){ 
												msg += '[' + name + '] 가 유효하지 않습니다\n';
											}
											break;
											
										case 'cp':
											targetValue = targetValue.toString().replace(/\-/g, '');
											size = targetValue.getLength();
											
											if (targetValue) {
												if (size != 10 && size != 11) {
													msg += '[' + name + '] 는 10자리 혹은 11자리만 가능합니다\n';
												}
												
												switch (targetValue.toString().substring(0,3)) {
													case '010':
													case '011':
													case '016':
													case '017':
													case '018':
													case '019':
														break;
		
													default:
														msg += '[' + name + '] 의 앞번호가 올바르지 않습니다\n';
												}
											}
											break;
											
										case 'id':
											if (targetValue.toString().match(/[^0-9a-z\_]/ig)) {
												msg += '[' + name + '] 형식은 숫자, 영어, 언더바(_)만 허용 합니다\n';
											}
											break;
											
										case 'pass':
											if (targetValue.toString().match(/[^0-9a-z\!\@\#\$\%\^\&\*\(\)\_\+\-\=\[\]\;\,\.\/\{\}\:\<\>\?]/ig)) {
												msg += '[' + name + '] 형식은 숫자, 영어, 기호(묶음제외)만 허용 합니다\n';
											}
											break;
											
										case 'num':
											if (targetValue.toString().match(/[^0-9\-]/ig)) {
												msg += '[' + name + '] 형식은 숫자만 허용 합니다\n';
											}
											break;
											
										case 'regexp':
											if ($chk(setting[item]['regexp']) && $type(setting[item]['regexp']) == 'regexp') {
												if (targetValue.toString().match(setting[item]['regexp'])) {
													msg += '[' + name + '] 형식이 올바르지 않습니다\n';
												}
											}
											else {
												msg += 'RegExp 형식 체크에 정규식이 없습니다';
											}
											break;
									}
									break;
							}
						} // END for
					} // END if 설정사항이 있을 때
				} // END 폼이 있을 떄
			} // END for 항목 루프

			// 결과 출력
			if (msg) {
				error(msg.nl2br());
				return false;
			}
			else {
				return true;
			}
		} // END if

		return false;
	}, // END check

	/** 폼 사전 세팅
	 * @class Element
	 * @param
			$submitAction: 폼 전송 함수. 없으면 기본 submitAction으로
	 */
	setForm: function (submitAction) {
		this.addEvent('submit', function (e) {
			new Event(e).stop();
			var check = 1;

			// opera, safari 용 enter 방지
			if (!isEnter) {
				if ($chk(submitAction)) {
					submitAction.bind(this).attempt();
				}
				else {
					this.submitAction();
				}
			}
		});
	},


	/** ajax 중복체크
	 * @class Element
	 * @param
			$mode: 모드명
	 * @return 
	 */
	ajaxCheck: function (mode) {
		var Obj = this;
		if (!mode) mode = '';

		Obj.addEvent('blur', function () {
			var check = 1;			
			if (this.name == 'jumin') {
				if (this.value && !$(this.form).check({ jumin: { name:'주민등록번호', type:'jumin' }}))
					check = 0;
			}
			
			if (this.name == 'co_num') {
				if (this.value && !$(this.form).check({ co_num: { name:'사업자등록번호', type:'co_num' }}))
					check = 0;
			}			
			
			if (check) {
				var tmp_id = '';
				var tmp_group = '';
				try { tmp_id = id; } catch (e) {}
				try { tmp_group = group; } catch (e) {}

				if (Obj.value)
				ajaxForm({
					'url': miniDir + 'ajax.php',
					'onError': function (data) {
						error(data['msg'], { 
							target: Obj,
							className: 'iiAjaxCheck',
							opacity: 0.7
						});
						Obj.focus();
					},
					'onComplete': function (data) {
						error(data['msg'], {
							target: Obj,
							styles: {
								backgroundColor: '#32CD32'
							},
							className: 'iiAjaxCheck',
							opacity: 0.7
						});
					},
					'onFailure': function () {
					},
					'values': {
						'mode': mode + Obj.name,
						'value': Obj.value,
						'id': tmp_id,
						'group': tmp_group
					}
				}); // END ajaxForm
			} // END if check
		}); // END event
	},


	/** 메일 설정
	 * @class Element
	 */
	setMail: function () {
		this.ajax({
			url: miniDir + 'ajax.php',
			mode: 'mail',
			width: '200px',
			height: '150px',
			
			funcList: function (data) {
				return '@' + data;
			},
			
			funcClick: function (data) {
				this.focus();
				this.value = this.value.toString().replace(/\@.*$/i, '@' + data);
			}
		});
	},


	/** 주소 설정
	 * @class Element
	 * @param
			$Obj: zipcode Element
	 */
	setAddress: function (Obj) {
		if (!$chk(use_not_address)) {
			this.ajax({
				url: miniDir + 'ajax.php',
				mode: 'address',
				width: '400px',
				height: '150px',
				
				funcList: function (data) {
					return '[' + data['zipcode'] + '] ' + data['address'];
				},
				
				funcClick: function (data) {
					if ($chk(Obj)) {
						Obj.value = data['zipcode'];
					}

					this.focus();
					this.value = data['address'];
				}
			});
		}
	},


	/** 메신져 설정
	 * @class Element
	 */
	setChat: function () {
		this.ajax({
			url: miniDir + 'ajax.php',
			mode: 'chat',
			width: '160px',
			height: '150px',
			
			funcList: function (data) {
				return data;
			},
			
			funcClick: function (data) {
				this.focus();
				this.value = data;
			}
		});
	},


	/** 암호화
	 * @class Element
	 * @param
			$pattern: 암호화 종류
	 * @return String
	 */
	secure: function (pattern) {
		var val = '';
		if (this.value !== '') {
			switch (pattern) {
				case 'md5':
					val = hex_md5(this.value);
					break;
				case 'sha1':
					val = hex_sha1(this.value);
					break;				
				case 'mixed':
					val = hex_sha1(hex_md5(this.value));
					break;
				default:
					val = this.value;
			}
		}
				
		return val;
	},
	
	
	/** 로그인 암호화
	 * @class Element
	 * @param
			$pattern: 암호화 종류
	 * @return String
	 */
	secureLogin: function (pattern) {
		var val = '';
		if (this.value !== '') {
			switch (pattern) {
				case 'md5':
					val = hex_md5(this.value);
					break;
				case 'sha1':
					val = hex_sha1(this.value);
					break;				
				case 'mixed':
					val = hex_sha1(hex_md5(this.value));
					break;
				default:
					val = this.value;
			}
		}
		
		return val;
	},


	/** Cube 사용설정
	 * @class Element 
	 * @param
			$submitAction: function. url모드일 때 submitAction
	 */
	setCube: function (submitAction) {
		var cubeDiv = $('cubeDiv');
		var check = 0;
		if ($chk(cubeDiv)) {
			Cube.Obj = this;

			if ($chk(this.nodeName) && this.nodeName.toString().match(/form/i)) {
				Cube.mode = 'form';
				Cube.onComplete = this.submitAction.bind(this);
				if (this.elements['mode'].value != 'modify' && (!$chk(this.elements['cube']) || !this.elements['cube'].value)) {
					check = 1;
				}
			}

			else {
				Cube.mode = 'url';
				Cube.onComplete = submitAction;
				if (!$chk(Cube.value) || Cube.value) {
					check = 1;
				}
			}

			if (check) {
				cubeDiv.toggle('show');
				var size = cubeDiv.getSize().size;
				cubeDiv.toggle('hide');

				iiPopup.init({ mode: 'div', target: cubeDiv.clone(), width: size.x, height: size.y + 16 });
				error('키워드에 맞는 이미지를 선택해 주세요');
				return false;
			}
		}

		return true;
	} // END function
});


/** 폼 잇기(포커스 자동이동)
 * @class mini
 * @param
		$frm: 첫번째 폼 Element
		$nfrm: 두번째 폼 Element
 */
function setAutoFocus(frm, nfrm) {
	$(frm).addEvent('keyup', function (e) {
		var event = setEvent(e);
		if(this.value.length == this.maxLength && ((event.code >= 48 && event.code <= 57) || (event.code >= 96 && event.code <= 105))) nfrm.focus();
	});
}; // END function


/** textarea 크기조절 설정
 * @class mini
 */
function setTextarea() {
	$$('textarea').each(function (item) {
		if (!item.name.toString().match(/sms/i)) {
			var hand = new Element('DIV', { 'title': '더블클릭하면 원래크기로 돌아갑니다' }).setStyles({
				'background': '#efefef url("' + miniDir + 'admin/image/n-resize.gif") no-repeat center',
				'fontSize': 0,
				'height': '7px',
				'width': item.getStyle('width'),
				'cursor': 'n-resize'
			}).addEvent('dblclick', function () {
				item.setStyle('height', '80px');
			}).injectAfter(item);
			
			item.makeResizable({
				handle: hand,
				modifiers: {x: false, y: 'height'},
				limit: {y: [80, 1000]}
			});
		}
	});
}; // END function


/** SMS textarea 설정
 * @class mini
 * @param
		$Obj: textarea Element
 */
function setSMS (Obj) {
	Obj.addEvent('keydown', function (e) {
		var event = setEvent(e);

		if (event.key != 'left' && event.key != 'right' && event.key != 'up' && event.key != 'down' && event.key != 'backspace' && event.key != 'delete' &&  this.value.toString().getLength() >= 80) {
			error('80bytes(한글 40자) 만 입력하실 수 있습니다.');
			Obj.blur();
			Obj.focus();
			return false;
		}
	});	
}; // END function


/**
 * 큐브 선택
 * @class mini
 * @param
		$cube: 큐브값
 */
function cubeSel(val) {
	if (Cube.mode == 'form') {
		if (!$chk(Cube.Obj.elements['cube'])) {
			new Element('INPUT', {
				'type': 'hidden',
				'name': 'cube'
			}).inject(Cube.Obj);
		}

		Cube.Obj.elements['cube'].value = val;
		iiPopup.close();
		Cube.onComplete();
	}

	else if (Cube.mode == 'url') {
		Cube.value = val;
		iiPopup.close();
		Cube.onComplete.attempt([], Cube);
		
	}


}; // END function


/**
 * ajax 폼 전송
 * @class ii.form
 * @param
		-url: url모드시 주소를 입력한다
		-Obj: form모드시 폼 Obj
		-action: form모드시 폼 action
		-target: form모드시 폼 target
		-values: url모드시 parameter를 object 방식으로 입력한다
		-method: 전송 method
		-json: 성공시 데이터를 json 처리할지 여부 [0|1!]
		-loading: 로딩 이미지 사용 여부 [0|1!]
		-form: 폼 hide 여부 [0|1!]
		-onRequest: function. ajax전송 전에
		-onComplete: function. ajax전송 성공시
		-onError: function. JSON 데이터중 error가 1일 때
		-onFailure: function. 전송에 실패했을 떄
 */
function ajaxForm(setting) {
	// 기본값 정의
	if (!$chk(setting['json'])) setting['json'] = 1;
	if (!$chk(setting['form'])) setting['form'] = 1;
	if (!$chk(setting['loading'])) setting['loading'] = 1;
	if (!$chk(setting['method'])) setting['method'] = 'post';
	if (!$chk(setting['onRequest'])) setting['onRequest'] = new Function();
	if (!$chk(setting['onError'])) setting['onError'] = function (data) { __script(data); };
	if (!$chk(setting['onComplete'])) setting['onComplete'] = function (data) { __script(data); };
	if (!$chk(setting['onFailure'])) setting['onFailure'] = function () { error("전송에 실패했습니다. 잠시 후 다시 시도해주세요"); };
	if ($chk(setting['Obj'])) setting['onFailure'].bind(setting['Obj']);
	var loading = $('loading');

	
	// url 전송
	if ($chk(setting['url'])) {
		if (setting['loading']) {
			loading.toggle('show');
			loading.center();
		}

		new Ajax(setting['url'], {
			method: setting['method'],
			onRequest: setting['onRequest'],
			onComplete: function (item) {
				if (setting['loading']) loading.toggle('hide');

				if ($chk(item)) {
					// json 처리
					if (setting['json']) {
						data = setJSON(item);
						if ($type(data) == 'object') {
							if ($chk(setting['onError']) && $chk(data['error']) && data['error'] == 1) {
								setting['onError'].attempt(data);
							}
							else if ($chk(setting['onComplete'])) setting['onComplete'].attempt(data);
						}
						else {
							if ($chk(setting['onFailure'])) setting['onFailure']();
						}
					}

					// 일반
					else {
						if ($chk(setting['onComplete'])) setting['onComplete'].attempt(item);
					}
				}
				else {
					setting['onFailure']();
				}
			},
			onFailure: function () {
				if (setting['loading']) loading.toggle('hide');
				setting['onFailure'].attempt(setting['Obj']);
			}
		}).send(setting['url'], $type(setting['values']) == 'string' ? setting['values'] : Object.toQueryString(setting['values']));
	}

	// 폼 전송
	else if ($chk(setting['Obj'])) {
		if (setting['loading']) {
			loading.toggle('show');
			loading.center();
		}

		if (setting['form']) setting['Obj'].setStyle('visibility', 'hidden');
		if ($chk(setting['action'])) setting['Obj'].action = setting['action'];
		if ($chk(setting['target'])) setting['Obj'].target = setting['target'];
		if ($chk(setting['values'])) setting['Obj'].setValue(setting['values']);

		setting['Obj'].send({
			onRequest: setting['onRequest'].bind(setting['Obj']),
			onComplete: (function (item) {
				if (setting['loading']) loading.toggle('hide');
				if (setting['form']) setting['Obj'].setStyle('visibility', 'visible');

				if ($chk(item)) {
					// json 처리
					if (setting['json']) {
						data = setJSON(item);
						if ($type(data) == 'object') {
							if ($chk(setting['onError']) && $chk(data['error']) && data['error'] == 1) {
								setting['onError'].attempt(data);
							}
							else if ($chk(setting['onComplete'])) setting['onComplete'].attempt(data);
						}
						else {
							if ($chk(setting['onFailure'])) setting['onFailure']();
						}
					}

					// 일반
					else {
						if ($chk(setting['onComplete'])) setting['onComplete'].attempt(item);
					}
				}
				else {
					setting['onFailure']();
				}
			}).bind(setting['Obj']),
			onFailure: function () {
				if (setting['loading']) loading.toggle('hide');
				if (setting['form']) setting['Obj'].setStyle('visibility', 'visible');
				setting['onFailure'].attempt(setting['Obj']);
			}
		});
	}

	else {
		error('ajaxForm 사용시 Obj나 url이 설정되어 있지 않습니다');
	}
}; // END function