From 352ec132a89ba2e8eccb10000779ff2992f212c7 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 10 Feb 2011 06:10:36 +0000 Subject: [PATCH] =?UTF-8?q?#19524468=20XML=20JS=20Filter=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC=20:=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=BD=94=EB=93=9C=EA=B0=80=20=EC=A1=B0?= =?UTF-8?q?=EA=B8=88=20=EB=8D=94=20=EA=B0=80=EB=B3=8D=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@8083 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/XmlJsFilter.class.php | 119 ++++++++---------- common/js/src/xml_js_filter.js | 51 ++++++-- common/js/xml_js_filter.js | 8 +- modules/editor/lang/en.lang.php | 1 + modules/editor/lang/es.lang.php | 1 + modules/editor/lang/fr.lang.php | 1 + modules/editor/lang/jp.lang.php | 1 + modules/editor/lang/ko.lang.php | 1 + modules/editor/lang/ru.lang.php | 1 + modules/editor/lang/vi.lang.php | 1 + modules/editor/lang/zh-CN.lang.php | 1 + modules/editor/lang/zh-TW.lang.php | 1 + modules/editor/skins/dreditor/js/DrEditor.js | 35 +++--- .../login_info/skins/xe_official/js/login.js | 42 +++---- .../skins/xe_official/login_form.html | 72 +++++------ 15 files changed, 171 insertions(+), 165 deletions(-) diff --git a/classes/xml/XmlJsFilter.class.php b/classes/xml/XmlJsFilter.class.php index ab6955626..48b6512d4 100644 --- a/classes/xml/XmlJsFilter.class.php +++ b/classes/xml/XmlJsFilter.class.php @@ -32,6 +32,7 @@ * 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 @@ -43,7 +44,7 @@ **/ class XmlJsFilter extends XmlParser { - var $version = '0.2.4'; + var $version = '0.2.5'; var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 var $xml_file = NULL; ///< 대상 xml 파일 var $js_file = NULL; ///< 컴파일된 js 파일 @@ -81,11 +82,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); @@ -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(); - // 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}', {"; + // javascript contents + $js_rules = array(); + $js_messages = array(); $fields = array(); @@ -157,18 +145,20 @@ $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[] = "\t\t'{$target}': {{$s_field}}"; + $fields[] = "'{$target}': {{$s_field}}"; if(!in_array($target, $target_list)) $target_list[] = $target; if(!$target_type_list[$target]) $target_type_list[$target] = $filter; @@ -178,18 +168,20 @@ // 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':'false'; + + $type = $filter_item->type; + $required = ($filter_item->required == 'true'); // extend filter item의 type으로 filter를 구함 $types = array('homepage'=>'homepage', 'email_address'=>'email'); $filter = $types[$type]?$types[$type]:''; $field = array(); - if($filter_item->required == 'true') $field[] = 'required:true'; - if($filter) $field[] = "rule:'{$filter}'"; + if($required) $field[] = 'required:true'; + if($filter) $field[] = "rule:'{$filter}'"; $s_field = implode(',', $field); $fields[] = "\t\t'{$target}' : {{$s_field}}"; @@ -197,31 +189,18 @@ 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)) $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; } @@ -243,19 +222,13 @@ $name = $attrs->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}); - - $js_doc[] = "\t\texec_xml('{$module}','{$act}', params, {$callback_func}, responses, params, form);"; - $js_doc[] = "\t}]);"; - - // form 필드 lang 값을 기록 + // lang : form field description $target_count = count($target_list); for($i=0;$i<$target_count;$i++) { $target = $target_list[$i]; 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을 기록 @@ -268,24 +241,30 @@ } */ - // 에러 메세지를 기록 + // lang : error message foreach($lang->filter as $key => $val) { if(!$val) $val = $key; - $jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $key, $val); - //$jsdoc[] = sprintf("\tvalidator.cast('ADD_MESSAGE', ['%s', '%s']);", $key, str_replace('\'', '\\\'', $val)); + $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $key, $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);'; - - $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); + $jsdoc = implode("\n", $jsdoc); // js파일 생성 - FileHandler::writeFile($this->js_file, $js_doc."\n".$jsdoc); + FileHandler::writeFile($this->js_file, $jsdoc); } /** diff --git a/common/js/src/xml_js_filter.js b/common/js/src/xml_js_filter.js index d2cedc243..089acd46c 100644 --- a/common/js/src/xml_js_filter.js +++ b/common/js/src/xml_js_filter.js @@ -111,13 +111,15 @@ var Validator = xe.createApp('Validator', { 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 (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; }); @@ -178,7 +180,7 @@ var Validator = xe.createApp('Validator', { delete extras[name]; }, API_APPLY_RULE : function(sender, params) { - var name = params[0].toLowerCase(); + var name = params[0]; var value = params[1]; if (typeof(rules[name]) == 'undefined') return true; // no filter @@ -294,8 +296,35 @@ function filterAlertMessage(ret_obj) { * @brief Function to process filters * @deprecated */ -function procFilter(fo_obj, filter_func) -{ - filter_func(fo_obj); +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 diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 7eef1ff94..9de3b12f1 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -6,7 +6,9 @@ * 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));} -$.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 +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 diff --git a/modules/editor/lang/en.lang.php b/modules/editor/lang/en.lang.php index 78ddb081d..7ce5a9de4 100644 --- a/modules/editor/lang/en.lang.php +++ b/modules/editor/lang/en.lang.php @@ -275,4 +275,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> diff --git a/modules/editor/lang/es.lang.php b/modules/editor/lang/es.lang.php index 76c761182..e9a2b2079 100644 --- a/modules/editor/lang/es.lang.php +++ b/modules/editor/lang/es.lang.php @@ -271,4 +271,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/lang/fr.lang.php b/modules/editor/lang/fr.lang.php index 3d62a0cff..9353c8365 100644 --- a/modules/editor/lang/fr.lang.php +++ b/modules/editor/lang/fr.lang.php @@ -275,4 +275,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index b393c356d..3b055fca3 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -277,4 +277,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> diff --git a/modules/editor/lang/ko.lang.php b/modules/editor/lang/ko.lang.php index 6e4e59be8..9318f459c 100644 --- a/modules/editor/lang/ko.lang.php +++ b/modules/editor/lang/ko.lang.php @@ -277,4 +277,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/lang/ru.lang.php b/modules/editor/lang/ru.lang.php index 9dca84645..8e57e7d6f 100644 --- a/modules/editor/lang/ru.lang.php +++ b/modules/editor/lang/ru.lang.php @@ -277,4 +277,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/lang/vi.lang.php b/modules/editor/lang/vi.lang.php index e24823878..f864b8915 100644 --- a/modules/editor/lang/vi.lang.php +++ b/modules/editor/lang/vi.lang.php @@ -278,4 +278,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/lang/zh-CN.lang.php b/modules/editor/lang/zh-CN.lang.php index f1d7efc0d..38fb4e595 100644 --- a/modules/editor/lang/zh-CN.lang.php +++ b/modules/editor/lang/zh-CN.lang.php @@ -277,4 +277,5 @@ $lang->edit->autosave_mins_ago = '%d분 전'; $lang->edit->upload_not_enough_quota = '허용된 용량이 부족하여 파일을 첨부할 수 없습니다.'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index bd0f19ab5..41e6c3e5a 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -278,4 +278,5 @@ $lang->edit->autosave_mins_ago = '%d分前'; $lang->edit->upload_not_enough_quota = '已超過上傳大小限制無法上傳附檔。'; + $lang->edit->toolbar_moreless = '도구 모음 더보기/접기'; ?> \ No newline at end of file diff --git a/modules/editor/skins/dreditor/js/DrEditor.js b/modules/editor/skins/dreditor/js/DrEditor.js index 51470a3f6..58ddfb1ed 100644 --- a/modules/editor/skins/dreditor/js/DrEditor.js +++ b/modules/editor/skins/dreditor/js/DrEditor.js @@ -895,24 +895,26 @@ var TextWriter = xe.createPlugin('TextWriter', { obj.children('div._txt').each(function(){ var div = $(this), node = null; - div.contents().each(function(){ - var t = $(this); + div + .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( t.is('br,img') || $.trim(t.text()) ) { - if(!node) div.before(node = $('

