/**********************************************************************************
 * modular_view.js
 * 
 * Modular 프레임워크의 뷰 관련된 부분이 포함되어 있는 스크립트 파일
 * 'Modular.view' 라는 네임스페이스를 사용하고 있음
 * 
 * @author 김선엽(sunyoupk@udapsoft.co.kr)
 **********************************************************************************/

/*=============================================================
 * 
 * SearchView 구현
 * 
 =============================================================*/

Modular.view.SearchView = function () {
};

Modular.view.SearchView.initConditions = function (searchId) {
	var searchCondition = Modular.model.PageContext.getSearchCondition(searchId);
	jQuery.each(searchCondition.conditions, function (p, v) {
		jQuery("#" + p).val(v.value);
	});
};

Modular.view.SearchView.setAllConditions = function (searchId) {
	var searchCondition = Modular.model.PageContext.getSearchCondition(searchId);
	var flag = true;
	jQuery.each(searchCondition.conditions, function (p, v) {
		switch (v.type) {
			case "range" : 
				var fValue = jQuery("#" + v.fKey);
				if (fValue.size() <= 0) {
					// alert("조회조건 '<modular:key id=\"" + v.key + "\" fromKey=\"" + v.fKey + "\">'에 해당하는 폼 엘리먼트가 정의되지 않았습니다.");
					flag = false;
				} else {
					v.fValue = fValue.val();
				}//end if
				
				var tValue = jQuery("#" + v.tKey);
				if (tValue.size() <= 0) {
					// alert("조회조건 '<modular:key id=\"" + v.key + "\" toKey=\"" + v.tKey + "\">'에 해당하는 폼 엘리먼트가 정의되지 않았습니다.");
					flag = false;
				} else {
					v.tValue = tValue.val();
				}//end if
				break;
			case "multi" :				
				var checkObj = jQuery("input[name='"+p+"']");
				var selObj = jQuery("#" + p);
				if (checkObj.size() <= 0 && selObj.size() <= 0) {
					//alert("조회조건 '<modular:key id=\"" + v.key + "\">'에 해당하는 폼 엘리먼트가 정의되지 않았습니다.");
					flag = false;
				} 
				else if(checkObj.size() > 0){//CheckBox 엘리멘트 사용하는 경우				
					var checkedValues = [];
					checkObj.each(function(i){
						if( this.checked ) {							
							checkedValues.push(jQuery(this).val());
						}
					});
					v.value = checkedValues;
				}
				else if(selObj.size() > 0){//Select 엘리멘트 사용하는 경우
					var checkedValues = [];
					for(var i=0; i<selObj[0].options.length; i++){
						if (selObj[0].options[i].selected) {
							checkedValues.push(selObj[0].options[i].value);
						}
					}
					v.value = checkedValues;
				}
				else {
					flag = false;
				}
				break;
			default :
				/*
				 * 원래 jQuery("#" + p); 형태로 바인딩했었으나 이럴 경우 아이디값은 무조건 유일해야하며
				 * 서버측에서 request.getParameterrValues와 같은 형태로 받고자 하는건 불가능하게 됨
				 * 따라서 각 HTML 요소에 따라 name으로 조회를 해서  단일과 멀티로 나누어 모두 동작하게 수정함
				 * 2009.05.26 - gloom
				 * form input 가능 요소 : input, select, textarea
				 */								
				var inputObj = jQuery("input[name='"+p+"']");
				var selObj = jQuery("select[name='"+p+"']");
				var taObj = jQuery("textarea[name='"+p+"']");
				if (inputObj.size() <= 0 && selObj.size() <= 0 && taObj.size() <= 0) {
					// alert("조회조건 '<modular:key id=\"" + v.key + "\">'에 해당하는 폼 엘리먼트가 정의되지 않았습니다.");
					flag = false;						
				}
				else if(inputObj.size() > 0) {//input 요소인 경우
					var inputType = inputObj.attr("type");
					switch (inputType) {
						case "checkbox" :
							var inputValues = [];
							inputObj.each(function(i){
								if( this.checked ) {							
									inputValues.push(jQuery(this).val());
								}
							});
							v.value = inputValues;
							break;
						case "radio" :
							v.value = jQuery("input[name='"+p+"']:checked").val();
							break;							
						default :
							if(inputObj.size() == 1) {
								v.value = inputObj.val();
							}
							else {
								var inputValues = [];
								inputObj.each(function(i){
									if(Modular.Utils.hasText(jQuery(this).val())) {
										inputValues.push(jQuery(this).val());
									}
								});
								if(inputValues.length > 0) {
									v.value = inputValues;
								}
							}							
														
					}//end switch case
				}
				else if(selObj.size() > 0) {//select 요소인 경우
					v.value = selObj.val();					
				}
				else if(taObj.size() > 0) {//textarea 요소인 경우
					v.value = taObj.val();					
				}	
				else {
					flag = false;
				}
		}//end switch case
	});
	return flag;
};


