#19524468 XML JS Filter 코드 정리 : 생성되는 코드가 조금 더 가볍도록 수정

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@8083 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
taggon 2011-02-10 06:10:36 +00:00
parent f77ad8755d
commit 352ec132a8
15 changed files with 171 additions and 165 deletions

View file

@ -32,6 +32,7 @@
* 3) alpha : check if the value is consists of alphabatic characters. * 3) alpha : check if the value is consists of alphabatic characters.
* 4) number : check if the value is consists of numerical digits * 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 * 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 * - parameter - param
* name = key : indicate that a new array, 'key' will be created and a value will be assigned to it * name = key : indicate that a new array, 'key' will be created and a value will be assigned to it
@ -43,7 +44,7 @@
**/ **/
class XmlJsFilter extends XmlParser { class XmlJsFilter extends XmlParser {
var $version = '0.2.4'; var $version = '0.2.5';
var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치
var $xml_file = NULL; ///< 대상 xml 파일 var $xml_file = NULL; ///< 대상 xml 파일
var $js_file = NULL; ///< 컴파일된 js 파일 var $js_file = NULL; ///< 컴파일된 js 파일
@ -81,11 +82,11 @@
$xml_obj = parent::parse($buff); $xml_obj = parent::parse($buff);
// XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링 // XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링
$filter_name = $xml_obj->filter->attrs->name; $filter_name = $xml_obj->filter->attrs->name;
$confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code; $confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code;
$module = $xml_obj->filter->attrs->module; $module = $xml_obj->filter->attrs->module;
$act = $xml_obj->filter->attrs->act; $act = $xml_obj->filter->attrs->act;
$extend_filter = $xml_obj->filter->attrs->extend_filter; $extend_filter = $xml_obj->filter->attrs->extend_filter;
$field_node = $xml_obj->filter->form->node; $field_node = $xml_obj->filter->form->node;
if($field_node && !is_array($field_node)) $field_node = array($field_node); if($field_node && !is_array($field_node)) $field_node = array($field_node);
@ -127,26 +128,13 @@
} }
} }
$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(); $target_type_list = array();
// js function 을 만들기 시작 // javascript contents
$js_doc = array(); $js_rules = array();
$js_doc[] = "function {$filter_name}(fo_obj){"; $js_messages = array();
$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('<input type=\"hidden\" name=\"_filter\" value=\"\" />');";
$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(); $fields = array();
@ -157,18 +145,20 @@
$attrs = $node->attrs; $attrs = $node->attrs;
$target = trim($attrs->target); $target = trim($attrs->target);
if(!$target) continue; if(!$target) continue;
$filter = $attrs->filter;
$attrs->filter = trim($attrs->filter);
$attrs->equalto = trim($attrs->equalto); $attrs->equalto = trim($attrs->equalto);
$field = array(); $field = array();
if($attrs->required == 'true') $field[] = 'required:true'; if($attrs->required == 'true') $field[] = 'required:true';
if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength; if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength;
if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength; if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength;
if($attrs->equalto) $field[] = "equalto:'{$attrs->equalto}'"; if($attrs->equalto) $field[] = "equalto:'{$attrs->equalto}'";
if($attrs->filter) $field[] = "rule:'{$attrs->filter}'"; if($attrs->filter) $field[] = "rule:'{$attrs->filter}'";
$s_field = implode(',', $field); $s_field = implode(',', $field);
$fields[] = "\t\t'{$target}': {{$s_field}}"; $fields[] = "'{$target}': {{$s_field}}";
if(!in_array($target, $target_list)) $target_list[] = $target; if(!in_array($target, $target_list)) $target_list[] = $target;
if(!$target_type_list[$target]) $target_type_list[$target] = $filter; if(!$target_type_list[$target]) $target_type_list[$target] = $filter;
@ -178,18 +168,20 @@
// extend_filter_item 체크 // extend_filter_item 체크
for($i=0;$i<$extend_filter_count;$i++) { for($i=0;$i<$extend_filter_count;$i++) {
$filter_item = $extend_filter_list[$i]; $filter_item = $extend_filter_list[$i];
$target = trim($filter_item->name); $target = trim($filter_item->name);
if(!$target) continue; if(!$target) continue;
$type = $filter_item->type;
$required = $filter_item->required?'true':'false'; $type = $filter_item->type;
$required = ($filter_item->required == 'true');
// extend filter item의 type으로 filter를 구함 // extend filter item의 type으로 filter를 구함
$types = array('homepage'=>'homepage', 'email_address'=>'email'); $types = array('homepage'=>'homepage', 'email_address'=>'email');
$filter = $types[$type]?$types[$type]:''; $filter = $types[$type]?$types[$type]:'';
$field = array(); $field = array();
if($filter_item->required == 'true') $field[] = 'required:true'; if($required) $field[] = 'required:true';
if($filter) $field[] = "rule:'{$filter}'"; if($filter) $field[] = "rule:'{$filter}'";
$s_field = implode(',', $field); $s_field = implode(',', $field);
$fields[] = "\t\t'{$target}' : {{$s_field}}"; $fields[] = "\t\t'{$target}' : {{$s_field}}";
@ -197,31 +189,18 @@
if(!$target_type_list[$target]) $target_type_list[$target] = $type; 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 생성 // 데이터를 만들기 위한 parameter script 생성
$rename_params = array();
$parameter_count = count($parameter_param); $parameter_count = count($parameter_param);
if($parameter_count) { if($parameter_count) {
// 기본 필터 내용의 parameter로 구성 // 기본 필터 내용의 parameter로 구성
foreach($parameter_param as $key =>$param) { foreach($parameter_param as $key =>$param) {
$attrs = $param->attrs; $attrs = $param->attrs;
$name = trim($attrs->name); $name = trim($attrs->name);
$target = trim($attrs->target); $target = trim($attrs->target);
//if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];"; //if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];";
if($name && $target && ($name != $target)) $js_doc[] = "\t\tif(params['{$target}']) { params['{$name}'] = params['{$target}']; delete params['{$target}']; }"; if($name && $target && ($name != $target)) $rename_params[] = "'{$target}':'{$name}'";
if($name && !in_array($name, $target_list)) $target_list[] = $name; if($name && !in_array($name, $target_list)) $target_list[] = $name;
} }
@ -243,19 +222,13 @@
$name = $attrs->name; $name = $attrs->name;
$responses[] = "'{$name}'"; $responses[] = "'{$name}'";
} }
$js_doc[] = "\t\tresponses = [".implode(',', $responses)."];";
if ($confirm_msg_code) $js_doc[] = sprintf("\t\tif(!confirm('%s')) return false;", $lang->{$confirm_msg_code}); // lang : form field description
$js_doc[] = "\t\texec_xml('{$module}','{$act}', params, {$callback_func}, responses, params, form);";
$js_doc[] = "\t}]);";
// form 필드 lang 값을 기록
$target_count = count($target_list); $target_count = count($target_list);
for($i=0;$i<$target_count;$i++) { for($i=0;$i<$target_count;$i++) {
$target = $target_list[$i]; $target = $target_list[$i];
if(!$lang->{$target}) $lang->{$target} = $target; if(!$lang->{$target}) $lang->{$target} = $target;
$jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $target, str_replace('\'', '\\\'', $lang->{$target})); $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $target, addslashes($lang->{$target}));
} }
// target type을 기록 // target type을 기록
@ -268,24 +241,30 @@
} }
*/ */
// 에러 메세지를 기록 // lang : error message
foreach($lang->filter as $key => $val) { foreach($lang->filter as $key => $val) {
if(!$val) $val = $key; if(!$val) $val = $key;
$jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $key, $val); $js_messages[] = sprintf("v.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[] = '})(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파일 생성 // js파일 생성
FileHandler::writeFile($this->js_file, $js_doc."\n".$jsdoc); FileHandler::writeFile($this->js_file, $jsdoc);
} }
/** /**

View file

@ -111,13 +111,15 @@ var Validator = xe.createApp('Validator', {
if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false)); if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false));
} }
$.each(rule, function() { if (rule) {
var ret = self.cast('APPLY_RULE', [this, val]); $.each(rule, function() {
if (!ret) { var ret = self.cast('APPLY_RULE', [this, val]);
self.cast('ALERT', [form, name, 'invalid_'+this]); if (!ret) {
return (result = false); self.cast('ALERT', [form, name, 'invalid_'+this]);
} return (result = false);
}); }
});
}
if (!result) return false; if (!result) return false;
}); });
@ -178,7 +180,7 @@ var Validator = xe.createApp('Validator', {
delete extras[name]; delete extras[name];
}, },
API_APPLY_RULE : function(sender, params) { API_APPLY_RULE : function(sender, params) {
var name = params[0].toLowerCase(); var name = params[0];
var value = params[1]; var value = params[1];
if (typeof(rules[name]) == 'undefined') return true; // no filter if (typeof(rules[name]) == 'undefined') return true; // no filter
@ -294,8 +296,35 @@ function filterAlertMessage(ret_obj) {
* @brief Function to process filters * @brief Function to process filters
* @deprecated * @deprecated
*/ */
function procFilter(fo_obj, filter_func) function procFilter(form, filter_func) {
{ filter_func(form);
filter_func(fo_obj);
return false; 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('<input type="hidden" name="_filter" />');
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;
}

View file

@ -6,7 +6,9 @@
* A rule is a method validate one field. * A rule is a method validate one field.
* A filter is made up of one or more rules. * 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.length<minlen)||(maxlen&&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));} (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.length<minlen)||(maxlen&&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){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;} 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);}});}
function procFilter(fo_obj,filter_func) 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;}
{filter_func(fo_obj);return false;} 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('<input type="hidden" name="_filter" />');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;}

