123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020 |
- /**********************************************************************************
- * 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);
- }
- };
|