/*=============================================================
 * 
 * Form Validation 구현
 * 
 =============================================================*/

Modular.view.Form = {
	setClientType : function(formElem, clientType) {
		var target = jQuery(formElem);

		
		var conditionForm;
		var temp = jQuery("input[name='modular.web.clientType']", target);		
		if (temp.size() > 0) {
			conditionForm = temp;
		} else {			
			conditionForm = jQuery("<input type=\"hidden\" name=\"modular.web.clientType\" />");
			target.append(conditionForm);			
		}		
		conditionForm.val(clientType);
		
	},	
	display : function () {
	
		jQuery(":text,:password,input[type='hidden'],:file").each(function () {		
			var target = jQuery(this);
			var id = target.attr("id");
			var name = target.attr("name");
			
			/*
			 * id나 name 둘 중 하나만 있는 경우, 동일한 값으로 채워준다.
			 * 둘 다 있거나, 둘 다 없는 경우는 무시.
			 */
			if (!Modular.Utils.hasText(id) && Modular.Utils.hasText(name)) {
				target.attr("id", name);
			} else if (Modular.Utils.hasText(id) && !Modular.Utils.hasText(name)) {
				target.attr("name", id);
			}//end if else
			
			var type = target.attr(Modular.view.FormAttribute.TYPE);
			var format = target.attr(Modular.view.FormAttribute.FORMAT);
			var mask = target.attr(Modular.view.FormAttribute.MASK);
			var maskChars = target.attr(Modular.view.FormAttribute.MASKCHARS);
			var event = target.attr(Modular.view.FormAttribute.EVENT) || "button";
			var required = target.attr(Modular.view.FormAttribute.REQUIRED) || "false";
			var message = target.attr(Modular.view.FormAttribute.MESSAGE);
			
			var defaultValue = target.attr(Modular.view.FormAttribute.DEFAULTVALUE);
			
			var validator = target.attr(Modular.view.FormAttribute.VALIDATOR);
			var min = target.attr(Modular.view.FormAttribute.MIN);
			var max = target.attr(Modular.view.FormAttribute.MAX);
			
			//modular:required 지정시
			if ("true" == required) {
				var msg = message || "필수 입력 항목 입니다.";
				target.addClass("required");
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					useMask : false,
					mask : mask,
					v : function (v) {
						if (v.trim() == "") {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			}//end if
			
			//modular:type 지정시
			switch (type) {
				case "date" :
					var o = {
						changeMonth: true,
				        changeYear: true,
				        showButtonPanel: true,
						"dateFormat" : "yy-mm-dd",
						"showButtonPanel" : false,
						"onSelect" : function() {
							$(this).change();
						},
						showOn: "both",
					    buttonImage: Modular.model.PageContext.WEB_RESOURCE_ROOT + "/css/app/theme/default/img/button/icon_calendar.gif",
					    buttonImageOnly: true
					};
					
					if (format) {
						o.dateFormat = format;
					}
					
					var convertDate = function (s) {
						s = s.split("-");
						return new Date(parseInt(s[0]), parseInt(s[1]) - 1, parseInt(s[2]));
					};
					
					if (min) {
						o.minDate = convertDate(min);
					}//end if
					
					if (max) {
						o.maxDate = convertDate(max);
					}//end if
					
					if (format == 'yy-mm') {
						o.showButtonPanel = true;
						o.onClose = function(dateText, inst) { 
				            var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
				            var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
				            target.datepicker('setDate', new Date(year, month, 1));
				        };
				        
				        o.beforeShow = function(input, inst) {
				        	jQuery('#ui-datepicker-div .ui-datepicker-calendar').hide();
			            };
			            
			            o.isMonthly = true;
				        
					} else {
						o.showButtonPanel = false;
						o.beforeShow = function(input, inst) {
							jQuery('#ui-datepicker-div .ui-datepicker-calendar').show();
						};
						o.isMonthly = false;
					}
					/*
					 * 선택된 언어환경에 맞는 달력 표시언어 설정
					 */
					var calendarLocalization = (hUser.lang).toLowerCase();
					
					try{
						$.datepicker.setDefaults($.datepicker.regional[calendarLocalization]);
						target.datepicker(o);	
					}
					catch (e) {
						  // pass exception object to error handler
					}
					
					if (format == 'yy-mm') {
						target.focus(function () {
							$(".ui-datepicker-calendar").hide();
						});
					}
					
					break;
					
				case "number" :
					target.addClass("number");
					/*
					 * 숫자일 경우, mask가 설정될때와 안될때를 구분해 처리하도록 로직 수정
					 * 2009.08.28 - gloom
					 */					
					if (mask) {						
						var o = {};
						o["mask"] = mask;
						o["textAlign"] = false;											
						/*
						 * 숫자의 경우 mask가 역순으로 적용되므로 실제 입력할 때에는 정상적으로 입력하더라도
						 * 프레임워크 내부에서 처리할 때 역순으로 변환되도록 처리함. 
						 * 2009.02.18 - Helexis
						 * 2009.08.28 - gloom 보완
						 */
						 o["type"] = "reverse";
						 var temp = o["mask"].split("").reverse();					 
						 o["mask"] = temp.join("");	
						 if(maskChars) {//masking 기준자가 별도로 있는 경우 옵션 추가
							 o["fixedChars"] = maskChars;
						 }
						 target.setMask(o);
					}
					else {
						target.numeric();//숫자입력만받게함
					}
					break;
					
				default :
					if (mask) {
						target.css({
							"ime-mode" : "disabled"
						});
						
						var o = {};
						o["mask"] = mask;
						 if(maskChars) {//masking 기준자가 별도로 있는 경우 옵션 추가
							 o["fixedChars"] = maskChars;
						 }						
						target.setMask(o);
					}//end if
			}//switch case
			
			if (defaultValue == Modular.view.FormDefaultValue.CURRENTDATE) {
				target.val(hcommon.getDate());
			}
			
			/*
			 * validation 기본 전제는,
			 * 필수 입력 체크가 아니므로, 값이 없을 경우에는
			 * validation 하지 않는다.
			 * 
			 * 2009.01.08 - Helexis
			 */
			if (validator) {
				/*
				 * built-in validator : 사용자정의 validator
				 */
				validator = Modular.view.Form.validator[validator] || eval(validator);
				var msg = message || "입력 값이 잘 못 되었습니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					useMask : true,
					mask : mask,
					v : function (v, target) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						return validator.call(this, v, target);
					}
				});
			} else if (min && max && type != "date") {
				var msg = message || "입력 값은 최소 '" + min + "' 이상, 최대 '" + max + "' 이하만 가능합니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					useMask : true,
					mask : mask,
					v : function (v) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						v = type == "number" ? parseInt(v) : v;
						if (v < min || v > max) {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			} else if (min && type != "date") {
				var msg = message || "입력 값은 '" + min + "' 이상만 가능합니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					useMask : true,
					mask : mask,
					v : function (v) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						v = type == "number" ? parseInt(v) : v;
						if (v < min) {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			} else if (max && type != "date") {
				var msg = message || "입력 값은 '" + max + "' 이하만 가능합니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					useMask : true,
					mask : mask,
					v : function (v) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						v = type == "number" ? parseInt(v) : v;
						if (v > max) {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			}//end if else
			
		});
		
		jQuery("textarea").each(function () {	
			var target = jQuery(this);
			var id = target.attr("id");
			var name = target.attr("name");
			
			/*
			 * id나 name 둘 중 하나만 있는 경우, 동일한 값으로 채워준다.
			 * 둘 다 있거나, 둘 다 없는 경우는 무시.
			 */
			if (!Modular.Utils.hasText(id) && Modular.Utils.hasText(name)) {
				target.attr("id", name);
			} else if (Modular.Utils.hasText(id) && !Modular.Utils.hasText(name)) {
				target.attr("name", id);
			}//end if else
				
			var required = target.attr(Modular.view.FormAttribute.REQUIRED) || "false";
			var message = target.attr(Modular.view.FormAttribute.MESSAGE);
			var validator = target.attr(Modular.view.FormAttribute.VALIDATOR);
			
			//modular:required 지정시
			if ("true" == required) {
				var msg = message || "필수 입력 항목 입니다.";
				target.addClass("required");
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					v : function (v) {
						if (v.trim() == "") {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			}//end if		
			
			/*
			 * validation 기본 전제는,필수 입력 체크가 아니므로, 값이 없을 경우에는validation 하지 않는다.
			 */
			if (validator) {
				/*
				 * built-in validator : 사용자정의 validator
				 */
				validator = Modular.view.Form.validator[validator] || eval(validator);
				var msg = message || "입력 값이 잘 못 되었습니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					v : function (v, target) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						return validator.call(this, v, target);
					}
				});
			}
		});
		
		/*
		 * radio, checkbox 에 대한 Validation 처리.
		 * 
		 * modular:list에 의한 radio, checkbox 는 감싸고 있는 span 태그를 target으로 한다.
		 */
		jQuery("span.required").each(function(){
			var target = jQuery(this);
			var id = target.attr("id");
			//alert(id);
			var required = target.attr(Modular.view.FormAttribute.REQUIRED) || "false";
			var message = target.attr(Modular.view.FormAttribute.MESSAGE);
			//var validator = target.attr(Modular.view.FormAttribute.VALIDATOR);
			
			//modular:required 지정시
			if ("true" == required) {
				var msg = message || "필수 선택 항목 입니다.";
				target.addClass("required");
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					v : function (v) {
						var len = jQuery("input:checked", target).length;
						if (len <= 0) {
							return false;
						} else {
							return true;
						}//end if else
					}
				});
			}//end if
		});
		
		jQuery("select").each(function () {
			var target = jQuery(this);
			var id = target.attr("id");
			var name = target.attr("name");
			
			/*
			 * id나 name 둘 중 하나만 있는 경우, 동일한 값으로 채워준다.
			 * 둘 다 있거나, 둘 다 없는 경우는 무시.
			 */
			if (!Modular.Utils.hasText(id) && Modular.Utils.hasText(name)) {
				target.attr("id", name);
			} else if (Modular.Utils.hasText(id) && !Modular.Utils.hasText(name)) {
				target.attr("name", id);
			}//end if else
			
			var required = target.attr(Modular.view.FormAttribute.REQUIRED) || "false";
			var message = target.attr(Modular.view.FormAttribute.MESSAGE);
			var validator = target.attr(Modular.view.FormAttribute.VALIDATOR);
			
			//modular:required 지정시
			if ("true" == required) {
				var msg = message || "필수 선택 항목 입니다.";
				target.addClass("required");
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					v : function (v) {
						var val = jQuery("option:selected", target).attr("value");
						if (val.trim() == "") {
							return false;
						} else {
							return true;
						}//end if
					}
				});
			}//end if
			
			if (validator) {
				/*
				 * built-in validator : 사용자정의 validator
				 */
				validator = Modular.view.Form.validator[validator] || eval(validator);
				var msg = message || "입력 값이 잘 못 되었습니다.";
				
				Modular.view.Form.makeValidator({
					target : target,
					msg : msg,
					v : function (v, target) {
						if (!v || v.trim().length == 0) {
							return true;
						}//end if
						return validator.call(this, v, target);
					}
				});
			}
			
		});
		
		/*
		 * Form Submit에 대한 이벤트 캡처 및 validation 로직 추가
		 */
		jQuery("form").submit(function (e) {
			//재검사를 위해 기존 invalid 표시는 제거한다.
			jQuery(".invalid",this).removeClass("invalid");
			
			var vs = Modular.model.PageContext.validators;			
			for (var i = 0; i < vs.length; i++) {
				vs[i].call(this);
			}//end for
									
			if (jQuery(".invalid",this).length > 0) {				
				jQuery(".invalid:first",this).focus();
				e.stopImmediatePropagation();
				return false;
			}//end if
			jQuery(":text", this).each(function () {
				var target = jQuery(this);
				if (target.attr(Modular.view.FormAttribute.MASK)) {
					target.val(target.unmaskedVal(target.attr(Modular.view.FormAttribute.MASKCHARS)));
				}//end if
			});
			
			Modular.view.Form.bindSearchParameters(this);			
			return true;
		});

	},
	
	/**
	 * 검색조건으로 지정된 데이터들을 JSON형태로 만들어 
	 * 검색조건 파라미터(modular.web.bind.condition)에 설정한다. 
	 */	
	bindSearchParameters : function (formElem) {
		var target = jQuery(formElem);
		var type = target.attr(Modular.view.FormAttribute.TYPE);
		
		if (type == "search") {
			var id = target.attr("id");
			if (Modular.model.PageContext.popSearchForm) {
				Modular.view.SearchView.setAllConditions(id);
				var conditions = [];
				jQuery.each(Modular.model.PageContext.getSearchCondition(id).conditions, function (key, value) {
					conditions.push(value);
				});
				
				var conditionForm = this.findSearchParametersObj(target);
				conditionForm.val(Modular.Utils.toJSON(conditions));
			}//end if
		}//end if
	},
	
	/**
	 * 검색조건으로 지정된 데이터들을 JSON형태로 만들어 
	 * 검색조건 파라미터(modular.web.bind.condition)에 설정한다. 
	 */	
	findSearchParametersObj : function (formObj) {
		var conditionForm;
		var temp = jQuery("input[name='modular.web.bind.condition']", formObj);
		if (temp.size() > 0) {
			conditionForm = temp;
		} else {
			conditionForm = jQuery("<input type=\"hidden\" name=\"modular.web.bind.condition\" />");
			formObj.append(conditionForm);
		}//end if else		
		return conditionForm;
	},
	
	/**
	 * Form에 대한 built-in validator 확장지점.
	 * 추후 구현하려면, 이 지점에 구현합니다.
	 */
	validator : {
		/**
		 * 사용자정의 built-in e-mail validator
		 * 
		 * @param value validation 대상 값
		 * @return 검증 성공 여부
		 */
		email : function (value) {
			return /^.+@.+\..+$/.test(value);
		}		 
	},
	/**
	 * 경고 메시지와 관련된 툴팁을 생성하여 리턴함.
	 * 
	 * @param msg {String} 툴팁에 사용할 메시지
	 * @param tag {String} 경고 메시지 이미지를 감쌀 태그
	 * @return {Object} 생성된 툴팁 객체
	 */
	makeExclamation : function (msg, tag) {
		tag = tag || "span";
		var exclamation = jQuery("<br/><" + tag + " class=\"error\" > " + msg + " </" + tag + ">");
		exclamation.hide();
		return exclamation;
	},
	/**
	 * validator를 생성하여 주어진 target에 설정함.
	 * 
	 * validation 로직 및 display에 따른 로직의 중복을 피하기 위해서
	 * 중복이 되는 코드를 별도의 메소드로 분리하고,
	 * 핵심 비즈니스 로직을 전략에 따라 변경 가능하도록
	 * strategy-pattern을 적용하였음.
	 * 
	 * 옵션 파라미터 객체는 다음과 같은 속성을 포함할 수 있음.
	 * 
	 *  - target {Object} validator 적용 대상 객체
	 *  - title {String} 툴팁의 타이틀 (modular2.0 부터 사용안함)
	 *  - msg {String} 툴팁의 메시지
	 *  - useMask {boolean} 마스크 사용여부
	 *  - m {String} 마스크
	 *  - v {Function} validator 함수
	 * 
	 * @param p {Object} validator에 필요한 옵션 객체
	 */
	makeValidator : function (p) {
		p = jQuery.extend({
			useMask : true
		}, p || {});
		var t = p.target;
		//var exclamation = Modular.view.Form.makeExclamation(p.title + "|" + p.msg);
		var exclamation = Modular.view.Form.makeExclamation(p.msg, "label");
		t.parent().append(exclamation);
		
		var validator = function () {
			var val = p.useMask ? ((p.mask) ? t.unmaskedVal(t.attr(Modular.view.FormAttribute.MASKCHARS)) : t.val()) : t.val();
			/*
			 * custom validator 사용시 인자를 넘길수 없는 불편 해소를 위해 
			 * 타겟 Object도 함께 전달해주는 방식으로 변경함
			 * 2009.07.02 - 김윤수
			 */			
			if(!t.hasClass("invalid")) {//이미 invalid 체킹된 엘리멘트의 경우 Sklp
				if (!p.v.call(this, val, t[0])  && t.css("display") != 'none') {
					t.addClass("invalid");
					exclamation.show();
					/*
					 * IE에서 focus 변경 이벤트 시 blur 이벤트가 동시에 발생하여
					 * invalid할 경우, form 사이를 계속 focus 반복하는 무한루프에 빠짐.
					 * 따라서, focus를 제거함.
					 * 
					 * 2009.01.05 - Helexis
					 */
					// t.focus();
				} else {
					t.removeClass("invalid");
					exclamation.hide();
				}//end if else
			}
		};
		
		Modular.model.PageContext.validators.push(validator);
		
		/*
		 * blur 이벤트에만 vaalidator 체크가 들어있는 경우 
		 * 팝업등을 통해 데이터가 채워지는 경우 invalid 스타일이 사라지지 않는 문제 발생
		 * 우선 submit시에만 validator 체크하는것으로 변경함
		 * 2009.05.26 - gloom
		 */
		//t.bind("blur", validator);
		return validator;
	},
	isValid : function(formObj) {		
		//재검사를 위해 기존 invalid 표시는 제거한다.
		jQuery(".invalid",formObj).removeClass("invalid");
		
		var vs = Modular.model.PageContext.validators;			
		for (var i = 0; i < vs.length; i++) {
			vs[i].call(formObj);
		}//end for
		
		if (jQuery(".invalid",formObj).length > 0) {				
			jQuery(".invalid:first",formObj).focus();
			//e.stopImmediatePropagation();
			return false;
		}//end if			
		jQuery(":text", formObj).each(function () {
			var target = jQuery(formObj);
			if (target.attr(Modular.view.FormAttribute.MASK)) {
				target.val(target.unmaskedVal(target.attr(Modular.view.FormAttribute.MASKCHARS)));
			}//end if
		});
		
		this.bindSearchParameters(formObj);
		
		return true;		
	}
};