View file

@ -275,4 +275,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -271,4 +271,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -275,4 +275,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -277,4 +277,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -277,4 +277,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -277,4 +277,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -278,4 +278,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -277,4 +277,5 @@
$lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->autosave_mins_ago = '%d분 전';
$lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -278,4 +278,5 @@
$lang->edit->autosave_mins_ago = '%d分前'; $lang->edit->autosave_mins_ago = '%d分前';
$lang->edit->upload_not_enough_quota = '已超過上傳大小限制無法上傳附檔。'; $lang->edit->upload_not_enough_quota = '已超過上傳大小限制無法上傳附檔。';
$lang->edit->toolbar_moreless = '도구 모음 더보기/접기';
?> ?>

View file

@ -895,24 +895,26 @@ var TextWriter = xe.createPlugin('TextWriter', {
obj.children('div._txt').each(function(){ obj.children('div._txt').each(function(){
var div = $(this), node = null; var div = $(this), node = null;
div.contents().each(function(){ div
var t = $(this); .contents()
.each(function(){
var $this = $(this);
if(this.nodeType == 3 || t.is('br,a,b,i,s,u,sub,sup,em,strong,span,img,font')) { if(this.nodeType == 3 || $this.is('br,a,b,i,s,u,sub,sup,em,strong,span,img,font')) {
if( t.is('br,img') || $.trim(t.text()) ) { if( $this.is('br,img') || $.trim($this.text()) ) {
if(!node) div.before(node = $('<p>')); if(!node) div.before(node = $('<p>'));
node.append(this); node.append(this);
} else { } else {
t.remove(); $this.remove();
} }
return true; return true;
} }
div.before(t); div.before($this);
node = null; node = null;
}); })
.end()
div.remove(); .remove();
}); });
}, },
API_OPEN_TXT_EDITOR : function(sender, params) { API_OPEN_TXT_EDITOR : function(sender, params) {
@ -961,6 +963,7 @@ var TextWriter = xe.createPlugin('TextWriter', {
if(save) { if(save) {
var newBox = $('<div>').html( cfg.xpress.getIR() ); var newBox = $('<div>').html( cfg.xpress.getIR() );
if (newBox.find('>p'))
box.remove(); box.remove();
this.cast('SAVE_PARAGRAPH', [seq, cfg.editor, box=newBox, 'TXT']); this.cast('SAVE_PARAGRAPH', [seq, cfg.editor, box=newBox, 'TXT']);
} else { } else {

View file

@ -1,14 +1,3 @@
/* 로그인 영역에 포커스 */
function doFocusUserId(fo_id) {
if(xScrollTop()) return;
var fo_obj = xGetElementById(fo_id);
if(fo_obj.user_id) {
try{
fo_obj.user_id.focus();
} catch(e) {};
}
}
/* 로그인 후 */ /* 로그인 후 */
function completeLogin(ret_obj, response_tags, params, fo_obj) { function completeLogin(ret_obj, response_tags, params, fo_obj) {
var url = current_url.setQuery('act',''); var url = current_url.setQuery('act','');
@ -21,16 +10,21 @@ function completeOpenIDLogin(ret_obj, response_tags) {
location.href = redirect_url; location.href = redirect_url;
} }
/* 오픈 아이디 폼 변환 */ jQuery(function($){
function toggleLoginForm(obj) { $('#openid_login').hide();
if(xGetElementById('login').style.display != "none") { $('#keepid').click(function(){ if(this.checked) return confirm(keep_signed_msg) });
xGetElementById('login').style.display = "none";
xGetElementById('openid_login').style.display = "block"; /* focus on login form */
xGetElementById('use_open_id_2').checked = true; if (!$(document).scrollTop()) $('#fo_login_widget input[name=user_id]').focus();
} else {
xGetElementById('openid_login').style.display = "none"; // show/hide openid form
xGetElementById('login').style.display = "block"; $('#use_open_id,#use_open_id_2').click(function(){
xGetElementById('use_open_id').checked = false; if($('#login').toggle().is(':visible')) {
xGetElementById('use_open_id_2').checked = false; $('#openid_login').hide();
} $('#use_open_id,#use_open_id_2').removeAttr('checked');
} } else {
$('#openid_login').show();
$('#use_open_id_2').attr('checked', 'checked');
}
});
});

View file

@ -7,52 +7,43 @@
<!--%import("css/default.css")--> <!--%import("css/default.css")-->
<!--@end--> <!--@end-->
<!--%import("./filter/login.xml")--> <load target="./filter/login.xml" />
<!--%import("./filter/openid_login.xml")--> <load target="./filter/openid_login.xml" />
<!--%import("./js/login.js")--> <load target="./js/login.js" />
<script type="text/javascript">
var keep_signed_msg = "{$lang->about_keep_signed}";
xAddEventListener(window, "load", function(){ doFocusUserId("fo_login_widget"); });
</script>
<fieldset id="login" class="login_{$colorset}"> <fieldset id="login" class="login_{$colorset}">
<legend>{$lang->cmd_login}</legend> <legend>{$lang->cmd_login}</legend>
<form action="./" method="post" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget"> <form action="./" method="post" onsubmit="return procFilter(this, widget_login)" id="fo_login_widget">
<div class="idpwWrap">
<div class="idpw">
<input name="user_id" type="text" title="user id" />
<input name="password" type="password" title="password" />
</div>
<input type="image" src="./images/{$colorset}/buttonLogin.gif" alt="login" class="login" />
</div>
<p class="securitySignIn SSL"|cond="$ssl_mode" class="securitySignIn noneSSL"|cond="!$ssl_mode" cond="$member_config->enable_ssl=='Y'">
<a href="#" onclick="toggleSecuritySignIn(); return false;">{$lang->security_sign_in}</a>
</p>
<p class="save">
<input type="checkbox" name="keep_signed" id="keepid" value="Y" />
<label for="keepid">{$lang->keep_signed}</label>
<div class="idpwWrap"> <block cond="$member_config->enable_openid=='Y'">
<div class="idpw"> <br />
<input name="user_id" type="text" title="user id" /> <input name="use_open_id" id="use_open_id" type="checkbox" value="Y" />
<input name="password" type="password" title="password" /> <label for="use_open_id">Open ID</label>
</div> </block>
<input type="image" src="./images/{$colorset}/buttonLogin.gif" alt="login" class="login" /> </p>
</div> <ul class="help">
<!--@if($member_config->enable_ssl=='Y')--> <li class="first-child"><a href="{getUrl('act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<p class="securitySignIn <!--@if($ssl_mode)-->SSL<!--@else-->noneSSL<!--@end-->"> <li><a href="{getUrl('act','dispMemberFindAccount')}">{$lang->cmd_find_member_account}</a></li>
<a href="#" onclick="toggleSecuritySignIn(); return false;">{$lang->security_sign_in}</a> <li><a href="{getUrl('act','dispMemberResendAuthMail')}">{$lang->cmd_resend_auth_mail}</a></li>
</p> </ul>
<!--@end-->
<p class="save">
<input type="checkbox" name="keep_signed" id="keepid" value="Y" onclick="if(this.checked) return confirm(keep_signed_msg);" />
<label for="keepid">{$lang->keep_signed}</label>
<!--@if($member_config->enable_openid=='Y')-->
<br />
<input name="use_open_id" id="use_open_id" type="checkbox" value="Y" onclick="toggleLoginForm(this); return false;" />
<label for="use_open_id">Open ID</label>
<!--@end-->
</p>
<ul class="help">
<li class="first-child"><a href="{getUrl('act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<li><a href="{getUrl('act','dispMemberFindAccount')}">{$lang->cmd_find_member_account}</a></li>
<li><a href="{getUrl('act','dispMemberResendAuthMail')}">{$lang->cmd_resend_auth_mail}</a></li>
</ul>
</form> </form>
</fieldset> </fieldset>
<!-- OpenID --> <!-- OpenID -->
<!--@if($member_config->enable_openid=='Y')--> <fieldset id="openid_login" class="openid_login_{$colorset}" cond="$member_config->enable_openid=='Y'">
<fieldset id="openid_login" class="openid_login_{$colorset}" style="display:none;">
<legend>{$lang->cmd_login}</legend> <legend>{$lang->cmd_login}</legend>
<form action="{getUrl('module','member','act','procMemberOpenIDLogin')}" method="post" onsubmit="return procFilter(this, openid_login)" > <form action="{getUrl('module','member','act','procMemberOpenIDLogin')}" method="post" onsubmit="return procFilter(this, openid_login)" >
<div class="idpwWrap"> <div class="idpwWrap">
@ -63,13 +54,12 @@
<input type="image" src="./images/{$colorset}/buttonLogin.gif" alt="login" class="login" /> <input type="image" src="./images/{$colorset}/buttonLogin.gif" alt="login" class="login" />
</div> </div>
<p class="save"> <p class="save">
<input name="use_open_id" id="use_open_id_2" type="checkbox" value="Y" onclick="toggleLoginForm(this); return false;"/> <input name="use_open_id" id="use_open_id_2" type="checkbox" value="Y"/>
<label for="use_open_id_2">Open ID</label> <label for="use_open_id_2">Open ID</label>
</p> </p>
</form> </form>
</fieldset> </fieldset>
<!--@end-->
<script type="text/javascript"> <script type="text/javascript">
xAddEventListener(window, "load", function(){ doFocusUserId("fo_login_widget"); }); var keep_signed_msg = "{$lang->about_keep_signed}";
</script> </script>