/********************************************************************************** * 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("조회조건 ''에 해당하는 폼 엘리먼트가 정의되지 않았습니다."); flag = false; } else { v.fValue = fValue.val(); }//end if var tValue = jQuery("#" + v.tKey); if (tValue.size() <= 0) { // alert("조회조건 ''에 해당하는 폼 엘리먼트가 정의되지 않았습니다."); 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("조회조건 ''에 해당하는 폼 엘리먼트가 정의되지 않았습니다."); 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'에 해당하는 폼 엘리먼트가 정의되지 않았습니다."); 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(""); 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(""); 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("
<" + tag + " class=\"error\" > " + msg + " "); 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+"] ------
" + 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); } };