/**
 * Form Validation에 사용되는 사용자 정의 속성을 기술한 상수 모음 클래스
 */
Modular.view.FormAttribute = {
	TYPE : "modular:type",
	FORMAT : "modular:format",
	MASK : "modular:mask",
	MASKCHARS : "modular:maskChars",	
	EVENT : "modular:event",
	REQUIRED : "modular:required",
	MESSAGE : "modular:message",
	VALIDATOR : "modular:validator",
	MIN : "modular:min",
	MAX : "modular:max",
	
	DEFAULTVALUE : "modular:defaultValue"
};

/**
 * Form 태그 속성 확장: modular:defaultValue
 * 2013.02.07 김선엽 추가
 */
Modular.view.FormDefaultValue = {
	CURRENTDATE : "getDate"
};


/*=============================================================
 * 
 * List Display 구현
 * 
 =============================================================*/

/**
 * Form에서 List 타입인 combobox, checkbox, radio 유형의 목록을
 * display 하기 위해 사용되는 클래스
 */
Modular.view.Form.List = {
	display : function (p) {
		p = jQuery.extend({
			displayType : "select",
			events : [],
			separator : ","
		}, p || {});

		switch (p.displayType) {
			case "radio" :
				var t = jQuery("#" + p.id + "_div");//span tag
				
				jQuery.each(p.events, function (idx, evt) {
					jQuery("input[type=radio]",t).each(function(){
						jQuery(this).bind(evt.eventType, evt.eventHandler);
					});
				});
				
				jQuery.each(p.attr, function() {									
					var key = this.key;
					var value = this.value;
					jQuery("input[type=radio]",t).each(function(){
						jQuery(this).attr(key, value);
					});
				});

				if (p.required) {
					t.attr("modular:required", "true").addClass("required");
				}//end if
				
				// id 를 유닉하게 명시
				jQuery("input[type=radio]",t).each(function(index){
					jQuery(this).attr("id", p.id+"_"+index);
				});
				break;
			case "checkbox" :
				var t = jQuery("#" + p.id + "_div");//span tag
				
				jQuery.each(p.events, function (idx, evt) {
					jQuery("input[type=checkbox]",t).each(function(){
						jQuery(this).bind(evt.eventType, evt.eventHandler);
					});
				});
				
				jQuery.each(p.attr, function() {									
					var key = this.key;
					var value = this.value;
					jQuery("input[type=checkbox]",t).each(function(){
						jQuery(this).attr(key, value);
					});
				});
				
				if (p.required) {
					t.attr("modular:required", "true").addClass("required");
				}//end if
				
				// id를 유닉하게 명시.
				jQuery("input[type=checkbox]",t).each(function(index){
					jQuery(this).attr("id", p.id+"_"+index);
				});
				break;
			default : 
				var select = jQuery("#" + p.id);
				
				jQuery.each(p.attr, function() {									
					//alert("key:"+this.key+" value:"+this.value);
					select.attr(this.key, this.value);					
				});
				
				if (p.css) {
					select.addClass(p.css);
				}//end if		

				if (p.required) {
					select.attr(Modular.view.FormAttribute.REQUIRED, "true");
				}//end if
				
				if (p.message) {
					select.attr(Modular.view.FormAttribute.MESSAGE, p.message);
				}//end if
				
				jQuery.each(p.events, function (idx, evt) {
					select.bind(evt.eventType, evt.eventHandler);
				});

				break;
		}//end switch case
	}
};



