diff --git a/classes/xml/XmlJsFilter.class.php b/classes/xml/XmlJsFilter.class.php
index 48b6512d4..ab6955626 100644
--- a/classes/xml/XmlJsFilter.class.php
+++ b/classes/xml/XmlJsFilter.class.php
@@ -32,7 +32,6 @@
* 3) alpha : check if the value is consists of alphabatic characters.
* 4) number : check if the value is consists of numerical digits
* 5) equalto = target : indicate that values in the form should be equal to those in target
- * 6) pattern_id/regex pattern/[i] : check the value using custom regular expression.
*
* - parameter - param
* name = key : indicate that a new array, 'key' will be created and a value will be assigned to it
@@ -44,7 +43,7 @@
**/
class XmlJsFilter extends XmlParser {
- var $version = '0.2.5';
+ var $version = '0.2.4';
var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치
var $xml_file = NULL; ///< 대상 xml 파일
var $js_file = NULL; ///< 컴파일된 js 파일
@@ -82,11 +81,11 @@
$xml_obj = parent::parse($buff);
// XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링
- $filter_name = $xml_obj->filter->attrs->name;
- $confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code;
- $module = $xml_obj->filter->attrs->module;
- $act = $xml_obj->filter->attrs->act;
- $extend_filter = $xml_obj->filter->attrs->extend_filter;
+ $filter_name = $xml_obj->filter->attrs->name;
+ $confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code;
+ $module = $xml_obj->filter->attrs->module;
+ $act = $xml_obj->filter->attrs->act;
+ $extend_filter = $xml_obj->filter->attrs->extend_filter;
$field_node = $xml_obj->filter->form->node;
if($field_node && !is_array($field_node)) $field_node = array($field_node);
@@ -128,13 +127,26 @@
}
}
+ $callback_func = $xml_obj->filter->response->attrs->callback_func;
+ if(!$callback_func) $callback_func = "filterAlertMessage";
+
// 언어 입력을 위한 사용되는 필드 조사
- $target_list = array();
+ $target_list = array();
$target_type_list = array();
- // javascript contents
- $js_rules = array();
- $js_messages = array();
+ // js function 을 만들기 시작
+ $js_doc = array();
+ $js_doc[] = "function {$filter_name}(fo_obj){";
+ $js_doc[] = "\tvar validator = xe.getApp('validator')[0];";
+ $js_doc[] = "\tif(!validator) return false;";
+ $js_doc[] = "\tif(!fo_obj.elements['_filter']) jQuery(fo_obj).prepend('');";
+ $js_doc[] = "\tfo_obj.elements['_filter'].value = '{$filter_name}';";
+
+ $jsdoc = array();
+ $jsdoc[] = '(function($){';
+ $jsdoc[] = "\tvar validator = xe.getApp('Validator')[0];";
+ $jsdoc[] = "\tif(!validator) return false;";
+ $jsdoc[] = "\tvalidator.cast('ADD_FILTER', ['{$filter_name}', {";
$fields = array();
@@ -145,20 +157,18 @@
$attrs = $node->attrs;
$target = trim($attrs->target);
if(!$target) continue;
+ $filter = $attrs->filter;
- $attrs->filter = trim($attrs->filter);
$attrs->equalto = trim($attrs->equalto);
$field = array();
-
if($attrs->required == 'true') $field[] = 'required:true';
- if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength;
- if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength;
- if($attrs->equalto) $field[] = "equalto:'{$attrs->equalto}'";
- if($attrs->filter) $field[] = "rule:'{$attrs->filter}'";
-
+ if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength;
+ if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength;
+ if($attrs->equalto) $field[] = "equalto:'{$attrs->equalto}'";
+ if($attrs->filter) $field[] = "rule:'{$attrs->filter}'";
$s_field = implode(',', $field);
- $fields[] = "'{$target}': {{$s_field}}";
+ $fields[] = "\t\t'{$target}': {{$s_field}}";
if(!in_array($target, $target_list)) $target_list[] = $target;
if(!$target_type_list[$target]) $target_type_list[$target] = $filter;
@@ -168,20 +178,18 @@
// extend_filter_item 체크
for($i=0;$i<$extend_filter_count;$i++) {
$filter_item = $extend_filter_list[$i];
- $target = trim($filter_item->name);
-
+ $target = trim($filter_item->name);
if(!$target) continue;
-
- $type = $filter_item->type;
- $required = ($filter_item->required == 'true');
+ $type = $filter_item->type;
+ $required = $filter_item->required?'true':'false';
// extend filter item의 type으로 filter를 구함
$types = array('homepage'=>'homepage', 'email_address'=>'email');
$filter = $types[$type]?$types[$type]:'';
$field = array();
- if($required) $field[] = 'required:true';
- if($filter) $field[] = "rule:'{$filter}'";
+ if($filter_item->required == 'true') $field[] = 'required:true';
+ if($filter) $field[] = "rule:'{$filter}'";
$s_field = implode(',', $field);
$fields[] = "\t\t'{$target}' : {{$s_field}}";
@@ -189,18 +197,31 @@
if(!$target_type_list[$target]) $target_type_list[$target] = $type;
}
+ $jsdoc[] = implode(",\n", $fields);
+ $jsdoc[] = "\t}]);";
+
+ // javascript callback function
+ $js_doc[] = "\tvalidator.cast('ADD_CALLBACK', ['{$filter_name}', function(form){";
+ $js_doc[] = "\t\tvar params={}, responses=[], elms=form.elements, data=jQuery(form).serializeArray();";
+ $js_doc[] = "\t\tjQuery.each(data, function(i, field){";
+ $js_doc[] = "\t\t\tvar val = jQuery.trim(field.value);";
+ $js_doc[] = "\t\t\tif(!val) return true;";
+ $js_doc[] = "\t\t\tif(/\[\]$/.test(field.name)) field.name = field.name.replace(/\[\]$/, '');";
+ $js_doc[] = "\t\t\tif(params[field.name]) params[field.name] += '|@|'+val;";
+ $js_doc[] = "\t\t\telse params[field.name] = field.value;";
+ $js_doc[] = "\t\t});";
+
// 데이터를 만들기 위한 parameter script 생성
- $rename_params = array();
$parameter_count = count($parameter_param);
if($parameter_count) {
// 기본 필터 내용의 parameter로 구성
foreach($parameter_param as $key =>$param) {
- $attrs = $param->attrs;
- $name = trim($attrs->name);
+ $attrs = $param->attrs;
+ $name = trim($attrs->name);
$target = trim($attrs->target);
//if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];";
- if($name && $target && ($name != $target)) $rename_params[] = "'{$target}':'{$name}'";
+ if($name && $target && ($name != $target)) $js_doc[] = "\t\tif(params['{$target}']) { params['{$name}'] = params['{$target}']; delete params['{$target}']; }";
if($name && !in_array($name, $target_list)) $target_list[] = $name;
}
@@ -222,13 +243,19 @@
$name = $attrs->name;
$responses[] = "'{$name}'";
}
+ $js_doc[] = "\t\tresponses = [".implode(',', $responses)."];";
- // lang : form field description
+ if ($confirm_msg_code) $js_doc[] = sprintf("\t\tif(!confirm('%s')) return false;", $lang->{$confirm_msg_code});
+
+ $js_doc[] = "\t\texec_xml('{$module}','{$act}', params, {$callback_func}, responses, params, form);";
+ $js_doc[] = "\t}]);";
+
+ // form 필드 lang 값을 기록
$target_count = count($target_list);
for($i=0;$i<$target_count;$i++) {
$target = $target_list[$i];
if(!$lang->{$target}) $lang->{$target} = $target;
- $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $target, addslashes($lang->{$target}));
+ $jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $target, str_replace('\'', '\\\'', $lang->{$target}));
}
// target type을 기록
@@ -241,30 +268,24 @@
}
*/
- // lang : error message
+ // 에러 메세지를 기록
foreach($lang->filter as $key => $val) {
if(!$val) $val = $key;
- $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $key, $val);
+ $jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $key, $val);
+ //$jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $key, str_replace('\'', '\\\'', $val));
}
- $callback_func = $xml_obj->filter->response->attrs->callback_func;
- if(!$callback_func) $callback_func = "filterAlertMessage";
-
- $confirm_msg = '';
- if ($confirm_msg_code) $confirm_msg = $lang->{$confirm_msg_code};
-
- $jsdoc = array();
- $jsdoc[] = "function {$filter_name}(form){ return legacy_filter('{$filter_name}', form, '{$module}', '{$act}', {$callback_func}, [".implode(',', $responses)."], '".addslashes($confirm_msg)."', {".implode(',', $rename_params)."}) };";
- $jsdoc[] = '(function($){';
- $jsdoc[] = "\tvar v=xe.getApp('validator')[0];if(!v)return false;";
- $jsdoc[] = "\t".'v.cast("ADD_FILTER", ["'.$filter_name.'", {'.implode(',', $fields).'}]);';
- $jsdoc[] = "\t".implode("\n\t", $js_rules);
- $jsdoc[] = "\t".implode("\n\t", $js_messages);
$jsdoc[] = '})(jQuery);';
- $jsdoc = implode("\n", $jsdoc);
+
+ $js_doc[] = "\tvalidator.cast('VALIDATE', [fo_obj,'{$filter_name}']);";
+ $js_doc[] = "\treturn false;";
+ $js_doc[] = "};\n";
+
+ $js_doc = implode("\n", $js_doc);
+ $jsdoc = implode("\n", $jsdoc);
// js파일 생성
- FileHandler::writeFile($this->js_file, $jsdoc);
+ FileHandler::writeFile($this->js_file, $js_doc."\n".$jsdoc);
}
/**
diff --git a/common/js/src/xml_js_filter.js b/common/js/src/xml_js_filter.js
index 089acd46c..d2cedc243 100644
--- a/common/js/src/xml_js_filter.js
+++ b/common/js/src/xml_js_filter.js
@@ -111,15 +111,13 @@ var Validator = xe.createApp('Validator', {
if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false));
}
- if (rule) {
- $.each(rule, function() {
- var ret = self.cast('APPLY_RULE', [this, val]);
- if (!ret) {
- self.cast('ALERT', [form, name, 'invalid_'+this]);
- return (result = false);
- }
- });
- }
+ $.each(rule, function() {
+ var ret = self.cast('APPLY_RULE', [this, val]);
+ if (!ret) {
+ self.cast('ALERT', [form, name, 'invalid_'+this]);
+ return (result = false);
+ }
+ });
if (!result) return false;
});
@@ -180,7 +178,7 @@ var Validator = xe.createApp('Validator', {
delete extras[name];
},
API_APPLY_RULE : function(sender, params) {
- var name = params[0];
+ var name = params[0].toLowerCase();
var value = params[1];
if (typeof(rules[name]) == 'undefined') return true; // no filter
@@ -296,35 +294,8 @@ function filterAlertMessage(ret_obj) {
* @brief Function to process filters
* @deprecated
*/
-function procFilter(form, filter_func) {
- filter_func(form);
+function procFilter(fo_obj, filter_func)
+{
+ filter_func(fo_obj);
return false;
}
-
-function legacy_filter(filter_name, form, module, act, callback, responses, confirm_msg) {
- var v = xe.getApp('validator')[0], $ = jQuery, args = [];
-
- if (!v) return false;
-
- if (!form.elements['_filter']) $(form).prepend('');
- form.elements['_filter'].value = filter_name;
-
- args[0] = filter_name;
- args[1] = function(f) {
- var params = {}, res = [], elms = f.elements, data = $(f).serializeArray();
- $.each(data, function(i, field) {
- var v = $.trim(field.value);
- if(!v) return false;
- if(/\[\]$/.test(field.name)) field.name = field.name.replace(/\[\]$/, '');
- if(params[field.name]) params[field.name] += '|@|'+v;
- else params[field.name] = field.value;
- });
- if (confirm_msg && !confirm(confirm_msg)) return false;
- exec_xml(module, act, params, callback, responses, params, form);
- };
-
- v.cast('ADD_CALLBACK', args);
- v.cast('VALIDATE', [form, filter_name]);
-
- return false;
-}
\ No newline at end of file
diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js
index 9de3b12f1..7eef1ff94 100644
--- a/common/js/xml_js_filter.js
+++ b/common/js/xml_js_filter.js
@@ -6,9 +6,7 @@
* A rule is a method validate one field.
* A filter is made up of one or more rules.
**/
-
(function($){var messages=[];var rules=[];var filters=[];var callbacks=[];var extras={};var Validator=xe.createApp('Validator',{init:function(){var regEmail=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/;this.cast('ADD_RULE',['email',regEmail]);this.cast('ADD_RULE',['email_address',regEmail]);var regUserid=/^[a-z]+[\w-]*[a-z0-9_]+$/i;this.cast('ADD_RULE',['userid',regUserid]);this.cast('ADD_RULE',['user_id',regUserid]);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]);var regKor=/^[가-힣]*$/;this.cast('ADD_RULE',['korean',regKor]);var regKorNum=/^[가-힣0-9]*$/;this.cast('ADD_RULE',['korean_number',regKorNum]);var regAlpha=/^[a-z]*$/i;this.cast('ADD_RULE',['alpha',regAlpha]);var regAlphaNum=/^[a-z][a-z0-9_]*$/i;this.cast('ADD_RULE',['alpha_number',regAlphaNum]);var regNum=/^[0-9]*$/;this.cast('ADD_RULE',['number',regNum]);},run:function(oForm){var filter='';if(oForm._filter)filter=oForm._filter.value;var params=[oForm,filter];var result=this.cast('VALIDATE',params);if(typeof result=='undefined')result=false;return result;},API_ONREADY:function(){var self=this;$('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 bResult;});},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=$.extend({},filters[filter.toLowerCase()]||{},extras);$.each(filter,function(name){var _el=form.elements[name];if(!_el)return true;var el=$(_el),val=$.trim(get_value(el));var minlen=parseInt(this.minlength)||0;var maxlen=parseInt(this.maxlength)||0;var rule=(this.rule||'').split(',');if(this.required&&!val)return(result=(!!self.cast('ALERT',[form,name,'isnull'])&&false));if(!this.required&&!val)return(result=true);if((minlen&&val.lengthmaxlen))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));}
-if(rule){$.each(rule,function(){var ret=self.cast('APPLY_RULE',[this,val]);if(!ret){self.cast('ALERT',[form,name,'invalid_'+this]);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_ADD_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();var prop=params[1];extras[name]=prop;},API_GET_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();return extras[name];},API_DEL_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();delete extras[name];},API_APPLY_RULE:function(sender,params){var name=params[0];var value=params[1];if(typeof(rules[name])=='undefined')return true;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(minlen||maxlen)msg+='('+(minlen||'')+'~'+(maxlen||'')+')';this.cast('SHOW_ALERT',[msg]);$(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;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){try{editorRelKeys[seq].content.value=editorRelKeys[seq].func(seq)||'';}catch(e){}}}});oValidator.registerPlugin(new EditorStub);function get_value(elem){var vals=[];if(elem.is(':radio')){return elem.filter(':checked').val();}else if(elem.is(':checkbox')){elem.filter(':checked').each(function(){vals.push(this.value);});return vals.join('|@|');}else{return elem.val();}}})(jQuery);function filterAlertMessage(ret_obj){var error=ret_obj["error"];var message=ret_obj["message"];var act=ret_obj["act"];var redirect_url=ret_obj["redirect_url"];var url=location.href;if(typeof(message)!="undefined"&&message&&message!="success")alert(message);if(typeof(act)!="undefined"&&act)url=current_url.setQuery("act",act);else if(typeof(redirect_url)!="undefined"&&redirect_url)url=redirect_url;if(url==location.href)url=url.replace(/#(.*)$/,'');location.href=url;}
-function procFilter(form,filter_func){filter_func(form);return false;}
-function legacy_filter(filter_name,form,module,act,callback,responses,confirm_msg){var v=xe.getApp('validator')[0],$=jQuery,args=[];if(!v)return false;if(!form.elements['_filter'])$(form).prepend('');form.elements['_filter'].value=filter_name;args[0]=filter_name;args[1]=function(f){var params={},res=[],elms=f.elements,data=$(f).serializeArray();$.each(data,function(i,field){var v=$.trim(field.value);if(!v)return false;if(/\[\]$/.test(field.name))field.name=field.name.replace(/\[\]$/,'');if(params[field.name])params[field.name]+='|@|'+v;else params[field.name]=field.value;});if(confirm_msg&&!confirm(confirm_msg))return false;exec_xml(module,act,params,callback,responses,params,form);};v.cast('ADD_CALLBACK',args);v.cast('VALIDATE',[form,filter_name]);return false;}
\ No newline at end of file
+$.each(rule,function(){var ret=self.cast('APPLY_RULE',[this,val]);if(!ret){self.cast('ALERT',[form,name,'invalid_'+this]);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_ADD_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();var prop=params[1];extras[name]=prop;},API_GET_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();return extras[name];},API_DEL_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();delete extras[name];},API_APPLY_RULE:function(sender,params){var name=params[0].toLowerCase();var value=params[1];if(typeof(rules[name])=='undefined')return true;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(minlen||maxlen)msg+='('+(minlen||'')+'~'+(maxlen||'')+')';this.cast('SHOW_ALERT',[msg]);$(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;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){try{editorRelKeys[seq].content.value=editorRelKeys[seq].func(seq)||'';}catch(e){}}}});oValidator.registerPlugin(new EditorStub);function get_value(elem){var vals=[];if(elem.is(':radio')){return elem.filter(':checked').val();}else if(elem.is(':checkbox')){elem.filter(':checked').each(function(){vals.push(this.value);});return vals.join('|@|');}else{return elem.val();}}})(jQuery);function filterAlertMessage(ret_obj){var error=ret_obj["error"];var message=ret_obj["message"];var act=ret_obj["act"];var redirect_url=ret_obj["redirect_url"];var url=location.href;if(typeof(message)!="undefined"&&message&&message!="success")alert(message);if(typeof(act)!="undefined"&&act)url=current_url.setQuery("act",act);else if(typeof(redirect_url)!="undefined"&&redirect_url)url=redirect_url;if(url==location.href)url=url.replace(/#(.*)$/,'');location.href=url;}
+function procFilter(fo_obj,filter_func)
+{filter_func(fo_obj);return false;}
\ No newline at end of file