#18576578 XMLJsFilter를 JAF에 맞도록 변환

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@7079 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
taggon 2009-12-30 05:14:28 +00:00
parent 7352faa914
commit e4f0306a42
2 changed files with 496 additions and 532 deletions

View file

@ -1,16 +1,248 @@
/**
* @file common/js/xml_js_filter.js
* @author zero (zero@nzeo.com)
* @brief xml filter에서 사용될 js
*
* zbxe 에서 form의 동작시 필수입력 여부등을 선처리하고 xml_handler.js의 exec_xml() 통해서
* 특정 모듈과의 ajax 통신을 통해 process를 진행시킴
* @author taggon (taggon@gmail.com)
* @brief xml filter (validator) plugin
*
* A rule is a method validate one field.
* A filter is made up of one or more rules.
**/
(function($){
var alertMsg = new Array();
var target_type_list = new Array();
var notnull_list = new Array();
var extra_vars = new Array();
var messages = [];
var rules = [];
var filters = [];
var callbacks = [];
var Validator = xe.createApp('Validator', {
init : function() {
// {{{ add filters
// email
var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/;
this.cast('ADD_RULE', ['email', regEmail]);
this.cast('ADD_RULE', ['email_address', regEmail]);
// userid
var regUserid = /^[a-z]+[\w-]*[a-z0-9]+$/i;
this.cast('ADD_RULE', ['userid', regUserid]);
this.cast('ADD_RULE', ['user_id', regUserid]);
// url
var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
this.cast('ADD_RULE', ['url', regUrl]);
this.cast('ADD_RULE', ['homepage', regUrl]);
// korean
var regKor = /^[가-힣]*$/;
this.cast('ADD_RULE', ['koeran', regKor]);
// korean_number
var regKorNum = /^[가-힣0-9]*$/;
this.cast('ADD_RULE', ['korean_number', regKorNum]);
// alpha
var regAlpha = /^[a-z]*$/i;
this.cast('ADD_RULE', ['alpha', regAlpha]);
// alpha_number
var regAlphaNum = /^[a-z][a-z0-9_]*$/i;
this.cast('ADD_RULE', ['alpha_number', regAlphaNum]);
// numver
var regNum = /^[0-9]*$/i;
this.cast('ADD_RULE', ['number', regNum]);
// }}} add filters
},
// run validator
run : function(oForm) {
var filter = '';
if (oForm._filter) filter = oForm._filter.value;
return this.cast('VALIDATE', [oForm, filter]);
},
API_ONREADY : function() {
var self = this;
// hook form submit event
$('form')
.each(function(){
if (this.onsubmit) {
this['xe:onsubmit'] = this.onsubmit;
this.onsubmit = null;
}
})
.submit(function(){
var legacyFn = this['xe:onsubmit'];
var hasLegacyFn = $.isFunction(legacyFn);
var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this);
return false;
});
},
API_VALIDATE : function(sender, params) {
var self = this, result = true, form = params[0], filter=null, callback=null;
if (form.elements['_filter']) filter = form.elements['_filter'].value;
if (!filter) return true;
if ($.isFunction(callbacks[filter])) callback = callbacks[filter];
filter = filters[filter.toLowerCase()] || null;
$.each(filter, function(name) {
var _el = form.elements[name];
if (!_el) return true;
var el = $(_el), val = get_value(el);
var minlen = parseInt(this.minlen) || 0;
var maxlen = parseInt(this.maxlen) || 0;
var rule = (this.rule || '').split(',');
if (this.required && !val) (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false));
if ((minlen && maxlen) && (val.length < minlen || val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false));
if (this.equalto) {
var eq_val = get_value(form.elements[this.equalto]);
if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false));
}
$.each(rule, function() {
var ret = self.cast('APPLY_RULE', [this, val]);
if (!ret) return (result = false);
});
if (!result) return false;
});
if (!result) return false;
if ($.isFunction(callback)) return callback(form);
return true;
},
API_ADD_RULE : function(sender, params) {
var name = params[0].toLowerCase();
rules[name] = params[1];
},
API_DEL_RULE : function(sender, params) {
var name = params[0].toLowerCase();
delete rules[name];
},
API_GET_RULE : function(sender, params) {
var name = params[0].toLowerCase();
if (rules[name]) {
return rules[name];
} else {
return null;
}
},
API_ADD_FILTER : function(sender, params) {
var name = params[0].toLowerCase();
var filter = params[1];
filters[name] = filter;
},
API_DEL_FILTER : function(sender, params) {
var name = params[0].toLowerCase();
delete filters[name];
},
API_GET_FILTER : function(sender, params) {
var name = params[0].toLowerCase();
if (filters[name]) {
return filters[name];
} else {
return null;
}
},
API_APPLY_RULE : function(sender, params) {
var name = params[0].toLowerCase();
var value = params[1];
if (typeof(rules[name]) == 'undefined') return true; // no filter
if ($.isFunction(rules[name])) return rules[name](value);
if (rules[name] instanceof RegExp) return rules[name].test(value);
return true;
},
API_ALERT : function(sender, params) {
var form = params[0];
var field_name = params[1];
var msg_code = params[2];
var minlen = params[3];
var maxlen = params[4];
var field_msg = this.cast('GET_MESSAGE', [field_name]);
var msg = this.cast('GET_MESSAGE', [msg_code]);
if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg));
if (typeof(minlen)!='undefined' && typeof(maxlen)!='undefined') msg += '('+minlen+'~'+maxlen+')';
this.cast('SHOW_ALERT', [msg]);
// set focus
$(form.elements[field_name]).focus();
},
API_SHOW_ALERT : function(sender, params) {
alert(params[0]);
},
API_ADD_MESSAGE : function(sender, params) {
var msg_code = params[0];
var msg_str = params[1];
messages[msg_code] = msg_str;
},
API_GET_MESSAGE : function(sender, params) {
var msg_code = params[0];
return messages[msg_code] || msg_code;
},
API_ADD_CALLBACK : function(sender, params) {
var name = params[0];
var func = params[1];
callbacks[name] = func;
},
API_REMOVE_CALLBACK : function(sender, params) {
var name = params[0];
delete callbacks[name];
}
});
var oValidator = new Validator;
// register validator
xe.registerApp(oValidator);
// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다.
var EditorStub = xe.createPlugin('editor_stub', {
API_BEFORE_VALIDATE : function(sender, params) {
var form = params[0];
var seq = form.getAttribute('editor_sequence');
if (seq) {
form.content.value = editorGetContentTextarea_xe(seq) || '';
}
}
});
oValidator.registerPlugin(new EditorStub);
// functions
function get_value(elem) {
if (elem.is(':radio')){
return elem.filter(':checked').val();
} else if (elem.is(':checkbox')) {
var vals = [];
elem.filter(':checked').each(function(){
vals.push(this.value);
});
return vals.join('|@|');
} else {
return elem.val();
}
}
})(jQuery);
/**
* @function filterAlertMessage
@ -34,297 +266,11 @@ function filterAlertMessage(ret_obj) {
}
/**
* @class XmlJsFilter
* @authro zero (zero@nzeo.com)
* @brief form elements, module/act, callback_user_func을 이용하여 서버에 ajax로 form 데이터를 넘기고 결과를 받아오는 js class
**/
function XmlJsFilter(form_object, module, act, callback_user_func) {
this.field = new Array();
this.parameter = new Array();
this.response = new Array();
this.fo_obj = form_object;
this.module = module;
this.act = act;
this.user_func = callback_user_func;
this.setFocus = XmlJsFilterSetFocus;
this.addFieldItem = XmlJsFilterAddFieldItem;
this.addParameterItem = XmlJsFilterAddParameterItem;
this.addResponseItem = XmlJsFilterAddResponseItem;
this.getValue = XmlJsFilterGetValue;
this.executeFilter = XmlJsFilterExecuteFilter;
this.checkFieldItem = XmlJsFilterCheckFieldItem;
this.getParameterParam = XmlJsFilterGetParameterParam;
this.alertMsg = XmlJsFilterAlertMsg;
this.proc = XmlJsFilterProc;
}
function XmlJsFilterSetFocus(target_name) {
var obj = this.fo_obj[target_name];
if(typeof(obj)=='undefined' || !obj) return;
var length = obj.length;
try {
if(typeof(length)!='undefined') {
obj[0].focus();
} else {
obj.focus();
}
} catch(e) {
}
}
function XmlJsFilterAddFieldItem(target, required, minlength, maxlength, equalto, filter) {
var obj = new Array(target, required, minlength, maxlength, equalto, filter);
this.field[this.field.length] = obj;
}
function XmlJsFilterAddParameterItem(param, target) {
var obj = new Array(param, target);
this.parameter[this.parameter.length] = obj;
}
function XmlJsFilterAddResponseItem(name) {
this.response[this.response.length] = name;
}
function XmlJsFilterGetValue(target_name) {
var obj = this.fo_obj[target_name];
if(typeof(obj)=='undefined' || !obj) return '';
var value = '';
var length = obj.length;
var type = obj.type;
if((typeof(type)=='undefined'||!type) && typeof(length)!='undefined' && typeof(obj[0])!='undefined' && length>0) type = obj[0].type;
else length = 0;
switch(type) {
case 'checkbox' :
if(length>0) {
var value_list = new Array();
for(var i=0;i<length;i++) {
if(obj[i].checked) value_list[value_list.length] = obj[i].value;
}
value = value_list.join('|@|');
} else {
if(obj.checked) value = obj.value;
else value = '';
}
break;
case 'radio' :
if(length>0) {
for(var i=0;i<length;i++) {
if(obj[i].checked) value = obj[i].value;
}
} else {
if(obj.checked) value = obj.value;
else value = '';
}
break;
case 'select' :
case 'select-one' :
if(obj.selectedIndex>=0) value = obj.options[obj.selectedIndex].value;
break;
default :
if(length>0 && target_type_list[target_name]) {
switch(target_type_list[target_name]) {
case 'kr_zip' :
var val1 = obj[0].value;
var val2 = obj[1].value;
if(val1&&val2) {
value = val1+'|@|'+val2;
}
break;
case 'tel' :
var val1 = obj[0].value;
var val2 = obj[1].value;
var val3 = obj[2].value;
if(val1&&val2&&val3) {
value = val1+'|@|'+val2+'|@|'+val3;
}
break;
}
} else {
value = obj.value;
}
break;
}
if(typeof(value)=='undefined'||!value) return '';
return value.trim();
}
function XmlJsFilterExecuteFilter(filter, value) {
switch(filter) {
case "email" :
case "email_address" :
var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
return regx.test(value);
break;
case "userid" :
case "user_id" :
var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
return regx.test(value);
break;
case "homepage" :
var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
return regx.test(value);
break;
case "korean" :
var regx = /^[가-힣]*$/;
return regx.test(value);
break;
case "korean_number" :
var regx = /^[가-힣0-9]*$/;
return regx.test(value);
break;
case "alpha" :
var regx = /^[a-zA-Z]*$/;
return regx.test(value);
break;
case "alpha_number" :
var regx = /^[a-zA-Z][a-zA-Z0-9\_]*$/;
return regx.test(value);
break;
case "number" :
return !isNaN(value);
break;
}
return null;
}
function XmlJsFilterAlertMsg(target, msg_code, minlength, maxlength) {
var target_msg = "";
if(alertMsg[target]!='undefined') target_msg = alertMsg[target];
else target_msg = target;
var msg = "";
if(typeof(alertMsg[msg_code])!='undefined') {
if(alertMsg[msg_code].indexOf('%s')>=0) msg = alertMsg[msg_code].replace('%s',target_msg);
else msg = target_msg+alertMsg[msg_code];
} else {
msg = msg_code;
}
if(typeof(minlength)!='undefined' && typeof(maxlength)!='undefined') msg += "("+minlength+"~"+maxlength+")";
alert(msg);
this.setFocus(target);
return false;
}
function XmlJsFilterCheckFieldItem() {
for(var i=0; i<extra_vars.length;i++) {
var name = extra_vars[i];
this.addFieldItem(name, false, 0, 0, "", "");
}
for(var i=0; i<this.field.length;i++) {
var item = this.field[i];
var target = item[0];
var required = item[1];
var minlength = item[2];
var maxlength = item[3];
var equalto = item[4];
var filter = item[5].split(",");
if(typeof(this.fo_obj[target])=='undefined') continue;
for(var j=0; j<notnull_list.length; j++) {
if(notnull_list[j]==target) required = true;
}
var value = this.getValue(target);
if(!required && !value) continue;
if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');
if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);
if(equalto) {
var equalto_value = this.getValue(equalto);
if(equalto_value != value) return this.alertMsg(target, 'equalto');
}
if(filter.length && filter[0]) {
for(var j=0;j<filter.length;j++) {
var filter_item = filter[j];
if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
}
}
}
return true;
}
function XmlJsFilterGetParameterParam() {
if(!this.fo_obj) return new Array();
var prev_name = '';
if(this.parameter.length<1) {
for(var i=0;i<this.fo_obj.length;i++) {
var name = this.fo_obj[i].name;
if(typeof(name)=='undefined'||!name||name==prev_name) continue;
this.addParameterItem(name, name);
prev_name = name;
}
}
var params = new Array();
for(var i=0; i<this.parameter.length;i++) {
var item = this.parameter[i];
var param = item[0];
var target = item[1];
var value = this.getValue(target);
params[param] = value;
}
return params;
}
function XmlJsFilterProc(confirm_msg) {
var result = this.checkFieldItem();
if(!result) return false;
if(typeof(confirm_msg)=='undefined') confirm_msg = '';
var params = this.getParameterParam();
var response = this.response;
if(confirm_msg && !confirm(confirm_msg)) return false;
if(!this.act) {
this.user_func(this.fo_obj, params);
return true;
}
exec_xml(this.module, this.act, params, this.user_func, response, params, this.fo_obj);
return false;
}
// form proc
function procFilter(fo_obj, filter_func) {
// form문 안에 위지윅 에디터가 세팅되어 있을 경우 에디터의 값과 지정된 content field를 sync
var editor_sequence = fo_obj.getAttribute('editor_sequence');
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined') {
if(jQuery.isFunction(editorRelKeys[editor_sequence]['pasteHTML'])){
var content = editorGetContent(editor_sequence);
editorRelKeys[editor_sequence]['content'].value = content;
}else{
var content = editorGetContent(editor_sequence);
var dummy = xCreateElement("div");
xInnerHtml(dummy, content);
// IE에서 컨텐츠 전체를 P태그로 감싸는 경우가 있어서 이 의미없는 P태그를 제거
if(dummy.firstChild && dummy.firstChild.nodeName == 'P' && dummy.firstChild == dummy.lastChild) {
var content = xInnerHtml(dummy.firstChild);
xInnerHtml(dummy,content);
}
}
var regxPath = new RegExp('(src|href)=("|\'){1}'+request_uri.replace(/\//g,'\\/')+'([^"\']+)("|\'){1}','g');
content = content.replace(regxPath, '$1="./$3"');
editorRelKeys[editor_sequence]['content'].value = content;
}
filter_func(fo_obj);
return false;
}
* @brief Function to process filters
* @deprecated
*/
function procFilter(fo_obj, filter_func)
{
filter_func(fo_obj);
return false;
}