/*=============================================================
 * 
 * Modal-Dialog 구현을 위해 사용된 API
 * 이 부분은 기존의 구현을 위치만 이동하였음.
 * 
 =============================================================*/

/**
 * Dialog를 사용하기 위한 클래스
 */
Modular.view.Dialog = {
	/**
	 * 윈도우창을 띄움
	 */
	openWindow : function(url, target, attrs, id, openEventCheck, expiredays ) {
		if ( openEventCheck == true ) {
			if ( Modular.Utils.getCookie( "openevent_" + id ) == "check" ) {
				return;
			}
		}
		window.open(url, target, attrs);	
	},
	/**
	 * 윈도우 모달창을 띄움
	 */	
	openModalWindow: function(url, title, params, width_px, height_px, scroll, returnHandler, id, openEventCheck, expiredays ) {
		if ( openEventCheck == true ) {
			if ( Modular.Utils.getCookie( "openevent_" + id ) == "check" ) {
				return;
			}
		}

		if (window.showModalDialog) {
			var args = new Array();
			args["_url"] = url;
			args["_title"] = title;
			args["_params"] = params;
			args["_scroll"] = scroll;
			args["_id"] = id;
			args["_openEventCheck"] = openEventCheck;
			args["_expiredays"] = expiredays;
			if(window.dialogArguments){ //상위가 modal인 경우
				args["_parent"] = window.dialogArguments[2]; //상위 window 전달(window 객체는 항상 최상위를 유지)
			}else{
				args["_parent"] = window;
			}
			
			//TODO : 창 위치 조정 기능 추가할것.
			var features = "dialogHeight:"+height_px+"px;dialogWidth:"+width_px+"px;";
			var retValue = window.showModalDialog( Modular.model.PageContext.WEB_RESOURCE_ROOT + "/js/modular/modal.html", args, features);

			if ( returnHandler ) {
				returnHandler.call( this, retValue );
			}
			else {
				return retValue;
			}
		} else {
			attrs = 'width=' + width_px + ',height=' + height_px + ',toolbar=no,directories=no,status=no,menubar=no,scrollbars=' + scroll + ',resizable=no,modal=yes';
			Modular.view.Dialog.openWindow(url, "_blank", attrs, id, openEventCheck, expiredays );
		}
	}
};