')); - node.append(this); - } else { - t.remove(); - } - return true; - } + if(this.nodeType == 3 || $this.is('br,a,b,i,s,u,sub,sup,em,strong,span,img,font')) { + if( $this.is('br,img') || $.trim($this.text()) ) { + if(!node) div.before(node = $('

')); + node.append(this); + } else { + $this.remove(); + } + return true; + } - div.before(t); - node = null; - }); - - div.remove(); + div.before($this); + node = null; + }) + .end() + .remove(); }); }, API_OPEN_TXT_EDITOR : function(sender, params) { @@ -961,6 +963,7 @@ var TextWriter = xe.createPlugin('TextWriter', { if(save) { var newBox = $('

').html( cfg.xpress.getIR() ); + if (newBox.find('>p')) box.remove(); this.cast('SAVE_PARAGRAPH', [seq, cfg.editor, box=newBox, 'TXT']); } else { diff --git a/widgets/login_info/skins/xe_official/js/login.js b/widgets/login_info/skins/xe_official/js/login.js index 7e44a5637..770c82a19 100644 --- a/widgets/login_info/skins/xe_official/js/login.js +++ b/widgets/login_info/skins/xe_official/js/login.js @@ -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) { var url = current_url.setQuery('act',''); @@ -21,16 +10,21 @@ function completeOpenIDLogin(ret_obj, response_tags) { location.href = redirect_url; } -/* 오픈 아이디 폼 변환 */ -function toggleLoginForm(obj) { - if(xGetElementById('login').style.display != "none") { - xGetElementById('login').style.display = "none"; - xGetElementById('openid_login').style.display = "block"; - xGetElementById('use_open_id_2').checked = true; - } else { - xGetElementById('openid_login').style.display = "none"; - xGetElementById('login').style.display = "block"; - xGetElementById('use_open_id').checked = false; - xGetElementById('use_open_id_2').checked = false; - } -} +jQuery(function($){ + $('#openid_login').hide(); + $('#keepid').click(function(){ if(this.checked) return confirm(keep_signed_msg) }); + + /* focus on login form */ + if (!$(document).scrollTop()) $('#fo_login_widget input[name=user_id]').focus(); + + // show/hide openid form + $('#use_open_id,#use_open_id_2').click(function(){ + if($('#login').toggle().is(':visible')) { + $('#openid_login').hide(); + $('#use_open_id,#use_open_id_2').removeAttr('checked'); + } else { + $('#openid_login').show(); + $('#use_open_id_2').attr('checked', 'checked'); + } + }); +}); \ No newline at end of file diff --git a/widgets/login_info/skins/xe_official/login_form.html b/widgets/login_info/skins/xe_official/login_form.html index e6e49db8b..960d617b8 100644 --- a/widgets/login_info/skins/xe_official/login_form.html +++ b/widgets/login_info/skins/xe_official/login_form.html @@ -7,52 +7,43 @@ - - - - - + + + - -