/*=============================================================
 * 
 * Key Event 구현
 * 
 =============================================================*/

/**
 * 화면의 Key 이벤트에 대한 Key-Code를 나타내는 상수 클래스
 */
Modular.view.Key = {
	/**
	 * 탭 키 코드
	 */
	TAB : 9,
	/**
	 * 엔터 키 코드
	 */
	ENTER : 13,
	/**
	 * ESC 키 코드
	 */
	ESC : 27
};

/*=============================================================
 * 
 * 메세지
 * 
 =============================================================*/

/**
 * 화면내의 메세지 정의 상수 클래스
 */
Modular.Message = {
	/**
	 * Validation 오류 메세지 (Dialog 타이틀용)
	 */
	VALIDATION_DIALOG : "입력오류입니다"
};

/*=============================================================
 * 
 * Form 전체 파라미터를 디버깅 하기위한 함수.
 * - Modular.model 과 Modular.view 네임스페이스에 의존관계가 있어서 이곳에 정의.
 =============================================================*/

Modular.debugSubmit = function(formId){
	if(Modular.Debugger.enabled && formId != ""){
	   var params = "------ All Parameters ["+formId+"] ------<br>" + decodeURIComponent(jQuery("#"+formId).serialize());
	   
	   Modular.view.SearchView.setAllConditions(formId);
	   var conditions = [];
	   jQuery.each(Modular.model.PageContext.getSearchCondition(formId).conditions, function (key, value) {
			conditions.push(value);
	   });
	   params = params + "&modular.web.bind.condition=" +Modular.Utils.toJSON(conditions);
	   
	   Modular.debug(params);
	}
};