diff --git a/.htaccess b/.htaccess index 68a5d3209..2730b2a1e 100644 --- a/.htaccess +++ b/.htaccess @@ -22,7 +22,9 @@ RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)$ ./index.php?vid=$1& # trackback RewriteRule ^([0-9]+)/(.+)/trackback$ ./index.php?document_srl=$1&key=$2&act=trackback [L] +RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?mid=$1&document_srl=$2&key=$3&act=trackback [L] RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&document_srl=$2&key=$3&act=trackback [L] +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&mid=$2&document_srl=$3&key=$4&act=trackback [L] # administrator page RewriteRule ^admin/?$ ./index.php?module=admin [L] @@ -47,3 +49,6 @@ RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L,QSA] # vid + mid + entry title RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L,QSA] +#shop / vid / [category|product] / identifier +RewriteCond %{SCRIPT_FILENAME} !-f +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_\.-]+)$ ./index.php?act=route&vid=$1&type=$2&identifier=$3 [L,QSA] diff --git a/addons/resize_image/css/resize_image.mobile.css b/addons/resize_image/css/resize_image.mobile.css index a62075411..53d753413 100644 --- a/addons/resize_image/css/resize_image.mobile.css +++ b/addons/resize_image/css/resize_image.mobile.css @@ -1 +1 @@ -.xe_content img { max-width:100%; height:auto; } +.xe_content img{max-width:100%;height:auto !important} diff --git a/addons/resize_image/js/resize_image.js b/addons/resize_image/js/resize_image.js index be1e197eb..c1de9b2ae 100644 --- a/addons/resize_image/js/resize_image.js +++ b/addons/resize_image/js/resize_image.js @@ -90,10 +90,14 @@ function getScreen() { $("#xe_gallery_controls,#xe_gallery_screen").css({ display:"block", - width : clientWidth + "px", - height : clientHeight + "px", - left : $(document).scrollLeft(), - top : $(document).scrollTop() + width : $(document).width() + "px", + height : $(document).height() + "px", + left : 0, + top : 0 + //width : clientWidth + "px", + //height : clientHeight + "px", + // left : $(document).scrollLeft(), + // top : $(document).scrollTop() }); closebtn.css("left", Math.round((clientWidth-60)/2) + "px"); @@ -126,8 +130,13 @@ function getScreen() { if(!src) src = this.list.eq(this.index).attr("src"); imgframe.attr("src", src).css({ - left : Math.round( Math.max( (clientWidth-imgframe.width()-14)/2, 0 ) ) + "px", - top : Math.round( Math.max( (clientHeight-imgframe.height()-14)/2, 0 ) ) + "px" + left : Math.round( Math.max( parseInt($(document).scrollLeft()) + (clientWidth-imgframe.width()-14)/2, 0 ) ) + "px", + top : Math.round( Math.max( parseInt($(document).scrollTop()) + (clientHeight-imgframe.height()-14)/2, 0 ) ) + "px" + }); + + closebtn.css({ + left : Math.round( Math.max( parseInt($(document).scrollLeft()) + (clientWidth-closebtn.width())/2, 0 ) ) + "px", + top : Math.round( Math.max( parseInt($(document).scrollTop()) + 10, 0 ) ) + "px" }); }; diff --git a/addons/resize_image/js/resize_image.min.js b/addons/resize_image/js/resize_image.min.js index 659fd9f56..fe8f24f84 100644 --- a/addons/resize_image/js/resize_image.min.js +++ b/addons/resize_image/js/resize_image.min.js @@ -1,9 +1,7 @@ /** * @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경 **/ -(function($){var xScreen=null;function getScreen(){var body=$(document.body);var controls,imgframe,closebtn,prevbtn,nextbtn;if(!xScreen){xScreen=$("
").attr("id","xe_gallery_screen").css({position:"absolute",display:"none",backgroundColor:"black",zIndex:500,opacity:0.5});controls=$("
").attr("id","xe_gallery_controls").css({position:"absolute",display:"none",overflow:"hidden",zIndex:510});closebtn=$("").attr("id","xe_gallery_closebtn").attr("src",request_uri+"addons/resize_image/iconClose.png").css({top:"10px"}).click(function(){xScreen.xeHide()}).appendTo(controls);prevbtn=$("").attr("id","xe_gallery_prevbtn").attr("src",request_uri+"addons/resize_image/iconLeft.png").css("left","10px").click(function(){xScreen.xePrev()}).appendTo(controls);nextbtn=$("").attr("id","xe_gallery_nextbtn").attr("src",request_uri+"addons/resize_image/iconRight.png").css("right","10px").click(function(){xScreen.xeNext()}).appendTo(controls);controls.find("img").attr({width:60,height:60,className:"iePngFix"}).css({position:"absolute",width:"60px",height:"60px",zIndex:530,cursor:"pointer"});imgframe=$("").attr("id","xe_gallery_holder").css("border","7px solid white").css("zIndex",520).appendTo(controls).draggable();body.append(xScreen).append(controls);xScreen.xeShow=function(){var clientWidth=$(window).width();var clientHeight=$(window).height();$("#xe_gallery_controls,#xe_gallery_screen").css({display:"block",width:clientWidth+"px",height:clientHeight+"px",left:$(document).scrollLeft(),top:$(document).scrollTop()});closebtn.css("left",Math.round((clientWidth-60)/2)+"px");$("#xe_gallery_prevbtn,#xe_gallery_nextbtn").css("top",Math.round((clientHeight-60)/2)+"px");this.xeMove(0);};xScreen.xeHide=function(event){xScreen.css("display","none");controls.css("display","none");};xScreen.xePrev=function(){this.xeMove(-1);};xScreen.xeNext=function(){this.xeMove(1);};xScreen.xeMove=function(val){var clientWidth=$(window).width();var clientHeight=$(window).height();this.index+=val;prevbtn.css("visibility",(this.index>0)?"visible":"hidden");nextbtn.css("visibility",(this.index
');function doResize(contentWidth,count){if(!count)count=0;if(count>=10)return;var $img=this;var beforSize={'width':$img.width(),'height':$img.height()};if(!beforSize.width||!beforSize.height){setTimeout(function(){doResize.call($img,contentWidth,++count)},200);return;} -if(beforSize.width<=contentWidth)return;var resize_ratio=contentWidth/beforSize.width;$img.removeAttr('width').removeAttr('height').css({'width':contentWidth,'height':parseInt(beforSize.height*resize_ratio,10)});} -$('div.xe_content').each(function(){dummy.appendTo(this);var contentWidth=dummy.width();dummy.remove();if(!contentWidth)return;$('img',this).each(function(){var $img=$(this);var imgSrc=$img.attr('src');if(regx_skip.test(imgSrc)&&!regx_allow_i6pngfix.test(imgSrc))return;$img.attr('rel','xe_gallery');doResize.call($img,contentWidth);});$('img[rel=xe_gallery]',this).live('mouseover',function(){var $img=$(this);if(!$img.parent('a').length&&!$img.attr('onclick')){$img.css('cursor','pointer').click(slideshow);}});});});})(jQuery); +(function($){var xScreen=null +function getScreen(){var body=$(document.body),controls,imgframe,closebtn,prevbtn,nextbtn;if(!xScreen){xScreen=$("
").attr("id","xe_gallery_screen").css({position:"absolute",display:"none",backgroundColor:"black",zIndex:500,opacity:0.5});controls=$("
").attr("id","xe_gallery_controls").css({position:"absolute",display:"none",overflow:"hidden",zIndex:510});closebtn=$("").attr("id","xe_gallery_closebtn").attr("src",request_uri+"addons/resize_image/iconClose.png").css({top:"10px"}).click(function(){xScreen.xeHide()}).appendTo(controls);prevbtn=$("").attr("id","xe_gallery_prevbtn").attr("src",request_uri+"addons/resize_image/iconLeft.png").css("left","10px").click(function(){xScreen.xePrev()}).appendTo(controls);nextbtn=$("").attr("id","xe_gallery_nextbtn").attr("src",request_uri+"addons/resize_image/iconRight.png").css("right","10px").click(function(){xScreen.xeNext()}).appendTo(controls);controls.find("img").attr({width:60,height:60,className:"iePngFix"}).css({position:"absolute",width:"60px",height:"60px",zIndex:530,cursor:"pointer"});imgframe=$("").attr("id","xe_gallery_holder").css("border","7px solid white").css("zIndex",520).appendTo(controls).draggable();body.append(xScreen).append(controls);xScreen.xeShow=function(){var clientWidth=$(window).width(),clientHeight=$(window).height();$("#xe_gallery_controls,#xe_gallery_screen").css({display:"block",width:$(document).width()+"px",height:$(document).height()+"px",left:0,top:0});closebtn.css("left",Math.round((clientWidth-60)/2)+"px");$("#xe_gallery_prevbtn,#xe_gallery_nextbtn").css("top",Math.round((clientHeight-60)/2)+"px");this.xeMove(0)};xScreen.xeHide=function(event){xScreen.css("display","none");controls.css("display","none")};xScreen.xePrev=function(){this.xeMove(-1)};xScreen.xeNext=function(){this.xeMove(1)};xScreen.xeMove=function(val){var clientWidth=$(window).width(),clientHeight=$(window).height();this.index+=val;prevbtn.css("visibility",(this.index>0)?"visible":"hidden");nextbtn.css("visibility",(this.index
') +function doResize(contentWidth,count){if(!count)count=0;if(count>=10)return;var $img=this,beforSize={width:$img.width(),height:$img.height()};if(!beforSize.width||!beforSize.height){setTimeout(function(){doResize.call($img,contentWidth,++count)},200);return};if(beforSize.width<=contentWidth)return;var resize_ratio=contentWidth/beforSize.width;$img.removeAttr('width').removeAttr('height').css({width:contentWidth,height:parseInt(beforSize.height*resize_ratio,10)})};$('div.xe_content').each(function(){var contentWidth=dummy.appendTo(this).width();dummy.remove();if(!contentWidth)return;$('img',this).each(function(){var $img=$(this),imgSrc=$img.attr('src');if(regx_skip.test(imgSrc)&&!regx_allow_i6pngfix.test(imgSrc))return;$img.attr('rel','xe_gallery');doResize.call($img,contentWidth)});$('img[rel=xe_gallery]',this).live('mouseover',function(){var $img=$(this);if(!$img.parent('a').length&&!$img.attr('onclick'))$img.css('cursor','pointer').click(slideshow)})})})})(jQuery) \ No newline at end of file diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 57fdb521b..90a7b4f87 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -113,6 +113,20 @@ class Context { * @var bool true if attached file exists */ var $is_uploaded = false; + /** + * Pattern for request vars check + * @var array + */ + var $patterns = array( + '/<\?/iUsm', + '/<\%/iUsm', + '/isLogged()) { - $oMemberController->setSessionInfo(); - } - elseif($_COOKIE['xeak']) { // check auto sign-in - $oMemberController->doAutologin(); - } + if($oMemberController && $oMemberModel) + { + // if signed in, validate it. + if($oMemberModel->isLogged()) { + $oMemberController->setSessionInfo(); + } + elseif($_COOKIE['xeak']) { // check auto sign-in + $oMemberController->doAutologin(); + } - $this->set('is_logged', $oMemberModel->isLogged() ); - $this->set('logged_info', $oMemberModel->getLoggedInfo() ); + $this->set('is_logged', $oMemberModel->isLogged() ); + $this->set('logged_info', $oMemberModel->getLoggedInfo() ); + } } // load common language file @@ -722,21 +739,63 @@ class Context { $obj = clone($source_obj); - foreach($charset_list as $charset) { - $flag = true; - foreach($obj as $key=>$val) { - if(!$val) continue; - if($val && iconv($charset,$charset,$val)!=$val) $flag = false; - } - if($flag) { + foreach($charset_list as $charset) + { + array_walk($obj,'Context::checkConvertFlag',$charset); + $flag = Context::checkConvertFlag($flag = true); + if($flag) + { if($charset == 'UTF-8') return $obj; - foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val); + array_walk($obj,'Context::doConvertEncoding',$charset); return $obj; } } - return $obj; } + /** + * Check flag + * + * @param mixed $val + * @param string $key + * @param mixed $charset charset + * @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5 + * @return void + */ + function checkConvertFlag(&$val, $key = null, $charset = null) + { + static $flag = true; + if($charset) + { + if(is_array($val)) + array_walk($val,'Context::checkConvertFlag',$charset); + else if($val && iconv($charset,$charset,$val)!=$val) $flag = false; + else $flag = false; + } + else + { + $return = $flag; + $flag = true; + return $return; + } + } + + /** + * Convert array type variables into UTF-8 + * + * @param mixed $val + * @param string $key + * @param string $charset character set + * @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5 + * @return object converted object + */ + function doConvertEncoding(&$val, $key = null, $charset) + { + if (is_array($val)) + { + array_walk($val,'Context::doConvertEncoding',$charset); + } + else $val = iconv($charset,'UTF-8',$val); + } /** * Convert strings into UTF-8 @@ -812,15 +871,36 @@ class Context { if($set_to_vars) { - $val = preg_replace('/<\?.*(\?>)?/iUsm', '', $val); - $val = preg_replace('/<\%.*(\%>)?/iUsm', '', $val); - $val = preg_replace('/.*<[\s]*\/[\s]*script[\s]*>/iUsm', '', $val); + $this->_recursiveCheckVar($val); } $this->set($key, $val, $set_to_vars); } } + function _recursiveCheckVar($val) + { + if(is_string($val)) + { + foreach($this->patterns as $pattern) + { + $result = preg_match($pattern, $val); + if($result) + { + $this->isSuccessInit = FALSE; + return; + } + } + } + else if(is_array($val)) + { + foreach($val as $val2) + { + $this->_recursiveCheckVar($val2); + } + } + } + /** * Handle request arguments for JSON * @@ -893,7 +973,7 @@ class Context { $v = stripslashes($v); } - $val[$k] = trim($v); + if (is_string($v)) $val[$k] = trim($v); } } @@ -1097,7 +1177,9 @@ class Context { 'act.mid' =>$is_feed?"$mid/$act":'', 'act.mid.vid'=>$is_feed?"$vid/$mid/$act":'', 'act.document_srl.key' =>($act=='trackback')?"$srl/$key/$act":'', - 'act.document_srl.key.vid'=>($act=='trackback')?"$vid/$srl/$key/$act":'' + 'act.document_srl.key.mid'=>($act=='trackback')?"$mid/$srl/$key/$act":'', + 'act.document_srl.key.vid'=>($act=='trackback')?"$vid/$srl/$key/$act":'', + 'act.document_srl.key.mid.vid'=>($act=='trackback')?"$vid/$mid/$srl/$key/$act":'' ); $query = $target_map[$target]; @@ -1109,7 +1191,7 @@ class Context { if(is_array($val) && count($val)) { foreach($val as $k => $v) $queries[] = $key.'['.$k.']='.urlencode($v); } else { - $queries[] = $key.'='.urlencode($val); + $queries[] = $key.'='.@urlencode($val); } } if(count($queries)) $query = 'index.php?'.implode('&', $queries); diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 5960af780..d25a3fe11 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -13,6 +13,7 @@ require(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); require(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpression.class.php'); require(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php'); + require(_XE_PATH_.'classes/db/queryparts/expression/ClickCountExpression.class.php'); require(_XE_PATH_.'classes/db/queryparts/table/Table.class.php'); require(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php'); require(_XE_PATH_.'classes/db/queryparts/table/CubridTableWithHint.class.php'); @@ -110,9 +111,9 @@ * transaction flag * @var boolean */ - var $transaction_started = false; + var $transaction_started = FALSE; - var $is_connected = false; + var $is_connected = FALSE; /** * returns enable list in supported dbms list @@ -249,7 +250,7 @@ $get_supported_list = array(); $db_classes_path = _XE_PATH_."classes/db/"; $filter = "/^DB([^\.]+)\.class\.php/i"; - $supported_list = FileHandler::readDir($db_classes_path, $filter, true); + $supported_list = FileHandler::readDir($db_classes_path, $filter, TRUE); sort($supported_list); // after creating instance of class, check is supported @@ -269,9 +270,9 @@ if(!$oDB) continue; - $obj = null; + $obj = NULL; $obj->db_type = $db_type; - $obj->enable = $oDB->isSupported() ? true : false; + $obj->enable = $oDB->isSupported() ? TRUE : FALSE; $get_supported_list[] = $obj; } @@ -295,8 +296,8 @@ * @return boolean true: connected, false: not connected */ function isConnected($type = 'master', $indx = 0) { - if($type == 'master') return $this->master_db["is_connected"] ? true : false; - else return $this->slave_db[$indx]["is_connected"] ? true : false; + if($type == 'master') return $this->master_db["is_connected"] ? TRUE : FALSE; + else return $this->slave_db[$indx]["is_connected"] ? TRUE : FALSE; } /** @@ -341,7 +342,7 @@ $debug_file = _XE_PATH_."files/_debug_db_query.php"; $buff = array(); if(!file_exists($debug_file)) $buff[] = ''; - $buff[] = print_r($log, true); + $buff[] = print_r($log, TRUE); if(@!$fp = fopen($debug_file, "a")) return; fwrite($fp, implode("\n", $buff)."\n\n"); @@ -385,7 +386,7 @@ * @return boolean true: error, false: no error */ function isError() { - return $this->errno === 0 ? false : true; + return $this->errno === 0 ? FALSE : TRUE; } /** @@ -535,8 +536,8 @@ * @return int count of cache data */ function getCountCache($tables, $condition) { - return false; - if(!$tables) return false; + return FALSE; + if(!$tables) return FALSE; if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); $condition = md5($condition); @@ -548,14 +549,14 @@ if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); - if(!file_exists($cache_filename)) return false; + if(!file_exists($cache_filename)) return FALSE; $cache_mtime = filemtime($cache_filename); if(!is_array($tables)) $tables = array($tables); foreach($tables as $alias => $table) { $table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ; - if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return false; + if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return FALSE; } $count = (int)FileHandler::readFile($cache_filename); @@ -570,8 +571,8 @@ * @return void */ function putCountCache($tables, $condition, $count = 0) { - return false; - if(!$tables) return false; + return FALSE; + if(!$tables) return FALSE; if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); $condition = md5($condition); @@ -593,8 +594,8 @@ * @return boolean true: success, false: failed */ function resetCountCache($tables) { - return false; - if(!$tables) return false; + return FALSE; + if(!$tables) return FALSE; if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); if(!is_array($tables)) $tables = array($tables); @@ -604,7 +605,7 @@ FileHandler::writeFile($filename, ''); } - return true; + return TRUE; } /** @@ -642,7 +643,7 @@ * @param boolean $with_values * @return string */ - function getSelectSql($query, $with_values = true){ + function getSelectSql($query, $with_values = TRUE){ $select = $query->getSelectString($with_values); if($select == '') return new Object(-1, "Invalid query"); $select = 'SELECT ' .$select; @@ -676,6 +677,36 @@ return $select . ' ' . $from . ' ' . $where . ' ' . $index_hint_list . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit; } + /** + * Given a SELECT statement that uses click count + * returns the corresponding update sql string + * for databases that don't have click count support built in + * (aka all besides CUBRID) + * + * Function does not check if click count columns exist! + * You must call $query->usesClickCount() before using this function + * + * @param $queryObject + */ + function getClickCountQuery($queryObject) + { + $new_update_columns = array(); + $click_count_columns = $queryObject->getClickCountColumns(); + foreach($click_count_columns as $click_count_column) + { + $click_count_column_name = $click_count_column->column_name; + + $increase_by_1 = new Argument($click_count_column_name, null); + $increase_by_1->setColumnOperation('+'); + $increase_by_1->ensureDefaultValue(1); + + $update_expression = new UpdateExpression($click_count_column_name, $increase_by_1); + $new_update_columns[] = $update_expression; + } + $queryObject->columns = $new_update_columns; + return $queryObject; + } + /** * Return delete query string * @param object $query @@ -683,7 +714,7 @@ * @param boolean $with_priority * @return string */ - function getDeleteSql($query, $with_values = true, $with_priority = false){ + function getDeleteSql($query, $with_values = TRUE, $with_priority = FALSE){ $sql = 'DELETE '; $sql .= $with_priority?$query->getPriority():''; @@ -708,7 +739,7 @@ * @param boolean $with_priority * @return string */ - function getUpdateSql($query, $with_values = true, $with_priority = false){ + function getUpdateSql($query, $with_values = TRUE, $with_priority = FALSE){ $columnsList = $query->getUpdateString($with_values); if($columnsList == '') return new Object(-1, "Invalid query"); @@ -730,7 +761,7 @@ * @param boolean $with_priority * @return string */ - function getInsertSql($query, $with_values = true, $with_priority = false){ + function getInsertSql($query, $with_values = TRUE, $with_priority = FALSE){ $tableName = $query->getFirstTableName(); $values = $query->getInsertString($with_values); $priority = $with_priority?$query->getPriority():''; @@ -778,10 +809,10 @@ */ function _dbInfoExists() { if (!$this->master_db) - return false; + return FALSE; if (count($this->slave_db) === 0) - return false; - return true; + return FALSE; + return TRUE; } /** @@ -811,7 +842,7 @@ $this->_close($connection["resource"]); - $connection["is_connected"] = false; + $connection["is_connected"] = FALSE; } /** @@ -820,7 +851,7 @@ * @return boolean */ function _begin(){ - return true; + return TRUE; } /** @@ -832,7 +863,7 @@ return; if($this->_begin()) - $this->transaction_started = true; + $this->transaction_started = TRUE; } /** @@ -841,7 +872,7 @@ * @return boolean */ function _rollback(){ - return true; + return TRUE; } /** @@ -852,7 +883,7 @@ if (!$this->isConnected() || !$this->transaction_started) return; if($this->_rollback()) - $this->transaction_started = false; + $this->transaction_started = FALSE; } /** @@ -861,7 +892,7 @@ * @return boolean */ function _commit(){ - return true; + return TRUE; } /** @@ -869,11 +900,11 @@ * @param boolean $force regardless transaction start status or connect status, forced to commit * @return void */ - function commit($force = false) { + function commit($force = FALSE) { if (!$force && (!$this->isConnected() || !$this->transaction_started)) return; if($this->_commit()) - $this->transaction_started = false; + $this->transaction_started = FALSE; } /** @@ -894,8 +925,8 @@ * @param resource $connection * @return resource */ - function _query($query, $connection = null) { - if($connection == null) + function _query($query, $connection = NULL) { + if($connection == NULL) $connection = $this->_getConnection('master'); // Notify to start a query execution $this->actStart($query); @@ -971,14 +1002,14 @@ $connection = &$this->slave_db[$indx]; $result = $this->__connect($connection); - if($result === NULL || $result === false) { - $connection["is_connected"] = false; + if($result === NULL || $result === FALSE) { + $connection["is_connected"] = FALSE; return; } // Check connections $connection["resource"] = $result; - $connection["is_connected"] = true; + $connection["is_connected"] = TRUE; // Save connection info for db logs $this->connection = ucfirst($type) . ' ' . $connection["db_hostname"]; @@ -1018,8 +1049,8 @@ * @param boolean $force force load DBParser instance * @return DBParser */ - function &getParser($force = false){ - static $dbParser = null; + function &getParser($force = FALSE){ + static $dbParser = NULL; if(!$dbParser || $force) { $oDB = &DB::getInstance(); $dbParser = $oDB->getParser(); diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index b0dca092c..8debbbcd3 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -455,7 +455,7 @@ if ($notnull) $query .= "not null "; - $this->_query ($query); + return $this->_query ($query); } /** diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index 5482406ee..6a6b85414 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -310,7 +310,7 @@ if($default) $query .= sprintf(" default '%s' ", $default); if($notnull) $query .= " not null "; - $this->_query($query); + return $this->_query($query); } /** @@ -729,6 +729,12 @@ $data = $this->_fetch($result); $buff = new Object (); $buff->data = $data; + + if($queryObject->usesClickCount()) + { + $update_query = $this->getClickCountQuery($queryObject); + $this->_executeUpdateAct($update_query); + } } return $buff; } diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index c4f5a6477..799f522d3 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -256,7 +256,7 @@ class DBMysql extends DB { if($default) $query .= sprintf(" default '%s' ", $default); if($notnull) $query .= " not null "; - $this->_query($query); + return $this->_query($query); } /** @@ -501,6 +501,13 @@ class DBMysql extends DB { $data = $this->_fetch($result); $buff = new Object (); $buff->data = $data; + + if($queryObject->usesClickCount()) + { + $update_query = $this->getClickCountQuery($queryObject); + $this->_executeUpdateAct($update_query, $with_values); + } + return $buff; } } diff --git a/classes/db/queryparts/Query.class.php b/classes/db/queryparts/Query.class.php index 65f0a1510..516fb3212 100644 --- a/classes/db/queryparts/Query.class.php +++ b/classes/db/queryparts/Query.class.php @@ -56,13 +56,13 @@ * argument list * @var array */ - var $arguments = null; + var $arguments = NULL; /** * column list * @var array */ - var $columnList = null; + var $columnList = NULL; /** * order by text @@ -83,15 +83,15 @@ * @param string $priority * @return void */ - function Query($queryID = null - , $action = null - , $columns = null - , $tables = null - , $conditions = null - , $groups = null - , $orderby = null - , $limit = null - , $priority = null){ + function Query($queryID = NULL + , $action = NULL + , $columns = NULL + , $tables = NULL + , $conditions = NULL + , $groups = NULL + , $orderby = NULL + , $limit = NULL + , $priority = NULL){ $this->queryID = $queryID; $this->action = $action; $this->priority = $priority; @@ -106,7 +106,7 @@ } function show(){ - return true; + return TRUE; } function setQueryId($queryID){ @@ -149,7 +149,7 @@ function setTables($tables){ if(!isset($tables) || count($tables) === 0){ - $this->setError(true); + $this->setError(TRUE); $this->setMessage("You must provide at least one table for the query."); return; } @@ -158,10 +158,10 @@ $this->tables = $tables; } - - function setSubquery($subquery){ - $this->subquery = $subquery; - } + + function setSubquery($subquery){ + $this->subquery = $subquery; + } function setConditions($conditions){ $this->conditions = array(); @@ -198,7 +198,7 @@ * @param string|array $columns * @return Query return Query instance */ - function select($columns= null){ + function select($columns= NULL){ $this->action = 'select'; $this->setColumns($columns); return $this; @@ -263,12 +263,34 @@ return $this->priority?'LOW_PRIORITY':''; } + /** + * Check if current query uses the click count attribute + * For CUBRID, this statement uses the click count feature. + * For the other databases, using this attribute causes a query + * to produce both a select and an update + */ + function usesClickCount() + { + return count($this->getClickCountColumns()) > 0; + } + + function getClickCountColumns() + { + $click_count_columns = array(); + foreach($this->columns as $column){ + if($column->show() && is_a($column, 'ClickCountExpression')) + $click_count_columns[] = $column; + } + return $click_count_columns; + } + /** * Return select sql * @param boolean $with_values * @return string */ - function getSelectString($with_values = true){ + function getSelectString($with_values = TRUE){ + $select = array(); foreach($this->columns as $column){ if($column->show()) if($column->isSubquery()){ @@ -285,7 +307,7 @@ * @param boolean $with_values * @return string */ - function getUpdateString($with_values = true){ + function getUpdateString($with_values = TRUE){ foreach($this->columns as $column){ if($column->show()) $update[] = $column->getExpression($with_values); @@ -298,22 +320,22 @@ * @param boolean $with_values * @return string */ - function getInsertString($with_values = true){ + function getInsertString($with_values = TRUE){ $columnsList = ''; - if($this->subquery){ // means we have insert-select - - foreach($this->columns as $column){ - $columnsList .= $column->getColumnName() . ', '; - } - $columnsList = substr($columnsList, 0, -2); - - $selectStatement = $this->subquery->toString($with_values); - $selectStatement = substr($selectStatement, 1, -1); - - return "($columnsList) \n $selectStatement"; - } - - + if($this->subquery){ // means we have insert-select + + foreach($this->columns as $column){ + $columnsList .= $column->getColumnName() . ', '; + } + $columnsList = substr($columnsList, 0, -2); + + $selectStatement = $this->subquery->toString($with_values); + $selectStatement = substr($selectStatement, 1, -1); + + return "($columnsList) \n $selectStatement"; + } + + $valuesList = ''; foreach($this->columns as $column){ if($column->show()){ @@ -339,7 +361,7 @@ * @param boolean $with_values * @return string */ - function getFromString($with_values = true){ + function getFromString($with_values = TRUE){ $from = ''; $simple_table_count = 0; foreach($this->tables as $table){ @@ -360,7 +382,7 @@ * @param boolean $with_optimization * @return string */ - function getWhereString($with_values = true, $with_optimization = true){ + function getWhereString($with_values = TRUE, $with_optimization = TRUE){ $where = ''; $condition_count = 0; diff --git a/classes/db/queryparts/expression/ClickCountExpression.class.php b/classes/db/queryparts/expression/ClickCountExpression.class.php index 367681c0c..36b123bc8 100644 --- a/classes/db/queryparts/expression/ClickCountExpression.class.php +++ b/classes/db/queryparts/expression/ClickCountExpression.class.php @@ -23,9 +23,8 @@ parent::SelectExpression($column_name, $alias); if(!is_bool($click_count)){ - error_log("Click_count value for $column_name was not boolean", 0); + // error_log("Click_count value for $column_name was not boolean", 0); $this->click_count = false; - return; } $this->click_count = $click_count; } @@ -39,7 +38,15 @@ * @return string */ function getExpression(){ - return "$this->column_name = $this->column_name + 1"; + $db_type = Context::getDBType(); + if($db_type == 'cubrid') + { + return "INCR($this->column_name)"; + } + else + { + return "$this->column_name"; + } } } diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index c1145e1d0..d20acdfd6 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -27,7 +27,8 @@ (defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false && function_exists('ob_gzhandler') && - extension_loaded('zlib') + extension_loaded('zlib') && + $oModule->gzhandler_enable ) $this->gz_enabled = true; // Extract contents to display by the request method if(Context::get('xeVirtualRequestMethod')=='xml') { diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 04759a276..afe3c791b 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -370,6 +370,32 @@ class FileHandler { * @return string If success, the content of the target file. Otherwise: none **/ function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) { + if(version_compare(PHP_VERSION, '5.0.0', '>=')) + { + return include _XE_PATH_ . 'classes/file/getRemoteResourcePHP5.php'; + } + else + { + return FileHandler::_getRemoteResource($url, $boyd, $timeout, $mehtod, $conent_type, $headers, $cookies, $post_data); + } + } + + /** + * Return remote file's content via HTTP + * + * If the target is moved (when return code is 300~399), this function follows the location specified response header. + * + * @param string $url The address of the target file + * @param string $body HTTP request body + * @param int $timeout Connection timeout + * @param string $method GET/POST + * @param string $content_type Content type header of HTTP request + * @param string[] $headers Headers key vaule array. + * @param string[] $cookies Cookies key value array. + * @param string $post_data Request arguments array for POST method + * @return string If success, the content of the target file. Otherwise: none + **/ + function _getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) { requirePear(); require_once('HTTP/Request.php'); diff --git a/classes/file/getRemoteResourcePHP5.php b/classes/file/getRemoteResourcePHP5.php new file mode 100644 index 000000000..74e007b54 --- /dev/null +++ b/classes/file/getRemoteResourcePHP5.php @@ -0,0 +1,9 @@ +fileName = $pathInfo['basename']; $file->filePath = $this->_getAbsFileUrl($pathInfo['dirname']); + $file->fileRealPath = FileHandler::getRealPath($pathInfo['dirname']); $file->fileExtension = strtolower($pathInfo['extension']); + $file->fileNameNoExt = preg_replace('/\.min$/', '', $pathInfo['filename']); + $file->keyName = implode('.', array($file->fileNameNoExt, $file->fileExtension)); - if (strpos($file->filePath, '://') == false) + if(strpos($file->filePath, '://') === FALSE) { + if(!__DEBUG__) + { + // if no debug mode, load minifed file + $minifiedFileName = implode('.', array($file->fileNameNoExt, 'min', $file->fileExtension)); + $minifiedRealPath = implode('/', array($file->fileRealPath, $minifiedFileName)); + if(file_exists($minifiedRealPath)) + { + $file->fileName = $minifiedFileName; + } + } + else + { + // Remove .min + if(file_exists(implode('/', array($file->fileRealPath, $file->keyName)))) + { + $file->fileName = $file->keyName; + } + } + $file->useCdn = $useCdn; $file->cdnPath = $this->_normalizeFilePath($pathInfo['dirname']); $file->cdnPrefix = $cdnPrefix; @@ -121,7 +144,7 @@ if (!$file->media) $file->media = 'all'; $map = &$this->cssMap; $mapIndex = &$this->cssMapIndex; - $key = $file->filePath . $file->fileName . "\t" . $file->targetIe . "\t" . $file->media; + $key = $file->filePath . $file->keyName . "\t" . $file->targetIe . "\t" . $file->media; $this->_arrangeCssIndex($pathInfo['dirname'], $file); } @@ -138,11 +161,11 @@ $map = &$this->jsHeadMap; $mapIndex = &$this->jsHeadMapIndex; } - $key = $file->filePath . $file->fileName . "\t" . $file->targetIe; + $key = $file->filePath . $file->keyName . "\t" . $file->targetIe; } (is_null($file->index))?$file->index=0:$file->index=$file->index; - if (!isset($map[$file->index][$key]) || $mapIndex[$key] != $file->index) + if (!isset($map[$file->index][$key]) || $mapIndex[$key] > $file->index) { $this->unloadFile($args[0], $args[2], $args[1]); $map[$file->index][$key] = $file; diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 8a135f953..77edaac80 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -38,6 +38,14 @@ $this->act = Context::get('act'); return; } + + $oContext = Context::getInstance(); + if($oContext->isSuccessInit == false) + { + $this->error = 'msg_invalid_request'; + return; + } + // Set variables from request arguments $this->module = $module?$module:Context::get('module'); $this->act = $act?$act:Context::get('act'); @@ -151,7 +159,17 @@ $this->mid = $module_info->mid; $this->module_info = $module_info; Context::setBrowserTitle($module_info->browser_title); - $part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl); + + if($module_info->use_mobile && Mobile::isFromMobilePhone()) + { + $layoutSrl = $module_info->mlayout_srl; + } + else + { + $layoutSrl = $module_info->layout_srl; + } + + $part_config= $oModuleModel->getModulePartConfig('layout',$layoutSrl); Context::addHtmlHeader($part_config->header_script); } @@ -361,6 +379,20 @@ { $oModule = &$this->getModuleInstance($forward->module, $type, $kind); } + + if(!is_object($oModule)) { + $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; + $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); + $oMessageObject->setError(-1); + $oMessageObject->setMessage('msg_module_is_not_exists'); + $oMessageObject->dispMessage(); + if($this->httpStatusCode) + { + $oMessageObject->setHttpStatusCode($this->httpStatusCode); + } + return $oMessageObject; + } + $xml_info = $oModuleModel->getModuleActionXml($forward->module); $oMemberModel = &getModel('member'); @@ -686,6 +718,7 @@ if(__DEBUG__==3) $start_time = getMicroTime(); + $parent_module = $module; $kind = strtolower($kind); $type = strtolower($type); @@ -702,10 +735,13 @@ // if there is no instance of the module in global variable, create a new one if(!isset($GLOBALS['_loaded_module'][$module][$type][$kind])) { - $parent_module = $module; + ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name); - $class_path = ModuleHandler::getModulePath($module); - if(!is_dir(FileHandler::getRealPath($class_path))) return NULL; + if($extend_module && (!is_readable($high_class_file) || !is_readable($class_file))) + { + $module = $parent_module; + ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name); + } // Get base class name and load the file contains it if(!class_exists($module)) { @@ -714,23 +750,6 @@ require_once($high_class_file); } - // Get the object's name - $types = explode(' ', 'view controller model api wap mobile class'); - if(!in_array($type, $types)) $type = $types[0]; - if($type == 'class') { - $instance_name = '%s'; - $class_file = '%s%s.%s.php'; - } elseif($kind == 'admin' && array_search($type, $types) < 3) { - $instance_name = '%sAdmin%s'; - $class_file = '%s%s.admin.%s.php'; - } else{ - $instance_name = '%s%s'; - $class_file = '%s%s.%s.php'; - } - $instance_name = sprintf($instance_name, $module, ucfirst($type)); - $class_file = sprintf($class_file, $class_path, $module, $type); - $class_file = FileHandler::getRealPath($class_file); - // Get the name of the class file if(!is_readable($class_file)) return NULL; @@ -767,6 +786,31 @@ return $GLOBALS['_loaded_module'][$module][$type][$kind]; } + function _getModuleFilePath($module, $type, $kind, &$classPath, &$highClassFile, &$classFile, &$instanceName) + { + $classPath = ModuleHandler::getModulePath($module); + + $highClassFile = sprintf('%s%s%s.class.php', _XE_PATH_,$classPath, $module); + $highClassFile = FileHandler::getRealPath($highClassFile); + + $types = explode(' ', 'view controller model api wap mobile class'); + if(!in_array($type, $types)) $type = $types[0]; + if($type == 'class') { + $instanceName = '%s'; + $classFile = '%s%s.%s.php'; + } elseif($kind == 'admin' && array_search($type, $types) < 3) { + $instanceName = '%sAdmin%s'; + $classFile = '%s%s.admin.%s.php'; + } else{ + $instanceName = '%s%s'; + $classFile = '%s%s.%s.php'; + } + + $instanceName = sprintf($instanceName, $module, ucfirst($type)); + $classFile = sprintf($classFile, $classPath, $module, $type); + $classFile = FileHandler::getRealPath($classFile); + } + /** * call a trigger * @param string $trigger_name trigger's name to call diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php index f7c8cef99..6134e3072 100644 --- a/classes/module/ModuleObject.class.php +++ b/classes/module/ModuleObject.class.php @@ -30,6 +30,8 @@ var $module_config = NULL; var $ajaxRequestMethod = array('XMLRPC', 'JSON'); + var $gzhandler_enable = TRUE; + /** * setter to set the name of module * @param string $module name of module diff --git a/classes/security/EmbedFilter.class.php b/classes/security/EmbedFilter.class.php index f17fe198e..f674bfbe5 100644 --- a/classes/security/EmbedFilter.class.php +++ b/classes/security/EmbedFilter.class.php @@ -1,8 +1,18 @@ ]*/is', array($this, '_checkAllowScriptAccess'), $content); + $content = preg_replace_callback('/]*>/is', array($this, '_addAllowScriptAccess'), $content); + $this->checkObjectTag($content); $this->checkEmbedTag($content); $this->checkIframeTag($content); @@ -530,6 +543,49 @@ class EmbedFilter return false; } + function _checkAllowScriptAccess($m) + { + if($m[1] == 'object') + { + $this->allowscriptaccessList[] = 1; + } + + if($m[1] == 'param') + { + if(strpos(strtolower($m[0]), 'allowscriptaccess')) + { + $m[0] = 'allowscriptaccessList[count($this->allowscriptaccessList)-1]--; + } + } + else if($m[1] == 'embed') + { + if(strpos(strtolower($m[0]), 'allowscriptaccess')) + { + $m[0] = preg_replace('/always|samedomain/i', 'never', $m[0]); + } + else + { + $m[0] = preg_replace('/\allowscriptaccessList[$this->allowscriptaccessKey] == 1) + { + $m[0] = $m[0].''; + } + $this->allowscriptaccessKey++; + return $m[0]; + } + /** * Make white domain list cache file from xml config file. * @return void diff --git a/classes/validator/Validator.class.php b/classes/validator/Validator.class.php index 0aefc2c79..c32c367a9 100644 --- a/classes/validator/Validator.class.php +++ b/classes/validator/Validator.class.php @@ -239,7 +239,13 @@ class Validator $value = $exists ? $fields[$fname] : null; } - if(is_array($value)) $value = implode('', $value); + if(is_array($value)) { + if(!isset($value[tmp_name])){ + $value = implode('', $value); + }else{ + $value = $value['name']; + } + } // conditional statement foreach($filter['if'] as $cond) { diff --git a/classes/xml/XmlQueryParser.150.class.php b/classes/xml/XmlQueryParser.150.class.php index b0c2087d4..a32217e87 100644 --- a/classes/xml/XmlQueryParser.150.class.php +++ b/classes/xml/XmlQueryParser.150.class.php @@ -1,109 +1,124 @@ + * Parses XE XML query files + * + * @author Corina Udrescu (corina.udrescu@arnia.ro) + * @package classes\xml + * @version 0.1 + */ +class XmlQueryParser extends XmlParser { /** - * New XmlQueryParser class - * @author NHN (developers@xpressengine.com) - * @brief case to parse XE xml query - * @version 0.1 + * Create XmlQueryParser instance for Singleton * - * @todo need to support extend query such as subquery, union - * @todo include info about column types for parsing user input + * @return XmlQueryParser object */ - class XmlQueryParser extends XmlParser { - /** - * constructor - * @return void - */ - function XmlQueryParser(){ - } - - /** - * Create XmlQueryParser instance for Singleton - * @return XmlQueryParser object - */ - function &getInstance(){ - static $theInstance = null; - if(!isset($theInstance)){ - $theInstance = new XmlQueryParser(); - } - return $theInstance; - } - - /** - * 1. Read xml file
- * 2. Check the action
- * 3. Parsing and write a cache file
- * @return QueryParser object - */ - function &parse_xml_query($query_id, $xml_file, $cache_file) + function &getInstance() { - // Read xml file - $xml_obj = $this->getXmlFileContent($xml_file); - - // insert, update, delete, select action - $action = strtolower($xml_obj->query->attrs->action); - if(!$action) return; - - // Write query cache file - $parser = new QueryParser($xml_obj->query); - FileHandler::writeFile($cache_file, $parser->toString()); - - return $parser; - } - - /** - * Query XML file parsing - * @return QueryParser object - */ - function parse($query_id = NULL, $xml_file = NULL, $cache_file = NULL) - { - $this->parse_xml_query($query_id, $xml_file, $cache_file); + static $theInstance = NULL; + if(!isset($theInstance)){ + $theInstance = new XmlQueryParser(); + } + return $theInstance; } - /** - * Return XML file content - * @return array|NULL Returns a resultant data object or NULL in case of error - */ - function getXmlFileContent($xml_file){ - $buff = FileHandler::readFile($xml_file); - $xml_obj = parent::parse($buff); - if(!$xml_obj) return; - unset($buff); - return $xml_obj; - } - } + /** + * Parses an XML query file + * + * 1. Read xml file
+ * 2. Check the action
+ * 3. Parse and write cache file
+ * + * @param $query_id + * @param $xml_file + * @param $cache_file + * + * @return QueryParser object + */ + function &parse_xml_query($query_id, $xml_file, $cache_file) + { + // Read xml file + $xml_obj = $this->getXmlFileContent($xml_file); + + // insert, update, delete, select action + $action = strtolower($xml_obj->query->attrs->action); + if(!$action) return; + + // Write query cache file + $parser = new QueryParser($xml_obj->query); + FileHandler::writeFile($cache_file, $parser->toString()); + + return $parser; + } + + /** + * Override for parent "parse" method + * + * @param null $query_id + * @param null $xml_file + * @param null $cache_file + * + * @return void + */ + function parse($query_id = NULL, $xml_file = NULL, $cache_file = NULL) + { + $this->parse_xml_query($query_id, $xml_file, $cache_file); + } + + /** + * Returns XML file contents as an object + * or NULL in case of error + * + * @param $xml_file + * @return array|NULL + */ + function getXmlFileContent($xml_file) + { + $buff = FileHandler::readFile($xml_file); + $xml_obj = parent::parse($buff); + if(!$xml_obj) return; + unset($buff); + return $xml_obj; + } +} ?> diff --git a/classes/xml/xmlquery/DBParser.class.php b/classes/xml/xmlquery/DBParser.class.php index 111f698f4..a3336566c 100644 --- a/classes/xml/xmlquery/DBParser.class.php +++ b/classes/xml/xmlquery/DBParser.class.php @@ -1,193 +1,272 @@ + * - column names: member.member_srl => "member"."member_srl"
+ * - expressions: SUM(member.member_srl) => SUM("member"."member_srl")
+ * + * @author Corina Udrescu (corina.udrescu@arnia.ro) + * @package classes\xml\xmlquery + * @version 0.1 + */ +class DBParser +{ /** - * DBParser class - * @author NHN (developers@xpressengine.com) - * @package /classes/xml/xmlquery - * @version 0.1 + * Character for escape target value on the left + * + * For example, in CUBRID left and right escape + * chars are the same, the double quote - "
+ * But for SQL Server, the escape is made with + * [double brackets], so the left and right char differ + * + * + * @var string */ - class DBParser { - /** - * Character for escape target value on the left - * @var string - */ - var $escape_char_left; - /** - * Character for escape target value on the right - * @var string - */ - var $escape_char_right; - /** - * Table prefix string - * @var string - */ - var $table_prefix; - - /** - * constructor - * @param string $escape_char_left - * @param string $escape_char_right - * @param string $table_prefix - * @return void - */ - function DBParser($escape_char_left, $escape_char_right = "", $table_prefix = "xe_"){ - $this->escape_char_left = $escape_char_left; - if ($escape_char_right !== "")$this->escape_char_right = $escape_char_right; - else $this->escape_char_right = $escape_char_left; - $this->table_prefix = $table_prefix; - } - - /** - * Get escape character - * @param string $leftOrRight left or right - * @return string - */ - function getEscapeChar($leftOrRight){ - if ($leftOrRight === 'left')return $this->escape_char_left; - else return $this->escape_char_right; - } - - /** - * escape the value - * @param mixed $name - * @return string - */ - function escape($name){ - return $this->escape_char_left . $name . $this->escape_char_right; - } - - /** - * escape the string value - * @param string $name - * @return string - */ - function escapeString($name){ - return "'".$this->escapeStringValue($name)."'"; - } - - /** - * escape the string value - * @param string $value - * @return string - */ - function escapeStringValue($value){ - if($value == "*") return $value; - if (is_string($value)) return $value = str_replace("'","''",$value); - return $value; - } - - /** - * Return table full name - * @param string $name table name without table prefix - * @return string table full name with table prefix - */ - function parseTableName($name){ - return $this->table_prefix . $name; - } - - /** - * Return colmun name after escape - * @param string $name column name before escape - * @return string column name after escape - */ - function parseColumnName($name){ - return $this->escapeColumn($name); - } - - /** - * Escape column - * @param string $column_name - * @return string column name with db name - */ - function escapeColumn($column_name){ - if($this->isUnqualifiedColumnName($column_name)) - return $this->escape($column_name); - if($this->isQualifiedColumnName($column_name)){ - list($table, $column) = explode('.', $column_name); - // $table can also be an alias, so the prefix should not be added - return $this->escape($table).'.'.$this->escape($column); - //return $this->escape($this->parseTableName($table)).'.'.$this->escape($column); - } - } + var $escape_char_left; - /** - * Column name is suitable for use in checking - * @param string $column_name - * @return bool - */ - function isUnqualifiedColumnName($column_name){ - if(strpos($column_name,'.')===false && strpos($column_name,'(')===false) return true; - return false; - } - - /** - * Column name is suitable for use in checking - * @param string $column_name - * @return bool - */ - function isQualifiedColumnName($column_name){ - if(strpos($column_name,'.')!==false && strpos($column_name,'(')===false) return true; - return false; - } + /** + * Character for escape target value on the right + * + * For example, in CUBRID left and right escape + * chars are the same, the double quote - "
+ * But for SQL Server, the escape is made with + * [double brackets], so the left and right char differ + * + * @var string + */ + var $escape_char_right; - function parseExpression($column_name){ - $functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); - foreach($functions as $k => $v){ - $function = &$functions[$k]; - if(strlen($function)==1) continue; // skip delimiters - $pos = strrpos("(", $function); - $matches = preg_split('/([a-zA-Z0-9_*]+)/', $function, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); - $total_brackets = substr_count($function, "("); - $brackets = 0; - foreach($matches as $i => $j){ - $match = &$matches[$i]; - if($match == '(') {$brackets++; continue;} - if(strpos($match,')') !== false) continue; - if(in_array($match, array(',', '.'))) continue; - if($brackets == $total_brackets){ - if(!is_numeric($match)) { - $match = $this->escapeColumnExpression($match); - } + /** + * Table prefix string + * + * Default is "xe_" + * + * @var string + */ + var $table_prefix; + + /** + * Constructor + * + * @param string $escape_char_left + * @param string $escape_char_right + * @param string $table_prefix + * + * @return void + */ + function DBParser($escape_char_left, $escape_char_right = "", $table_prefix = "xe_") + { + $this->escape_char_left = $escape_char_left; + if ($escape_char_right !== "")$this->escape_char_right = $escape_char_right; + else $this->escape_char_right = $escape_char_left; + $this->table_prefix = $table_prefix; + } + + /** + * Get escape character + * + * @param string $leftOrRight left or right + * @return string + */ + function getEscapeChar($leftOrRight) + { + if ($leftOrRight === 'left')return $this->escape_char_left; + else return $this->escape_char_right; + } + + /** + * Escape the value + * + * @param mixed $name + * @return string + */ + function escape($name) + { + return $this->escape_char_left . $name . $this->escape_char_right; + } + + /** + * Escape the string value + * + * @param string $name + * @return string + */ + function escapeString($name) + { + return "'".$this->escapeStringValue($name)."'"; + } + + /** + * Escape the string value + * + * @param string $value + * @return string + */ + function escapeStringValue($value) + { + if($value == "*") return $value; + if (is_string($value)) return $value = str_replace("'","''",$value); + return $value; + } + + /** + * Return table full name + * + * @param string $name table name without table prefix + * + * @return string table full name with table prefix + */ + function parseTableName($name) + { + return $this->table_prefix . $name; + } + + /** + * Return column name after escape + * + * @param string $name column name before escape + * + * @return string column name after escape + */ + function parseColumnName($name) + { + return $this->escapeColumn($name); + } + + /** + * Escape column name + * + * @param string $column_name + * @return string column name with db name + */ + function escapeColumn($column_name) + { + if($this->isUnqualifiedColumnName($column_name)) + return $this->escape($column_name); + if($this->isQualifiedColumnName($column_name)){ + list($table, $column) = explode('.', $column_name); + // $table can also be an alias, so the prefix should not be added + return $this->escape($table).'.'.$this->escape($column); + //return $this->escape($this->parseTableName($table)).'.'.$this->escape($column); + } + } + + /** + * Checks to see if a given column name is unqualified + * + * Ex: "member_srl" -> unqualified
+ * "member"."member_srl" -> qualified + * + * @param string $column_name + * @return bool + */ + function isUnqualifiedColumnName($column_name) + { + if(strpos($column_name,'.')===FALSE && strpos($column_name,'(')===FALSE) return TRUE; + return FALSE; + } + + /** + * Checks to see if a given column name is qualified + * + * Ex: "member_srl" -> unqualified
+ * "member"."member_srl" -> qualified + * + * @param string $column_name + * @return bool + */ + function isQualifiedColumnName($column_name) + { + if(strpos($column_name,'.')!==FALSE && strpos($column_name,'(')===FALSE) return TRUE; + return FALSE; + } + + /** + * Escapes a query expression + * + * An expression can be:
+ *
    + *
  • a column name: "member_srl" or "xe_member"."member_srl" + *
  • an expression: + *
      + *
    • LEFT(UPPER("content"))
      + *
    • readed_count + voted_count
      + *
    • CAST(regdate as DATE)
    • + *
    + *
  • + *
+ * + * @param $column_name + * @return string + */ + function parseExpression($column_name) + { + $functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + foreach($functions as $k => $v){ + $function = &$functions[$k]; + if(strlen($function)==1) continue; // skip delimiters + $pos = strrpos("(", $function); + $matches = preg_split('/([a-zA-Z0-9_*]+)/', $function, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + $total_brackets = substr_count($function, "("); + $brackets = 0; + foreach($matches as $i => $j){ + $match = &$matches[$i]; + if($match == '(') {$brackets++; continue;} + if(strpos($match,')') !== FALSE) continue; + if(in_array($match, array(',', '.'))) continue; + if($brackets == $total_brackets){ + if(!is_numeric($match) && !in_array(strtoupper($match), array('UNSIGNED', 'INTEGER', 'AS'))) { + $match = $this->escapeColumnExpression($match); } } - $function = implode('', $matches); - } - return implode('', $functions); - } - - /* - * Checks argument is asterisk - * @param string $column_name - * @return bool - */ - function isStar($column_name){ - if(substr($column_name,-1) == '*') return true; - return false; - } - - /* - * Checks to see if expression is an aggregate star function - * like count(*) - * @param string $column_name - * @return bool - */ - function isStarFunction($column_name){ - if(strpos($column_name, "(*)")!==false) return true; - return false; - } - - /* - * Return column name after escape - * @param string $column_name - * @return string - */ - function escapeColumnExpression($column_name){ - if($this->isStar($column_name)) return $column_name; - if($this->isStarFunction($column_name)){ - return $column_name; } - if(strpos(strtolower($column_name), 'distinct') !== false) return $column_name; - return $this->escapeColumn($column_name); - } + $function = implode('', $matches); + } + return implode('', $functions); } - + + /** + * Checks if a given argument is an asterisk + * + * @param string $column_name + * @return bool + */ + function isStar($column_name) + { + if(substr($column_name,-1) == '*') return TRUE; + return FALSE; + } + + /** + * Checks to see if expression is an aggregate star function + * like count(*) + * + * @param string $column_name + * @return bool + */ + function isStarFunction($column_name) + { + if(strpos($column_name, "(*)")!==FALSE) return TRUE; + return FALSE; + } + + /** + * Return column name after escape + * @param string $column_name + * @return string + */ + function escapeColumnExpression($column_name) + { + if($this->isStar($column_name)) return $column_name; + if($this->isStarFunction($column_name)) + { + return $column_name; + } + if(strpos(strtolower($column_name), 'distinct') !== FALSE) return $column_name; + return $this->escapeColumn($column_name); + } +} + diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index ab1366a37..47c8a97ca 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -1,92 +1,108 @@ + * The XML Object structure must be the one defined in the XmlParser class + * + * @author Corina Udrescu (corina.udrescu@arnia.ro) + * @package classes\xml\xmlquery + * @version 0.1 + */ +class QueryParser { + /** - * QueryParser class - * @author NHN (developers@xpressengine.com) - * @package /classes/xml/xmlquery - * @version 0.1 + * Property containing the associated QueryTag object + * + * @var QueryTag object */ - class QueryParser { - /** - * QueryTag object - * @var QueryTag object - */ - var $queryTag; + var $queryTag; - /** - * constructor - * @param object $query - * @param bool $isSubQuery - * @return void - */ - function QueryParser($query = NULL, $isSubQuery = false) { - if ($query) - $this->queryTag = new QueryTag($query, $isSubQuery); - } + /** + * Constructor + * + * @param object $query XML object obtained after reading the XML Query file + * @param bool $isSubQuery + * @return void + */ + function QueryParser($query = NULL, $isSubQuery = FALSE) + { + if ($query) + { + $this->queryTag = new QueryTag($query, $isSubQuery); + } + } - /** - * Return table information - * @param object $query_id - * @param bool $table_name - * @return array - */ - function getTableInfo($query_id, $table_name) { - $column_type = array(); - $module = ''; - - $id_args = explode('.', $query_id); - if (count($id_args) == 2) { - $target = 'modules'; - $module = $id_args[0]; - $id = $id_args[1]; - } elseif (count($id_args) == 3) { - $target = $id_args[0]; - $targetList = array('modules'=>1, 'addons'=>1, 'widgets'=>1); - if (!isset($targetList[$target])) - return; - $module = $id_args[1]; - $id = $id_args[2]; - } + /** + * Returns table information + * + * Used for finding column type info (string/numeric)
+ * Obtains the table info from XE's XML schema files + * + * @param object $query_id + * @param bool $table_name + * @return array + */ + function getTableInfo($query_id, $table_name) { + $column_type = array(); + $module = ''; - // get column properties from the table - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); - if (!file_exists($table_file)) { - $searched_list = FileHandler::readDir(_XE_PATH_ . 'modules'); - $searched_count = count($searched_list); - for ($i = 0; $i < $searched_count; $i++) { - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); - if (file_exists($table_file)) - break; - } - } + $id_args = explode('.', $query_id); + if (count($id_args) == 2) { + $target = 'modules'; + $module = $id_args[0]; + $id = $id_args[1]; + } elseif (count($id_args) == 3) { + $target = $id_args[0]; + $targetList = array('modules'=>1, 'addons'=>1, 'widgets'=>1); + if (!isset($targetList[$target])) + return; + $module = $id_args[1]; + $id = $id_args[2]; + } - if (file_exists($table_file)) { - $table_xml = FileHandler::readFile($table_file); - $xml_parser = new XmlParser(); - $table_obj = $xml_parser->parse($table_xml); - if ($table_obj->table) { - if (isset($table_obj->table->column) && !is_array($table_obj->table->column)) { - $table_obj->table->column = array($table_obj->table->column); - } + // get column properties from the table + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); + if (!file_exists($table_file)) { + $searched_list = FileHandler::readDir(_XE_PATH_ . 'modules'); + $searched_count = count($searched_list); + for ($i = 0; $i < $searched_count; $i++) { + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); + if (file_exists($table_file)) + break; + } + } - foreach ($table_obj->table->column as $k => $v) { - $column_type[$v->attrs->name] = $v->attrs->type; - } - } - } + if (file_exists($table_file)) { + $table_xml = FileHandler::readFile($table_file); + $xml_parser = new XmlParser(); + $table_obj = $xml_parser->parse($table_xml); + if ($table_obj->table) { + if (isset($table_obj->table->column) && !is_array($table_obj->table->column)) { + $table_obj->table->column = array($table_obj->table->column); + } - return $column_type; - } + foreach ($table_obj->table->column as $k => $v) { + $column_type[$v->attrs->name] = $v->attrs->type; + } + } + } - /** - * Change code string from queryTag object - * @return string - */ - function toString() { - return "queryTag->toString() - . 'return $query; ?>'; - } + return $column_type; + } - } + /** + * Returns the contents for the query cache file + * + * @return string + */ + function toString() { + return "queryTag->toString() + . 'return $query; ?>'; + } + +} ?> diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index 5ac884869..61243fd9e 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -97,6 +97,7 @@ class Argument { } function getUnescapedValue() { + if($this->value === 'null') return null; return $this->value; } @@ -163,19 +164,47 @@ class Argument { * @return string */ function _escapeStringValue($value) { + // Remove non-utf8 chars. + $regex = '@((?:[\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}){1,100})|([\xF0-\xF7][\x80-\xBF]{3})|([\x80-\xBF])|([\xC0-\xFF])@x'; + + $value = preg_replace_callback($regex, array($this, 'utf8Replacer'), $value); $db = &DB::getInstance(); $value = $db->addQuotes($value); return '\'' . $value . '\''; } + function utf8Replacer($captures) { + if (!empty($captures[1])) + { + // Valid byte sequence. Return unmodified. + return $captures[1]; + } + elseif(!empty($captures[2])) + { + // Remove user defined area + if("\xF3\xB0\x80\x80" <= $captures[2]) + { + return; + } + + return $captures[2]; + } + else + { + return; + } + } + function isValid() { return $this->isValid; } function isColumnName(){ $type = $this->getType(); + $value = $this->getUnescapedValue(); if($type == 'column_name') return true; - if($type == 'number' && !is_numeric($this->value) && $this->uses_default_value) return true; + if($type == 'number' && is_null($value)) return false; + if($type == 'number' && !is_numeric($value) && $this->uses_default_value) return true; return false; } diff --git a/classes/xml/xmlquery/tags/column/ColumnTag.class.php b/classes/xml/xmlquery/tags/column/ColumnTag.class.php index 33edeba26..7c5da2fb7 100644 --- a/classes/xml/xmlquery/tags/column/ColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/ColumnTag.class.php @@ -1,28 +1,29 @@ + * Since the <column> tag supports different attributes depending on + * the type of query (select, update, insert, delete) this is only + * the base class for the classes that will model each type tag. + * + * @author Corina Udrescu (corina.udrescu@arnia.ro) + * @package classes\xml\xmlquery\tags\column + * @version 0.1 + */ +class ColumnTag +{ /** - * ColumnTag class - * Models the tag inside an XML Query file - * Since the tag supports different attributes depending on - * the type of query (select, update, insert, delete) this is only - * the base class for the classes that will model each type tag. - * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * Column name + * @var string */ - class ColumnTag { - /** - * Column name - * @var string - */ - var $name; - - /** - * constructor - * @param string $name - * @return void - */ - function ColumnTag($name){ - $this->name = $name; - } + var $name; + + /** + * Constructor + * @param string $name + * @return void + */ + function ColumnTag($name) + { + $this->name = $name; } +} diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php index 0bef31920..2f9d3248c 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php @@ -1,40 +1,58 @@ tag inside an XML Query file whose action is 'insert' + * Argument * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @var QueryArgument object */ - class InsertColumnTag extends ColumnTag { - /** - * argument - * @var QueryArgument object - */ - var $argument; - - /** - * constructor - * @param object $column - * @return void - */ - function InsertColumnTag($column) { - parent::ColumnTag($column->attrs->name); - $dbParser = DB::getParser(); - $this->name = $dbParser->parseColumnName($this->name); - $this->argument = new QueryArgument($column); - } - - function getExpressionString(){ - return sprintf('new InsertExpression(\'%s\', ${\'%s_argument\'})' - , $this->name - , $this->argument->argument_name); - } - - function getArgument(){ - return $this->argument; - } + var $argument; + /** + * Constructor + * + * @param object $column + * + * @return void + */ + function InsertColumnTag($column) + { + parent::ColumnTag($column->attrs->name); + $dbParser = DB::getParser(); + $this->name = $dbParser->parseColumnName($this->name); + $this->argument = new QueryArgument($column); } + + /** + * Returns the string to be output in the cache file + * used for instantiating an InsertExpression when a + * query is executed + * + * @return string + */ + function getExpressionString() + { + return sprintf('new InsertExpression(\'%s\', ${\'%s_argument\'})' + , $this->name + , $this->argument->argument_name); + } + + /** + * Returns the QueryArgument object associated with this INSERT statement + * + * @return QueryArgument + */ + function getArgument() + { + return $this->argument; + } + +} ?> diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php index 86ac458dc..df4f71520 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php @@ -1,31 +1,45 @@ tag inside an XML Query file whose action is 'insert-select' + * Constructor * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @param object $column + * @return void */ - class InsertColumnTagWithoutArgument extends ColumnTag { - /** - * constructor - * @param object $column - * @return void - */ - function InsertColumnTagWithoutArgument($column) { - parent::ColumnTag($column->attrs->name); - $dbParser = DB::getParser(); - $this->name = $dbParser->parseColumnName($this->name); - } - - function getExpressionString(){ - return sprintf('new Expression(\'%s\')', $this->name); - } - - function getArgument(){ - return null; - } - + function InsertColumnTagWithoutArgument($column) + { + parent::ColumnTag($column->attrs->name); + $dbParser = DB::getParser(); + $this->name = $dbParser->parseColumnName($this->name); } + + /** + * Returns the string to be output in the cache file + * + * @return string + */ + function getExpressionString() + { + return sprintf('new Expression(\'%s\')', $this->name); + } + + /** + * Returns the QueryArgument object associated with this INSERT statement + * + * @return null + */ + function getArgument() + { + return NULL; + } + +} ?> diff --git a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php index 0cfca653c..15e6b962e 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php @@ -1,65 +1,72 @@ tag inside an XML Query file whose action is 'insert' + * Column list * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @var array value is InsertColumnTag object */ - class InsertColumnsTag{ - /** - * Column list - * @var array value is InsertColumnTag object - */ - var $columns; + var $columns; - /** - * constructor - * @param array|string $xml_columns - * @return void - */ - function InsertColumnsTag($xml_columns) { - $this->columns = array(); + /** + * Constructor + * + * @param array|string $xml_columns + * @return void + */ + function InsertColumnsTag($xml_columns) + { + $this->columns = array(); - if(!$xml_columns) - return; + if(!$xml_columns) + return; - if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); - foreach($xml_columns as $column){ - if($column->name === 'query') $this->columns[] = new QueryTag($column, true); - else if(!isset($column->attrs->var) && !isset($column->attrs->default)) $this->columns[] = new InsertColumnTagWithoutArgument($column); - else $this->columns[] = new InsertColumnTag($column); - } + foreach($xml_columns as $column){ + if($column->name === 'query') $this->columns[] = new QueryTag($column, true); + else if(!isset($column->attrs->var) && !isset($column->attrs->default)) $this->columns[] = new InsertColumnTagWithoutArgument($column); + else $this->columns[] = new InsertColumnTag($column); } - - /** - * InsertColumnTag object to string - * @return string - */ - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->columns as $column){ - $output_columns .= $column->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; - } - - /** - * Return argument list - * @return array - */ - function getArguments(){ - $arguments = array(); - foreach($this->columns as $column){ - $arguments[] = $column->getArgument(); - } - return $arguments; - } - } + /** + * InsertColumnTag object to string + * + * @return string + */ + function toString() + { + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + /** + * Return argument list + * + * @return array + */ + function getArguments() + { + $arguments = array(); + foreach($this->columns as $column){ + $arguments[] = $column->getArgument(); + } + return $arguments; + } + +} + ?> diff --git a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php index bef7e0fd2..5482116f2 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php @@ -1,53 +1,71 @@ tag inside an XML Query file whose action is 'select' + * Column alias * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @var string */ - class SelectColumnTag extends ColumnTag{ - /** - * alias - * @var string - */ - var $alias; - /** - * click count status - * @var bool - */ - var $click_count; - - /** - * constructor - * @param string|object $column - * @return void - */ - function SelectColumnTag($column){ - if ($column == "*" || $column->attrs->name == '*') - { - parent::ColumnTag(NULL); - $this->name = "*"; - } - else - { - parent::ColumnTag($column->attrs->name); - $dbParser = new DB(); $dbParser = &$dbParser->getParser(); - $this->name = $dbParser->parseExpression($this->name); - - $this->alias = $column->attrs->alias; - $this->click_count = $column->attrs->click_count; - } + var $alias; + + /** + * Click count status + * + * @var bool + */ + var $click_count; + + /** + * Constructor + * + * @param string|object $column + * @return void + */ + function SelectColumnTag($column) + { + if ($column == "*" || $column->attrs->name == '*') + { + parent::ColumnTag(NULL); + $this->name = "*"; } - - function getExpressionString(){ - if($this->name == '*') return "new StarExpression()"; - if($this->click_count) - return sprintf('new ClickCountExpression(%s, %s, $args->%s)', $this->name, $this->alias,$this->click_count); - if(strpos($this->name, '$') === 0) - return sprintf('new SelectExpression($args->%s)', substr($this->name, 1)); - $dbParser = DB::getParser(); - return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': ''); + else + { + parent::ColumnTag($column->attrs->name); + $dbParser = new DB(); $dbParser = &$dbParser->getParser(); + $this->name = $dbParser->parseExpression($this->name); + + $this->alias = $column->attrs->alias; + $this->click_count = $column->attrs->click_count; } } + + /** + * Returns the string to be output in the cache file + * + * A select column tag in an XML query can be used for: + *
    + *
  • a star expression: SELECT * + *
  • a click count expression: SELECT + UPDATE + *
  • any other select expression (column name, function call etc).
  • + *
+ * + * @return string + */ + function getExpressionString() + { + if($this->name == '*') return "new StarExpression()"; + if($this->click_count) + return sprintf('new ClickCountExpression(\'%s\', %s, $args->%s)', $this->name, $this->alias ? '\'' . $this->alias . '\'' : "''",$this->click_count); + if(strpos($this->name, '$') === 0) + return sprintf('new SelectExpression($args->%s)', substr($this->name, 1)); + $dbParser = DB::getParser(); + return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': ''); + } +} diff --git a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php index 47ec7446f..76477170e 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php @@ -1,83 +1,92 @@ column; - $xml_queries = $xml_columns_tag->query; + $xml_columns = $xml_columns_tag->column; + $xml_queries = $xml_columns_tag->query; - $this->columns = array(); + $this->columns = array(); - if(!$xml_columns) { - $this->columns[] = new SelectColumnTag("*"); - return; - } - - if(!is_array($xml_columns)) $xml_columns = array($xml_columns); - - foreach($xml_columns as $column){ - $this->columns[] = new SelectColumnTag($column); - } - - - if(!$xml_queries) { - return; - } - - if(!is_array($xml_queries)) $xml_queries = array($xml_queries); - - foreach($xml_queries as $column){ - $this->columns[] = new QueryTag($column, true); - } + if(!$xml_columns) { + $this->columns[] = new SelectColumnTag("*"); + return; } - /** - * SelectColumnTag object to string - * @return string - */ - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->columns as $column){ - if(is_a($column, 'QueryTag')) - $output_columns .= $column->toString() . PHP_EOL . ','; - else - $output_columns .= $column->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + + foreach($xml_columns as $column){ + $this->columns[] = new SelectColumnTag($column); } - /** - * Return argument list - * @return array - */ - function getArguments(){ - $arguments = array(); - foreach($this->columns as $column){ - if(is_a($column, 'QueryTag')) - $arguments = array_merge($arguments, $column->getArguments()); - } - return $arguments; + + if(!$xml_queries) { + return; + } + + if(!is_array($xml_queries)) $xml_queries = array($xml_queries); + + foreach($xml_queries as $column){ + $this->columns[] = new QueryTag($column, TRUE); } } + + /** + * Returns the string to be output in the cache file + * + * @return string + */ + function toString() + { + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + if(is_a($column, 'QueryTag')) + $output_columns .= $column->toString() . PHP_EOL . ','; + else + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + /** + * Return argument list + * + * @return array + */ + function getArguments() + { + $arguments = array(); + foreach($this->columns as $column){ + if(is_a($column, 'QueryTag')) + $arguments = array_merge($arguments, $column->getArguments()); + } + return $arguments; + } +} ?> diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php index e2616ac34..547f590ed 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -1,73 +1,103 @@ tag inside an XML Query file whose action is 'update' + * Argument * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @var QueryArgument object */ - class UpdateColumnTag extends ColumnTag { - /** - * argument - * @var QueryArgument object - */ - var $argument; - /** - * default value - * @var string - */ - var $default_value; + var $argument; - /** - * constructor - * @param object $column - * @return void - */ - function UpdateColumnTag($column) { - parent::ColumnTag($column->attrs->name); - $dbParser = DB::getParser(); - $this->name = $dbParser->parseColumnName($this->name); - if($column->attrs->var) - $this->argument = new QueryArgument($column); - else { - if(strpos($column->attrs->default, '.') !== false) - $this->default_value = "'" . $dbParser->parseColumnName($column->attrs->default) . "'"; - else { - $default_value = new DefaultValue($this->name, $column->attrs->default); - if($default_value->isOperation()) - $this->argument = new QueryArgument($column, true); - //else $this->default_value = $dbParser->parseColumnName($column->attrs->default); - else { - $this->default_value = $default_value->toString(); - if($default_value->isStringFromFunction()){ - $this->default_value = '"\'".' . $this->default_value . '."\'"'; - } - if($default_value->isString()){ - $this->default_value = '"' . $this->default_value . '"'; - } - } + /** + * Default value + * + * @var string + */ + var $default_value; + + /** + * Constructor + * + * @param object $column + * @return void + */ + function UpdateColumnTag($column) + { + parent::ColumnTag($column->attrs->name); + + $dbParser = DB::getParser(); + $this->name = $dbParser->parseColumnName($this->name); + + if($column->attrs->var) + $this->argument = new QueryArgument($column); + else { + if(strpos($column->attrs->default, '.') !== FALSE) + { + $this->default_value = "'" . $dbParser->parseColumnName($column->attrs->default) . "'"; + } + else + { + $default_value = new DefaultValue($this->name, $column->attrs->default); + if($default_value->isOperation()) + { + $this->argument = new QueryArgument($column, TRUE); + } + //else $this->default_value = $dbParser->parseColumnName($column->attrs->default); + else + { + $this->default_value = $default_value->toString(); + if($default_value->isStringFromFunction()) + { + $this->default_value = '"\'".' . $this->default_value . '."\'"'; + } + if($default_value->isString()) + { + $this->default_value = '"' . $this->default_value . '"'; + } + } - } - } - } - - function getExpressionString(){ - if($this->argument) - return sprintf('new UpdateExpression(\'%s\', ${\'%s_argument\'})' - , $this->name - , $this->argument->argument_name); - else { - return sprintf('new UpdateExpressionWithoutArgument(\'%s\', %s)' - , $this->name - , $this->default_value); - } - } - - function getArgument(){ - return $this->argument; + } } } + /** + * Returns the string to be output in the cache file + * + * @return string + */ + function getExpressionString() + { + if($this->argument) + { + return sprintf('new UpdateExpression(\'%s\', ${\'%s_argument\'})' + , $this->name + , $this->argument->argument_name); + } + else + { + return sprintf('new UpdateExpressionWithoutArgument(\'%s\', %s)' + , $this->name + , $this->default_value); + } + } + + /** + * Returns the Argument associated with this update statement + * + * @return QueryArgument + */ + function getArgument() + { + return $this->argument; + } +} + ?> diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php index dfa6b9a6b..acd3fc9de 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php @@ -1,61 +1,68 @@ tag inside an XML Query file whose action is 'update' + * Column list * - * @author Arnia Software - * @package /classes/xml/xmlquery/tags/column - * @version 0.1 + * @var array value is UpdateColumnTag object */ - class UpdateColumnsTag{ - /** - * Column list - * @var array value is UpdateColumnTag object - */ - var $columns; + var $columns; - /** - * constructor - * @param array|string $xml_columns - * @return void - */ - function UpdateColumnsTag($xml_columns) { - $this->columns = array(); + /** + * Constructor + * + * @param array|object $xml_columns + * @return void + */ + function UpdateColumnsTag($xml_columns) + { + $this->columns = array(); - if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); - foreach($xml_columns as $column){ - if($column->name === 'query') $this->columns[] = new QueryTag($column, true); - else $this->columns[] = new UpdateColumnTag($column); - } + foreach($xml_columns as $column){ + if($column->name === 'query') $this->columns[] = new QueryTag($column, true); + else $this->columns[] = new UpdateColumnTag($column); } - - /** - * UpdateColumnTag object to string - * @return string - */ - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->columns as $column){ - $output_columns .= $column->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; - } - - /** - * Return argument list - * @return array - */ - function getArguments(){ - $arguments = array(); - foreach($this->columns as $column){ - $arguments[] = $column->getArgument(); - } - return $arguments; - } - } + /** + * Returns the string to be output in the cache file + * + * @return string + */ + function toString() + { + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + /** + * Return argument list + * + * @return array + */ + function getArguments() + { + $arguments = array(); + foreach($this->columns as $column){ + $arguments[] = $column->getArgument(); + } + return $arguments; + } + +} + ?> diff --git a/common/js/common.js b/common/js/common.js index bb8128aae..e586d7279 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -190,7 +190,7 @@ jQuery(function($) { }); } - jQuery('input[type="submit"]').click(function(ev){ + jQuery('input[type="submit"],button[type="submit"]').click(function(ev){ var $el = jQuery(ev.currentTarget); setTimeout(function(){ diff --git a/common/js/xe.js b/common/js/xe.js index 345459888..184ee1636 100644 --- a/common/js/xe.js +++ b/common/js/xe.js @@ -474,7 +474,7 @@ jQuery(function($) { }); } - jQuery('input[type="submit"]').click(function(ev){ + jQuery('input[type="submit"],button[type="submit"]').click(function(ev){ var $el = jQuery(ev.currentTarget); setTimeout(function(){ diff --git a/common/js/xe.min.js b/common/js/xe.min.js index f6b3a423f..d14664839 100644 --- a/common/js/xe.min.js +++ b/common/js/xe.min.js @@ -14,7 +14,7 @@ arguments[0],a.extend(c,arguments[1]||{})}!0==c.doClick&&(c.checked=null);"strin if("undefined"==typeof g.length||1>g.length)g=Array(g);if(g.length)for(var j=0;j"+l+" "}}this.loaded_popup_menus[c]=b}b&&(c=a("#popup_menu_area").html("
    "+b+"
"),b=e.page_y,e=e.page_x, c.outerHeight()+b>a(window).height()+a(window).scrollTop()&&(b=a(window).height()-c.outerHeight()+a(window).scrollTop()),c.outerWidth()+e>a(window).width()+a(window).scrollLeft()&&(e=a(window).width()-c.outerWidth()+a(window).scrollLeft()),c.css({top:b,left:e}).show())}}})(jQuery); jQuery(function(a){a.browser.msie&&a("select").each(function(a,b){for(var g=!1,d=[],i=0;i + + + + @@ -3454,7 +3458,7 @@ - + @@ -3768,4 +3772,4 @@ - \ No newline at end of file + diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index 2ab1417c0..8b5aefce7 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -56,6 +56,7 @@ var default_url = "{Context::getDefaultUrl()}"; var http_port = {Context::get("_http_port")}; var https_port = {Context::get("_https_port")}; var enforce_ssl = true; + xe.current_lang = "{$lang_type}"; //]]> diff --git a/config/config.inc.php b/config/config.inc.php index a159bf18b..857008e64 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -14,7 +14,7 @@ * Display XE's full version * Even The file should be revised when releasing altough no change is made */ - define('__XE_VERSION__', '1.5.3.3'); + define('__XE_VERSION__', '1.5.4.2'); /** * @deprecated __ZBXE_VERSION__ will be removed. Use __XE_VERSION__ instead. diff --git a/config/func.inc.php b/config/func.inc.php index 7188c06b7..b3a79fe89 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -326,7 +326,7 @@ $request_uri = Context::getRequestUri(); if(!$num_args) return $request_uri; - $url = Context::getUrl($num_args, $args_list); + $url = Context::getUrl($num_args, $args_list, null, false); if(!preg_match('/^http/i',$url)){ preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); $url = Context::getUrl($num_args, $args_list, null, false); @@ -780,7 +780,7 @@ $oEmbedFilter->check($content); // change the specific tags to the common texts - $content = preg_replace('@<(\/?(?:html|body|head|title|meta|base|link|script|style|applet)(/*)[\w\s>])@i', '<$1', $content); + $content = preg_replace('@<(\/?(?:html|body|head|title|meta|base|link|script|style|applet)(/*).*?>)@i', '<$1', $content); /** * Remove codes to abuse the admin session in src by tags of imaages and video postings @@ -938,7 +938,7 @@ **/ function getRequestUriByServerEnviroment() { - return $_SERVER['REQUEST_URI']; + return removeHackTag($_SERVER['REQUEST_URI']); } /** @@ -1131,6 +1131,38 @@ } } + function checkCSRF() + { + if($_SERVER['REQUEST_METHOD'] != 'POST') + { + return false; + } + + $defaultUrl = Context::getDefaultUrl(); + $referer = parse_url($_SERVER["HTTP_REFERER"]); + + $oModuleModel = &getModel('module'); + $siteModuleInfo = $oModuleModel->getDefaultMid(); + + if($siteModuleInfo->site_srl == 0) + { + if(!strstr(strtolower($defaultUrl), strtolower($referer['host']))) + { + return false; + } + } + else + { + $virtualSiteInfo = $oModuleModel->getSiteInfo($siteModuleInfo->site_srl); + if(strtolower($virtualSiteInfo->domain) != strtolower(Context::get('vid')) && !strstr(strtolower($virtualSiteInfo->domain), strtolower($referer['host']))) + { + return false; + } + } + + return true; + } + /** * Print raw html header * diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index b95688bd4..07d9ade71 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -210,7 +210,7 @@ Top Menü Верхнее меню Menú Principal - Menu trên + Menu trên Ana Menü diff --git a/m.layouts/default/layout.html b/m.layouts/default/layout.html index 5228d4d7c..7fb1ad0ce 100644 --- a/m.layouts/default/layout.html +++ b/m.layouts/default/layout.html @@ -22,6 +22,7 @@
  • {$lang->cmd_login}...
  • +
  • {$lang->cmd_view_member_info}...
  • PC
  • LANG
  • diff --git a/m.layouts/default/mx.css b/m.layouts/default/mx.css index 63f7692a9..656b8db5e 100644 --- a/m.layouts/default/mx.css +++ b/m.layouts/default/mx.css @@ -12,9 +12,11 @@ body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif} .hd .h1 a{color:#fff} .hd .h1 img{border:0} .hd .mu{display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} -.hd .mu:after{content:"›";margin:0 0 0 3px;font-size:24px;vertical-align:middle;position:relative;top:-2px} +.hd .mu:after{content:"›";margin:0 0 0 2px} .hd .muon{cursor:pointer;display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} -.hd .muon:before{content:"‹";font-weight:bold;font-size:16px;line-height:16px;margin:0 2px 0 0;font-family:Verdana, Geneva, sans-serif} +.hd .muon:before{content:"‹";margin:0 2px 0 0} +.hd .mu:after, +.hd .muon:before{font-size:16px;line-height:16px;vertical-align:middle;position:relative;top:-2px;font-family:Verdana, Geneva, sans-serif} /* Footer */ .ft{padding:0;margin:0;list-style:none;background:#868686;overflow:hidden;zoom:1} .ft:after{content:"";display:block;clear:both} diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index 8d5473c1a..fccadd119 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -216,6 +216,54 @@ return $this->setRedirectUrl(Context::get('error_return_url'), $output); } + /** + * Cleanning favorite + * @return Object + */ + function cleanFavorite() + { + $oModel = getAdminModel('admin'); + $output = $oModel->getFavoriteList(); + if(!$output->toBool()) + { + return $output; + } + + $favoriteList = $output->get('favoriteList'); + if(!$favoriteList) + { + return new Object(); + } + + $deleteTargets = array(); + foreach($favoriteList as $favorite) + { + if($favorite->type == 'module') + { + $modulePath = './modules/' . $favorite->module; + $modulePath = FileHandler::getRealPath($modulePath); + if(!is_dir($modulePath)) + { + $deleteTargets[] = $favorite->admin_favorite_srl; + } + } + } + + if(!count($deleteTargets)) + { + return new Object(); + } + + $args->admin_favorite_srls = $deleteTargets; + $output = executeQuery('admin.deleteFavorites', $args); + if(!$output->toBool()) + { + return $output; + } + + return new Object(); + } + /** * Enviroment gathering agreement * @return void diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php index 0c2d77fdf..2a2b81b7c 100644 --- a/modules/admin/admin.admin.model.php +++ b/modules/admin/admin.admin.model.php @@ -462,41 +462,54 @@ */ function getSiteAllList() { - if(Context::get('domain')) $args->domain = Context::get('domain'); - $columnList = array('domain', 'site_srl'); - - $siteList = array(); - $output = executeQueryArray('admin.getSiteAllList', $args, $columnList); - if($output->toBool()) $siteList = $output->data; - - $oModuleModel = &getModel('module'); - foreach($siteList as $key => $value) - { - $args->site_srl = $value->site_srl; - $list = $oModuleModel->getModuleSrlList($args); - - if(!is_array($list)) - { - $list = array($list); - } - - foreach($list as $k => $v) - { - if(!is_dir('./modules/' . $v->module)) - { - unset($list[$k]); - } - } - - if(!count($list)) - { - unset($siteList[$key]); - } - } - - $this->add('site_list', $siteList); + if(Context::get('domain')) $domain = Context::get('domain'); + $siteList = $this->getAllSitesThatHaveModules($domain); + $this->add('site_list', $siteList); } + /** + * Returns a list of all sites that contain modules + * For each site domain and site_srl are retrieved + * + * @return array + */ + function getAllSitesThatHaveModules($domain = null) + { + $args = new stdClass(); + if($domain) $args->domain = $domain; + $columnList = array('domain', 'site_srl'); + + $siteList = array(); + $output = executeQueryArray('admin.getSiteAllList', $args, $columnList); + if($output->toBool()) $siteList = $output->data; + + $oModuleModel = &getModel('module'); + foreach($siteList as $key => $value) + { + $args->site_srl = $value->site_srl; + $list = $oModuleModel->getModuleSrlList($args); + + if(!is_array($list)) + { + $list = array($list); + } + + foreach($list as $k => $v) + { + if(!is_dir('./modules/' . $v->module)) + { + unset($list[$k]); + } + } + + if(!count($list)) + { + unset($siteList[$key]); + } + } + return $siteList; + } + /** * Return site count * @param string $date diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index a004f8dfe..e9a9ed36d 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -468,7 +468,7 @@ unset($layout_info); $layout_info = $oLayoutModel->getLayout($val->layout_srl); if (!$layout_info) continue; - $layout_parse = explode('.', $layout_info->layout); + $layout_parse = explode('|@|', $layout_info->layout); if (count($layout_parse) == 2){ $thumb_path = sprintf('./themes/%s/layouts/%s/thumbnail.png', $layout_parse[0], $layout_parse[1]); } diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index d7be94a77..7bbb13d74 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -712,16 +712,16 @@
    - '항상 사용'은 모든 서비스에 SSL을 사용 합니다.]]> - 'Always' to use SSL for all services.]]> - - - 選擇開啟時,所有的服務都會使用 SSL功能。]]> - - - - - Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https.]]> + '항상 사용'은 모든 서비스에 SSL을 사용 합니다.
    SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]>
    + 'Always' to use SSL for all services.
    SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]>
    + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + 選擇開啟時,所有的服務都會使用 SSL功能。
    SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]>
    + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]> + Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https.
    SSL 환경이 갖춰지지 않은 상태에서 SSL을 사용할 경우 접속이 되지 않을 수 있으니 주의하시기 바랍니다.]]>
    @@ -1484,4 +1484,4 @@ - \ No newline at end of file + diff --git a/modules/admin/queries/deleteFavorites.xml b/modules/admin/queries/deleteFavorites.xml new file mode 100644 index 000000000..ad57007fb --- /dev/null +++ b/modules/admin/queries/deleteFavorites.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 1564cec67..c74627d1a 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -58,7 +58,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .table caption .side{float:right;font-weight:normal;margin-left:1em} .x .table th, .x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd} -.x .table th{background:#f8f8f8;white-space:nowrap} +.x .table th{background:#f8f8f8} .x .table thead th{border-bottom:1px solid #999} .x .table tfoot td{font-weight:bold;background:#f8f8f8} .x .table.even tbody tr:nth-of-type(even){background-color:#fafafa} @@ -68,10 +68,6 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .table em{font-style:normal;font-weight:normal;color:#e00} .x .table th.nowr, .x .table td.nowr{white-space:nowrap} -.x .table th.title, -.x .table td.title, -.x .table th.text, -.x .table td.text{width:100%} /* Form */ .x .form{margin:0 0 1em 0;padding:0} .x .form fieldset{margin:0 0 2em 0;padding:0;border:0} @@ -149,7 +145,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .gnb .mnv{display:block} } /* Local Navigation */ -.x .lnb{position:relative;float:left;width:210px;margin:0 0 1em -230px;line-height:normal;zoom:1;display:inline} +.x .lnb{position:relative;float:left;width:210px;left:-230px;margin:0 0 20px 0;line-height:normal;zoom:1;display:inline} .x .lnb .h2{position:relative;z-index:2;margin:0 0 -1px 0;padding:0 10px;border:1px solid #444;border-bottom:0;border-radius:4px 4px 0 0;background:#555;font-size:13px;color:#fff;line-height:36px} .x .lnb ul{margin:0 !important;padding:0;list-style:none;position:relative;z-index:1} .x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} @@ -170,11 +166,11 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .lnb li:last-child a, .x .lnb li.active:last-child{border-radius:0 0 4px 4px !important} /* Shortcut */ -.x .sct{float:right;width:138px;position:relative;right:-160px;margin:0 0 0 -140px;padding:8px 0} -.x .sct h2{margin:0 0 5px 15px;font-size:13px} +.x .sct{float:left;width:210px;position:relative;left:-230px;margin:0;padding:8px 0;border:0;box-shadow:inset 0 0 1px rgba(0,0,0,0.5)} +.x .sct h2{margin:0 0 5px 10px;font-size:13px} .x .sct ul{margin:0;font-size:12px} .x .sct li{position:relative} -.x .sct a{text-decoration:none} +.x .sct a{text-decoration:none;padding:3px 18px 3px 10px} .x .sct form{position:absolute;margin:0;padding:0;top:2px;right:-10px} .x .sct .text{text-decoration:none;font-weight:bold;color:#999 !important;width:16px;height:16px;margin:0} .x .sct .text:hover, @@ -305,10 +301,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .footer .cache{float:right} .x .footer .vr{color:#ccc} /* Body */ -.x .body{position:relative;z-index:1;padding:30px 170px 30px 240px;zoom:1} +.x .body{position:relative;z-index:1;padding:30px 10px 30px 240px;zoom:1} .x .body:after{content:"";display:block;clear:both} /* Content */ -.x .content{float:right;width:100%;margin-left:-100%;zoom:1;outline:0} +.x .content{float:right;width:100%;margin-left:-210px;zoom:1;outline:0;min-height:500px} .x .content:after{content:"";display:block;clear:both} .x .content a{color:#33a} .x .content a:hover, @@ -320,15 +316,12 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .content .portlet a:focus{text-decoration:underline} /* Dashboard */ .x .dashboard .section{margin-top:0} -.x .dashboard .portlet{float:left;width:48%;margin-right:1em;margin-top:0} +.x .dashboard .portlet{float:left;width:48%;margin-right:1em;margin-top:0;min-height:188px} .x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} .x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} @media all and (min-width:1300px){ .x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important} } -/* Single Column*/ -.x .single{padding-left:10px} -.x .single .content{position:relative;float:left;width:100%;margin:0} /* Search */ .x .search{zoom:1} .x .search:after{content:"";display:block;clear:both} @@ -587,7 +580,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header .account ul{padding-right:10px} .x .body{padding:1em 0 0 0} .x .content{float:none;margin-left:0} -.x .lnb{float:none;width:auto;margin:1em 0} +.x .lnb{float:none;width:auto;margin:1em 0;left:auto} .x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 868fc1a70..4bb3d70bb 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1,11 @@ -@charset "utf-8";header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}.x,.x table,.x input,.x textarea,.x select,.x button{font-size:13px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}.x .section{margin:1em 0;padding:0;border:0}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em 0;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table,.x .h2 + .table table,.x .h3 + .table table,.x .h4 + .table table{border-top:0 !important;margin-top:-1em !important}.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2,.x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px !important;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8;white-space:nowrap}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd !important}.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table th.nowr,.x .table td.nowr{white-space:nowrap}.x .table th.title,.x .table td.title,.x .table th.text,.x .table td.text{width:100%}.x .form{margin:0 0 1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=radio]+label,.x .form input[type=checkbox]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form span.desc,.x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .gnb{height:34px;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb:after{content:"";display:block;clear:both}.x .gnb .nav-gnb{float:left;position:relative;display:inline-block;*display:inline;zoom:1;margin:0 0 0 20px;padding:1px;list-style:none}.x .gnb .nav-gnb ul{_position:absolute;display:block;_display:inline;zoom:1;clear:both;margin:0;padding:0;border:0;overflow:hidden;height:0}.x .gnb.active .nav-gnb{top:-5px;padding:5px 5px 5px 0;margin:0 0 -100% 20px;border:1px solid #aaa;background:#fff;box-shadow:0 0 10px #999;border-radius:5px}.x .gnb.active .nav-gnb ul{top:0;_position:relative;box-shadow:none;display:block;_display:inline;clear:both;padding:0;margin:0;border:0}.x .gnb .nav-gnb:after{content:"";display:block;clear:both}.x .gnb .nav-gnb li{position:relative;display:inline-block;*display:inline;zoom:1;vertical-align:top;overflow:hidden;margin:0}.x .gnb .nav-gnb li.activeOn{z-index:10}.x .gnb .nav-gnb li.activeOn>a{border:1px solid #ccc}.x .gnb .nav-gnb li li{display:block;_float:left;clear:both;overflow:hidden;border:0;margin:0}.x .gnb .nav-gnb li li:first-child{border:0}.x .gnb .nav-gnb li a{display:block;_float:left;font-weight:bold;color:#333;font-size:12px;height:14px;padding:9px 0;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb .nav-gnb li a span{padding:0 15px;border-left:1px solid #fff}.x .gnb.active .nav-gnb li a span,.x .gnb .nav-gnb li:first-child a span,.x .gnb .nav-gnb li.activeOn+li a span{border:0;margin:0 0 0 1px}.x .gnb .nav-gnb li a:hover,.x .gnb .nav-gnb li a:active,.x .gnb .nav-gnb li a:focus{background:#f4f4f4}.x .gnb .nav-gnb li.activeOn>a{background:#fff;padding:8px 0}.x .gnb .nav-gnb li li a{color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb .nav-gnb li li a:hover,.x .gnb .nav-gnb li li a:active,.x .gnb .nav-gnb li li a:focus{border:0;background:#eee}.x .gnb .mnv{width:100%;height:32px;display:none}@media all and (max-width:860px){.x .gnb{height:auto}.x .gnb .nav-gnb,.x .sct{display:none}.x .gnb .mnv{display:block}}.x .lnb{position:relative;float:left;width:210px;margin:0 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{position:relative;z-index:2;margin:0 0 -1px 0;padding:0 10px;border:1px solid #444;border-bottom:0;border-radius:4px 4px 0 0;background:#555;font-size:13px;color:#fff;line-height:36px}.x .lnb ul{margin:0 !important;padding:0;list-style:none;position:relative;z-index:1}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}.x .lnb li:last-child a,.x .lnb li.active:last-child{border-radius:0 0 4px 4px !important}.x .sct{float:right;width:138px;position:relative;right:-160px;margin:0 0 0 -140px;padding:8px 0}.x .sct h2{margin:0 0 5px 15px;font-size:13px}.x .sct ul{margin:0;font-size:12px}.x .sct li{position:relative}.x .sct a{text-decoration:none}.x .sct form{position:absolute;margin:0;padding:0;top:2px;right:-10px}.x .sct .text{text-decoration:none;font-weight:bold;color:#999 !important;width:16px;height:16px;margin:0}.x .sct .text:hover,.x .sct .text:active,.x .sct .text:focus{color:#333 !important}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .starRating,.x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:99}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul,.modal ol,.modal .lined,.modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%}.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul,.x .layer ol,.x .layer .lined,.x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}.x .skipNav{margin:0;text-align:center}@media all and (max-width:860px){.x .skipNav{display:none}}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;padding:10px 0;font-weight:bold;overflow:hidden}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 0 10px 20px;font-size:24px;line-height:32px;display:inline-block;*display:inline;zoom:1;vertical-align:middle}.x .header h1 *{vertical-align:middle}.x .header h1 a{display:inline-block;color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0 0 10px 20px;display:inline-block;*display:inline;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}.x .header .account ul{margin:0;padding:5px 20px 5px 0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-20px;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}@media all and (max-width:860px){.x .header #language{right:-10px}}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}.x .footer *{font-size:12px}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}.x .footer .vr{color:#ccc}.x .body{position:relative;z-index:1;padding:30px 170px 30px 240px;zoom:1}.x .body:after{content:"";display:block;clear:both}.x .content{float:right;width:100%;margin-left:-100%;zoom:1;outline:0}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}.x .dashboard .section{margin-top:0}.x .dashboard .portlet{float:left;width:48%;margin-right:1em;margin-top:0}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}.x .single{padding-left:10px}.x .single .content{position:relative;float:left;width:100%;margin:0}.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:3px 4px;margin:0;border:0;background:transparent}.x .siteMap h2:hover input,.x .siteMap h2 input:focus{background:#ff0;border:1px dashed #ccc;margin:-1px}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p,.x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px}.x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input,.x .langEdit li.en textarea,.x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input,.x .langEdit li.ko textarea,.x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input,.x .langEdit li.jp textarea,.x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input,.x .langEdit li.fr textarea,.x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input,.x .langEdit li.de textarea,.x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input,.x .langEdit li.ru textarea,.x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input,.x .langEdit li.es textarea,.x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input,.x .langEdit li.tr textarea,.x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input,.x .langEdit li.vi textarea,.x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input,.x .langEdit li.mn textarea,.x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input,.x .langEdit li.zh-CN textarea,.x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input,.x .langEdit li.zh-TW textarea,.x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}.x #imageMark{right:0}.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList caption .side .text .hide,.x .easyList caption .side .details .show{display:none}.x .easyList caption .side .details .hide{display:inline}.x .easyList td p:first-child{margin:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:transparent url(../img/iconFavorite.gif) no-repeat;border:0}.x .fvOn{background-position:0 -16px}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}.x .desc.error{color:#f00}.x .desc.success{color:#080}.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}.x .sTog{float:right;border:0;background-color:transparent;width:28px;height:18px;opacity:.5;filter:alpha(opacity=50)}@media all and (max-width:860px){.x .header .account ul{padding-right:10px}.x .body{padding:1em 0 0 0}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.x .rowTable td,.x .colTable th,.x .rowTable td,.x .crossTable th,.x .rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8;white-space:nowrap}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both}.x .moduleSearchWindow{position:absolute;width:700px;z-index:100}.x .moduleSearchWindow,.moduleSearchWindow div{margin:0;padding:0;color:#2d2c2d;font-size:12px}.x .moduleSearchWindow h2{margin:0;padding:4px;height:24px;line-height:24px;background:#666;text-align:left;color:#fff;font-size:12px}.x .moduleSearchWindow .sectionDiv{position:relative;margin:0px;background:#fff;border:1px solid}.x .moduleSearchWindow .siteList{float:left;width:295px}.x .moduleSearchWindow .highlight{background:yellow;color:red;font-style:italic}.x .moduleSearchWindow .moduleTypeList{margin-left:5px;float:left;width:200px}.x .moduleSearchWindow .moduleInstanceList{float:right;width:190px}.x .moduleSearchWindow ul{margin:0;padding:0;border:0}.x .moduleSearchWindow li{font-size:12px;border:0;border-bottom:1px solid #ccc;margin:0;padding:4px 4px;font-family:나눔고딕,NanumGothic,"맑은 고딕","Malgun Gothic",AppleGothic,돋움,Dotum,굴림,Gulim,sans-serif}.x .moduleSearchWindow li:hover,.moduleSearchWindow li.on{background:#eee;cursor:pointer}.x .moduleSearchWindow li div{margin:0;padding:0;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .moduleSearchWindow .siteList li div{width:270px}.x .moduleSearchWindow .siteListSearchBox{margin:0;padding:4px 0;height:24px;border-bottom:1px solid #888}.x .moduleSearchWindow .siteListSearchBoxBorder{margin-left:3px;height:22px;width:287px;border:1px solid #ccc}.x .moduleSearchWindow input.siteListSearchInput{margin:0;padding:0;position:relative;float:right;width:260px;margin-right:4px;border:0}.x .moduleSearchWindow .siteListSearchBox .searchImg{position:relative;float:left;margin-top:4px;margin-left:4px}.x .moduleSearchWindow .moduleTypeList li div{width:170px}.x .moduleSearchWindow .moduleInstanceList li div{width:190px}.x .moduleSearchWindow .moduleSearch_ok{float:right}.x .moduleSearchWindow select.moduleInstanceListSelect{width:100%}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.nav{margin-bottom:18px;margin-left:0;list-style:none}.nav > li > a{display:block}.nav > li > a:hover{text-decoration:none;background-color:#eeeeee}.nav > .pull-right{float:right}.nav .nav-header{display:block;padding:3px 15px;font-weight:bold;line-height:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase}.nav li + .nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list > li > a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5)}.nav-list > li > a{padding:3px 15px}.nav-list > .active > a,.nav-list > .active > a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs > li,.nav-pills > li{float:left}.nav-tabs > li > a,.nav-pills > li > a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs > li{margin-bottom:-1px}.nav-tabs > li > a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs > li > a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs > .active > a,.nav-tabs > .active > a:hover{color:#555555;cursor:default;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills > li > a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills > .active > a,.nav-pills > .active > a:hover{color:#ffffff;background-color:#0088cc}.nav-stacked > li{float:none}.nav-stacked > li > a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked > li > a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked > li:first-child > a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs.nav-stacked > li:last-child > a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.nav-tabs.nav-stacked > li > a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked > li > a{margin-bottom:3px}.nav-pills.nav-stacked > li:last-child > a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{margin-top:6px;border-top-color:#0088cc;border-bottom-color:#0088cc}.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333}.nav > .dropdown.active > a:hover{color:#000000;cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav > li.dropdown.open.active > a:hover{color:#ffffff;background-color:#999999;border-color:#999999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100)}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} \ No newline at end of file +@charset "utf-8";header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}.x,.x table,.x input,.x textarea,.x select,.x button{font-size:13px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}.x .section{margin:1em 0;padding:0;border:0}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em 0;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1+ul,.x .h2+ul,.x .h3+ul,.x .h4+ul,.x .h1+.table table,.x .h2+.table table,.x .h3+.table table,.x .h4+.table table{border-top:0!important;margin-top:-1em!important}.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2,.x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px!important;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none!important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear,0% 0,100% 0,from(rgba(255,255,255,0)),to(rgba(255,255,255,1)),color-stop(15%,#fff));background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd!important}.x .table td>input[type=text]{margin:-1px 0!important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table th.nowr,.x .table td.nowr{white-space:nowrap}.x .form{margin:0 0 1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=radio]+label,.x .form input[type=checkbox]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form span.desc,.x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .gnb{height:34px;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear,0% 0,0% 100%,from(#efefef),to(#dcdcdc));background:#efefef -moz-linear-gradient(top,#efefef,#dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef,endColorStr=#dcdcdc);zoom:1}.x .gnb:after{content:"";display:block;clear:both}.x .gnb .nav-gnb{float:left;position:relative;display:inline-block;*display:inline;zoom:1;margin:0 0 0 20px;padding:1px;list-style:none}.x .gnb .nav-gnb ul{_position:absolute;display:block;_display:inline;zoom:1;clear:both;margin:0;padding:0;border:0;overflow:hidden;height:0}.x .gnb.active .nav-gnb{top:-5px;padding:5px 5px 5px 0;margin:0 0 -100% 20px;border:1px solid #aaa;background:#fff;box-shadow:0 0 10px #999;border-radius:5px}.x .gnb.active .nav-gnb ul{top:0;_position:relative;box-shadow:none;display:block;_display:inline;clear:both;padding:0;margin:0;border:0}.x .gnb .nav-gnb:after{content:"";display:block;clear:both}.x .gnb .nav-gnb li{position:relative;display:inline-block;*display:inline;zoom:1;vertical-align:top;overflow:hidden;margin:0}.x .gnb .nav-gnb li.activeOn{z-index:10}.x .gnb .nav-gnb li.activeOn>a{border:1px solid #ccc}.x .gnb .nav-gnb li li{display:block;_float:left;clear:both;overflow:hidden;border:0;margin:0}.x .gnb .nav-gnb li li:first-child{border:0}.x .gnb .nav-gnb li a{display:block;_float:left;font-weight:bold;color:#333;font-size:12px;height:14px;padding:9px 0;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb .nav-gnb li a span{padding:0 15px;border-left:1px solid #fff}.x .gnb.active .nav-gnb li a span,.x .gnb .nav-gnb li:first-child a span,.x .gnb .nav-gnb li.activeOn+li a span{border:0;margin:0 0 0 1px}.x .gnb .nav-gnb li a:hover,.x .gnb .nav-gnb li a:active,.x .gnb .nav-gnb li a:focus{background:#f4f4f4}.x .gnb .nav-gnb li.activeOn>a{background:#fff;padding:8px 0}.x .gnb .nav-gnb li li a{color:#555;background:#fff;padding:5px 15px!important;font-weight:normal!important;border:0!important}.x .gnb .nav-gnb li li a:hover,.x .gnb .nav-gnb li li a:active,.x .gnb .nav-gnb li li a:focus{border:0;background:#eee}.x .gnb .mnv{width:100%;height:32px;display:none}@media all and (max-width:860px){.x .gnb{height:auto}.x .gnb .nav-gnb,.x .sct{display:none}.x .gnb .mnv{display:block}}.x .lnb{position:relative;float:left;width:210px;left:-230px;margin:0 0 20px 0;line-height:normal;zoom:1;display:inline}.x .lnb .h2{position:relative;z-index:2;margin:0 0 -1px 0;padding:0 10px;border:1px solid #444;border-bottom:0;border-radius:4px 4px 0 0;background:#555;font-size:13px;color:#fff;line-height:36px}.x .lnb ul{margin:0!important;padding:0;list-style:none;position:relative;z-index:1}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}.x .lnb li:last-child a,.x .lnb li.active:last-child{border-radius:0 0 4px 4px!important}.x .sct{float:left;width:210px;position:relative;left:-230px;margin:0;padding:8px 0;border:0;box-shadow:inset 0 0 1px rgba(0,0,0,0.5)}.x .sct h2{margin:0 0 5px 10px;font-size:13px}.x .sct ul{margin:0;font-size:12px}.x .sct li{position:relative}.x .sct a{text-decoration:none;padding:3px 18px 3px 10px}.x .sct form{position:absolute;margin:0;padding:0;top:2px;right:-10px}.x .sct .text{text-decoration:none;font-weight:bold;color:#999!important;width:16px;height:16px;margin:0}.x .sct .text:hover,.x .sct .text:active,.x .sct .text:focus{color:#333!important}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333!important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00!important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .starRating,.x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:99}.modal .bg{position:absolute;background:#000;_background:0;width:100%;height:100%;opacity:.5;z-index:2;filter:alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul,.modal ol,.modal .lined,.modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:0;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%}.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5)}.x .layer h2{font-size:14px}.x .layer ul,.x .layer ol,.x .layer .lined,.x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:0;padding:0;width:1px;height:1px;overflow:hidden}.x .h2Anchor{position:absolute;right:0;border:0;background:0;color:#00f;text-decoration:underline}.x .skipNav{margin:0;text-align:center}@media all and (max-width:860px){.x .skipNav{display:none}}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;padding:10px 0;font-weight:bold;overflow:hidden}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 0 10px 20px;font-size:24px;line-height:32px;display:inline-block;*display:inline;zoom:1;vertical-align:middle}.x .header h1 *{vertical-align:middle}.x .header h1 a{display:inline-block;color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1,OffY=1,Color=#000000,Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0 0 10px 20px;display:inline-block;*display:inline;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}.x .header .account ul{margin:0;padding:5px 20px 5px 0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-20px;padding:6px 4px!important;border:1px solid #666;border-top:0;background:#333}@media all and (max-width:860px){.x .header #language{right:-10px}}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}.x .footer *{font-size:12px}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}.x .footer .vr{color:#ccc}.x .body{position:relative;z-index:1;padding:30px 10px 30px 240px;zoom:1}.x .body:after{content:"";display:block;clear:both}.x .content{float:right;width:100%;margin-left:-210px;zoom:1;outline:0;min-height:500px}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}.x .dashboard .section{margin-top:0}.x .dashboard .portlet{float:left;width:48%;margin-right:1em;margin-top:0;min-height:188px}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media all and (min-width:1300px){.x .dashboard .portlet{float:left!important;width:32%!important;margin-right:1em!important}}.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:3px 4px;margin:0;border:0;background:transparent}.x .siteMap h2:hover input,.x .siteMap h2 input:focus{background:#ff0;border:1px dashed #ccc;margin:-1px}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0 solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0!important;padding-bottom:0!important;line-height:30px;background:transparent!important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px!important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p,.x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px}.x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input,.x .langEdit li.en textarea,.x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input,.x .langEdit li.ko textarea,.x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input,.x .langEdit li.jp textarea,.x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input,.x .langEdit li.fr textarea,.x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input,.x .langEdit li.de textarea,.x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input,.x .langEdit li.ru textarea,.x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input,.x .langEdit li.es textarea,.x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input,.x .langEdit li.tr textarea,.x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input,.x .langEdit li.vi textarea,.x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input,.x .langEdit li.mn textarea,.x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input,.x .langEdit li.zh-CN textarea,.x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input,.x .langEdit li.zh-TW textarea,.x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px!important}.x .mLangEdit li.active{background:#fffdef}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}.x #imageMark{right:0}.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList caption .side .text .hide,.x .easyList caption .side .details .show{display:none}.x .easyList caption .side .details .hide{display:inline}.x .easyList td p:first-child{margin:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:transparent url(../img/iconFavorite.gif) no-repeat;border:0}.x .fvOn{background-position:0 -16px}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none!important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .textList{border:1px solid #ddd!important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}.x .desc.error{color:#f00}.x .desc.success{color:#080}.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}.x .sTog{float:right;border:0;background-color:transparent;width:28px;height:18px;opacity:.5;filter:alpha(opacity=50)}@media all and (max-width:860px){.x .header .account ul{padding-right:10px}.x .body{padding:1em 0 0 0}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0;left:auto}.x .dashboard .portlet{float:none!important;width:auto!important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.x .rowTable td,.x .colTable th,.x .rowTable td,.x .crossTable th,.x .rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8;white-space:nowrap}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0!important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both}.x .moduleSearchWindow{position:absolute;width:700px;z-index:100}.x .moduleSearchWindow,.moduleSearchWindow div{margin:0;padding:0;color:#2d2c2d;font-size:12px}.x .moduleSearchWindow h2{margin:0;padding:4px;height:24px;line-height:24px;background:#666;text-align:left;color:#fff;font-size:12px}.x .moduleSearchWindow .sectionDiv{position:relative;margin:0;background:#fff;border:1px solid}.x .moduleSearchWindow .siteList{float:left;width:295px}.x .moduleSearchWindow .highlight{background:yellow;color:red;font-style:italic}.x .moduleSearchWindow .moduleTypeList{margin-left:5px;float:left;width:200px}.x .moduleSearchWindow .moduleInstanceList{float:right;width:190px}.x .moduleSearchWindow ul{margin:0;padding:0;border:0}.x .moduleSearchWindow li{font-size:12px;border:0;border-bottom:1px solid #ccc;margin:0;padding:4px 4px;font-family:나눔고딕,NanumGothic,"맑은 고딕","Malgun Gothic",AppleGothic,돋움,Dotum,굴림,Gulim,sans-serif}.x .moduleSearchWindow li:hover,.moduleSearchWindow li.on{background:#eee;cursor:pointer}.x .moduleSearchWindow li div{margin:0;padding:0;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .moduleSearchWindow .siteList li div{width:270px}.x .moduleSearchWindow .siteListSearchBox{margin:0;padding:4px 0;height:24px;border-bottom:1px solid #888}.x .moduleSearchWindow .siteListSearchBoxBorder{margin-left:3px;height:22px;width:287px;border:1px solid #ccc}.x .moduleSearchWindow input.siteListSearchInput{margin:0;padding:0;position:relative;float:right;width:260px;margin-right:4px;border:0}.x .moduleSearchWindow .siteListSearchBox .searchImg{position:relative;float:left;margin-top:4px;margin-left:4px}.x .moduleSearchWindow .moduleTypeList li div{width:170px}.x .moduleSearchWindow .moduleInstanceList li div{width:190px}.x .moduleSearchWindow .moduleSearch_ok{float:right}.x .moduleSearchWindow select.moduleInstanceListSelect{width:100%} +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world@twitter by@mdo and@fat. +*/ +[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.nav{margin-bottom:18px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav .nav-header{display:block;padding:3px 15px;font-weight:bold;line-height:18px;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.nav>.dropdown.active>a:hover{color:#000;cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 1b21c494b..e6fdc4bcd 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -23,19 +23,6 @@ jQuery(function($){ .parent() .css('position', 'relative'); - // Make selected checkbox elements bold - var $rc_label = $('input:radio+label,input:checkbox+label'), $input_rc = $rc_label.prev('input'); - $input_rc - .change(function(){ - var name = $(this).attr('name'); - $input_rc - .filter(function(){ return this.name == name }) - .next('label').css('font-weight', 'normal').end() - .filter(':checked') - .next('label').css('font-weight', 'bold').end(); - }) - .change(); - // Toogle checkbox all $('.form th>input:checkbox') .change(function() { @@ -1388,22 +1375,19 @@ function completeInstallModule(ret_obj) { jQuery(function($){ $('body').ajaxComplete(function(){ hideWaitingFogLayer() }); -// admin single column layout - if($('.x>.body .lnb').length == 0){ // When it have no lnb - $('.x>.body').addClass('single'); // Add class single - } // Details toggle in admin table var viewBtn = $('.x .dsTg span.side>button.text'); var tdTitle = $('.x .dsTg td.title'); tdTitle.each(function(){ var $t = $(this) if($t.find('p.update').length==0){ - $t.addClass('tg').find('>p:not(:first-child)').hide(); + $t.addClass('tg').find('>*:not(:first-child)').hide(); } else { $t.addClass('up'); } }); - var details = $('.x .dsTg td.tg>p:not(:first-child)'); + $('.x .dsTg .thumb').hide(); + var details = $('.x .dsTg td.tg>*:not(:first-child), .x .dsTg .thumb'); viewBtn.click(function(){ viewBtn.toggleClass('details'); details.slideToggle(200); diff --git a/modules/admin/tpl/js/admin.min.js b/modules/admin/tpl/js/admin.min.js index f251568e4..0e1c0bbe2 100644 --- a/modules/admin/tpl/js/admin.min.js +++ b/modules/admin/tpl/js/admin.min.js @@ -1,46 +1 @@ -jQuery(function(a){a(".form li").find('>input:text:not(".notmulti"),>input:password,>textarea').filter('input[value!=""],textarea:not(:empty)').prev("label").css("visibility","hidden").end().end().prev("label").addClass("overlap").css({top:"15px",left:"5px"}).next().focus(function(){var b=a(this).prev().stop().animate({opacity:0,left:"25px"},"fast",function(){b.css("visibility","hidden")})}).blur(function(){var b=a(this);""==a.trim(b.val())&&b.prev().stop().css("visibility","visible").animate({opacity:1, -left:"5px"},"fast")}).end().parent().css("position","relative");var d=a("input:radio+label,input:checkbox+label").prev("input");d.change(function(){var b=a(this).attr("name");d.filter(function(){return this.name==b}).next("label").css("font-weight","normal").end().filter(":checked").next("label").css("font-weight","bold").end()}).change();a(".form th>input:checkbox").change(function(){var b=a(this),e=b.data("name");b.closest("table").find("input:checkbox").filter(function(){var b=a(this);return!b.prop("disabled")&& -(b.attr("name")==e||b.data("name")==e)}).prop("checked",b.prop("checked")).end().end().trigger("update.checkbox",[e,this.checked])});a.fn.xePagination=function(){this.not(".xe-pagination").addClass("xe-pagination").find("span.tgContent").css("whiteSpace","nowrap").end().find("a.tgAnchor").each(function(){var b=a(this);b.after(a(b.attr("href")))}).end();return this};a(".pagination").xePagination();a(".portlet .action").css({display:"none",position:"absolute"}).parent().mouseleave(function(){a(this).find(">.action").fadeOut(100)}).mouseenter(function(){a(this).find(">.action").fadeIn(100)}).focusin(function(){a(this).mouseenter()}).focusout(function(){var b= -a(this),e;clearTimeout(b.data("timer"));e=setTimeout(function(){b.find(":focus").length||b.mouseleave()},10);b.data("timer",e)});a(window).resize(function(){1300>a(document).width()?(a(".dashboard>.section>br").remove(),a(".dashboard>.section>.portlet:odd").after('
    ')):(a(".dashboard>.section>br").remove(),a(".dashboard>.section>.portlet:eq(2),.dashboard>.section>.portlet:eq(5)").after('
    '))});a(window).resize();a(".header>.siteTool>a.i").bind("before-open.tc", -function(){a(this).addClass("active").next("div.tgContent").find(">.section:gt(0)").hide().end().find(">.btnArea>button").show()}).bind("after-close.tc",function(){a(this).removeClass("active")}).next("#siteMapList").find(">.section:last").after('

    ').find("+p>button").click(function(){a(this).hide().parent().prevAll(".section").show()});a.fn.xeMask=function(){this.each(function(){var b=a(this),e=b.text();/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig.test(e)&& -b.html(e.replace(/(@.+)$/,'...$1')).find(">.ellipsis").css({position:"absolute",zIndex:1}).hover(function(){a(this).next(".cover").mouseover()},function(){a(this).next(".cover").mouseout()}).end().find(">.cover").css({zIndex:2,opacity:0}).hover(function(){a(this).css("opacity",1).prev("span").css("visibility","hidden")},function(){a(this).css("opacity",0).prev("span").css("visibility","visible")}).end()})};a(".masked").xeMask()}); -jQuery(function(a){a.fn.xeMenu=function(){this.attr("role","navigation").find(">.nav-gnb>li").attr("role","menuitem").filter(":has(>ul)").attr("aria-haspopup","true").end().end().find(">.nav-gnb").mouseover(function(){a(this).parent(".gnb").addClass("active").end().find(">li>ul").css("height","auto").end()}).mouseleave(function(){a(this).parent(".gnb").removeClass("active").end().find(">li>ul").css("height","0").end()}).focusout(function(){var d=a(this);setTimeout(function(){d.find(":focus").length|| -d.mouseleave()},1)}).delegate("a",{focus:function(){a(this).mouseover()}})};a("div.gnb").xeMenu();a(".gnb>.mnv").change(function(){window.location.href=a(this).find("option:selected").val()})}); -jQuery(function(a){a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide()}).click(function(){var d=a(this),b,e;b=a(d.attr("href"));b.parent("body").length||(e=a(''),e.click(function(){b.data("anchor").trigger("close.mw")}),b.prepend('').append('<\!--[if IE 6]>').find(">.fg").prepend(e).append(e.clone(!0)).end().appendTo("body")); -b.data("anchor",d);"showing"==b.data("state")?d.trigger("close.mw"):d.trigger("open.mw");return!1}).bind("open.mw",function(){var d=a(this),b,e;b=a.Event("before-open.mw");d.trigger(b);if(b.isDefaultPrevented())return!1;b=a(d.attr("href"));e=d.data("duration")||"fast";b.data("state","showing");a("html,body").addClass("modalContainer");a(document).bind("keydown.mw",function(a){if(27==a.which)return d.trigger("close.mw"),!1});b.fadeIn(e,function(){d.trigger("after-open.mw")}).find(">.bg").height(a(document).height()).end().find("button.modalClose:first").focus()}).bind("close.mw", -function(){var d=a(this),b,e;b=a.Event("before-close.mw");d.trigger(b);if(b.isDefaultPrevented())return!1;b=a(d.attr("href"));e=d.data("duration")||"fast";b.data("state","hiding");a("html,body").removeClass("modalContainer");b.fadeOut(e,function(){d.trigger("after-close.mw")});d.focus()})};a("a.modalAnchor").xeModalWindow();a("div.modal").addClass("x").hide()}); -jQuery(function(a){var d=!1;a.fn.xeContentToggler=function(){this.not(".xe-content-toggler").addClass("xe-content-toggler").each(function(){var b=a(this);$layer=a(b.attr("href"));$layer.hide().not(".xe-toggling-content").addClass("xe-toggling-content").mousedown(function(){d=!0}).focusout(function(){setTimeout(function(){!d&&(!$layer.find(":focus").length&&"showing"==$layer.data("state"))&&b.trigger("close.tc");d=!1},1)})}).click(function(){var b=a(this),e;e=a(b.attr("href"));e.data("anchor",b);"showing"== -e.data("state")?b.trigger("close.tc"):b.trigger("open.tc");return!1}).bind("open.tc",function(){function b(){e.trigger("after-open.tc")}var e=a(this),j,g,f;j=a(e.attr("href"));g=e.data("effect");f=e.data("duration")||"fast";j.data("state","showing");e.trigger("before-open.tc");d=!1;a(document).unbind("mousedown.tc keydown.tc").bind("mousedown.tc keydown.tc",function(b){if(b&&("keydown"==b.type&&27!=b.which||"mousedown"==b.type&&(b=a(b.target),b.is("html,.tgAnchor,.tgContent")||j.has(b).length)))return!0; -e.trigger("close.tc");return!1});switch(g){case "slide":j.slideDown(f,b);break;case "slide-h":g=j.css({"overflow-x":"",width:""}).width();j.show().css({"overflow-x":"hidden",width:"0px"}).animate({width:g},f,function(){j.css({"overflow-x":"",width:""});b()});break;case "fade":j.fadeIn(f,b);break;default:j.show(),e.trigger("after-open.tc")}}).bind("close.tc",function(){function b(){e.trigger("after-close.tc")}var e=a(this),d,g,f;a(document).unbind("mousedown.tc keydown.tc");d=a(e.attr("href"));g=e.data("effect"); -f=e.data("duration")||"fast";d.data("state","hiding");e.trigger("before-close.tc");switch(g){case "slide":d.slideUp(f,b);break;case "slide-h":d.animate({width:0},f,function(){d.hide();b()});break;case "fade":d.fadeOut(f,b);break;default:d.hide(),e.trigger("after-close.tc")}});return this};a("a.tgAnchor").xeContentToggler()}); -jQuery(function(a){a.fn.xeModuleFinder=function(){this.not(".xe-module-finder").addClass("xe-module-finder").find("a.tgAnchor.findsite").bind("before-open.tc",function(){var d,b,e;d=a(this);b=a(d.attr("href")).find(">ul");e=d.prev("input:text").val();a.exec_json("admin.getSiteAllList",{domain:e},function(e){var g=e.site_list,f,k;b.empty();d.closest(".modulefinder").find(".moduleList,.moduleIdList").attr("disabled","disabled");if(e.error||!a.isArray(g))d.trigger("close.tc");else{f=0;for(k=g.length;f< -k;f++)e=a("
  • ").appendTo(b),a('
  • ');a.fn.xeSortableTable=function(){this.not(".xe-sortable-table").addClass("xe-sortable-table").delegate("button.dragBtn","mousedown.st",function(e){var j,g,f,k,n,h,o,m,l,q;if(1==e.which){g=a(this);f=g.closest("tr");k=g.closest("table");q=k.get(0).offsetParent;g=f.height();n=f.width();before_event=a.Event("before-drag.st"); -k.trigger(before_event);if(before_event.isDefaultPrevented())return!1;j=e.pageY;h=d(f.get(0),q);$clone=f.attr("target",!0).clone(!0).appendTo(k);l=(e=k.find("thead th")).length;e.filter("[colspan]").attr("colspan",function(a,b){l+=b-1});b.find("td").attr("colspan",l);o=[];k.find("tbody>tr:not([target],.sticky,:hidden)").each(function(){var b=a(this),e;e=d(this,q);o.push({top:e.top,bottom:e.top+b.height(),$item:b})});$clone.addClass("draggable").css({position:"absolute",opacity:0.6,width:n,height:g, -left:h.left,top:h.top,zIndex:100});b.css({position:"absolute",opacity:0.6,width:n,height:"10px",left:h.left,top:h.top,backgroundColor:"#bbb",overflow:"hidden",zIndex:99}).appendTo(k);f.css("opacity",0.6);a(document).unbind("mousedown.st mouseup.st").bind("mousemove.st",function(a){var e,d,f;m=null;a=h.top-(j-a.pageY);e=0;for(d=o.length;ea||ea-12?(m.state="before",b.css("top",f.top-5)):(m.state="after",b.css("top",f.bottom-5)));$clone.css({top:a})}).bind("mouseup.st", -function(){var e;a(document).unbind("mousemove.st mouseup.st");f.removeAttr("target").css("opacity","");$clone.remove();b.remove();m&&(e=a(m.element),e[m.state](f),k.trigger("after-drag.st"))})}});return this};a("table.sortable").xeSortableTable()}); -jQuery(function(a){var d=null,b=null,e=0,j=null,g=!1,f=!1,k;a(".multiLangEdit").delegate("input.vLang:text,textarea.vLang",{textchange:function(){function d(){f.addClass("loading");l.parent().is(":visible")&&l.parent().hide();show_waiting_message=!1;a.exec_json("module.getLangListByLangcodeForAutoComplete",{search_keyword:m},function(b){return function(d){var h=d.results,g,m;f.removeClass("loading");if(!d.error&&h&&!(0===h.length||e!=b+1)){l.empty();g=0;for(m=h.length;g').data("langkey", -h[g].name).text(h[g].value),a("
  • ").append(d).appendTo(l);k.trigger("show")}}}(e++));show_waiting_message=!0}var f=a(this),m=a.trim(f.val()),l;b&&(clearTimeout(b),b=null);f.data("mle-container");l=k.find(">ul");!m||g?(g=!1,l.parent().hide(),f.prev("input.vLang").val("")):(f.data("mle-langkey").val(""),f.prev("input.vLang").val(m),b=setTimeout(d,100))},keydown:function(b){var e,d,f=b.which;a(this);b=k.find(">ul");if(!k.is(":visible")||0>a.inArray(f,[38,40,13,27]))return!0;if(27==f)return k.trigger("hide"), -!1;e=b.find("button.active");if(13==f){if(0===e.length)return!0;e.click();return!1}if(!e.length)return b.find("li>button:first").addClass("active"),!1;38==f?(d=e.parent().prev("li").find(">button"),d.length||(d=b.find(">li:last>button"))):40==f&&(d=e.parent().next("li").find(">button"),d.length||(d=b.find(">li:first>button")));e.removeClass("active");d.addClass("active");return!1},focus:function(){var b=a(this),e=a.trim(b.val()),f=b.closest(".multiLangEdit");b.after(k);b.data("mle-container")||b.data("mle-container", -f);b.data("mle-langkey")||b.data("mle-langkey",f.find("input.vLang:first"));(function(){var f=a.trim(b.val());f!=e&&(e=f,b.trigger("textchange"));d=setTimeout(arguments.callee,50)})()},blur:function(){clearTimeout(d);d=null;a(this).closest(".multiLangEdit").focusout()},focusout:function(){var b=a(this);clearTimeout(j);j=setTimeout(function(){f?f=!1:b.find(":focus").is(".vLang,button._btnLang")||k.trigger("hide")},10)}}).delegate("a.tgAnchor.editUserLang",{"before-open.tc":function(){var b,e,d;b=a(this); -e=a(b.attr("href")).insertBefore(b);d=b.closest(".multiLangEdit").find("input.vLang,textarea.vLang");b=d.eq(0).val();d=d.eq(1).val();var f=e,g=function(){var a=[];v.each(function(){a.push(this.value)});return a.join("\n")},j=function(){f.data("multilang-current-name")?f.find("h2").find("strong").text(p==y?t:z).end().find("a").text(p==y?z:t).show().end():f.find("h2").find("strong").text(t).end().find("a").hide()},r,v,w="",s=0,p,t,z,u=[],y=0;f.data("init-multilang-editor")||(f.data("init-multilang-editor", -!0).bind("multilang-reset",function(){f.data("multilang-current-name","").find(".langInput li").find(">input:text,>textarea").val("").prev("label").css("visibility","visible");p=y;j()}).find("h2 a").click(function(){p=!p;j();return!1}).end().delegate("a.langItem","click",function(){var b=a(this),e,d,h;d=f.data("multilang-list");h=b.data("multilang-name");if(d&&d[h]){d=d[h];e=f.find(".langInput");f.trigger("multilang-reset").find(".langList li.active").removeClass("active").end().data("multilang-current-name", -h);b.parent("li").addClass("active");for(var k in d)d.hasOwnProperty(k)&&e.find("li."+k).find(">input:text,>textarea").data("multilang-value",d[k]).val(d[k]).prev("label").css("visibility","hidden");w=g();s=0;r.val(u[s]);p=1;j();return!1}}).data("layer_index",n).find(".langInput").attr("id","langInput_"+n++),z=f.find("h2 strong").text(),t=f.find("h2 a").text(),v=f.find("input:text,textarea").change(function(){var a=g()==w?0:1;a!=s&&r.val(u[s=a])}),r=f.find("input[type=submit]").click(function(){function b(){f.hide().closest(".multiLangEdit").find(".vLang").eq(0).val("$user_lang->"+ -d).end().eq(1).val(f.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val()).end()}function e(a){a&&(!a.error&&a.name)&&(d=a.name,b())}var d=f.data("multilang-current-name");if(g()==w)b();else{var h={};d&&1==p&&(h.lang_name=d);v.each(function(){var b=a(this);h[b.parent("li").attr("class")]=b.val()});a.exec_json("module.procModuleAdminInsertLang",h,e)}return!1}),u=r.val().split("|"),r.val(u[0]));e.trigger("multilang-reset").removeClass("showChild").find(".langList").empty().end(); -e.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val(d).prev("label").css("visibility","hidden");k.trigger("hide");/^\$user_lang->(.+)$/.test(b)?(b="module.getModuleAdminLangListByName",d={lang_name:RegExp.$1}):(b="module.getModuleAdminLangListByValue",d={value:d});show_waiting_message=!1;a.exec_json(b,d,function(b){var d=b.lang_list,f;if(!b.error&&d){var b=d,g,h={},j,d=0;for(g=b.length;d").appendTo(f),g=e.data("layer_index"),h=this[xe.current_lang];if(!h)for(lang_code in this){h=this[lang_code];break}a('').text(h).data("multilang-name",b).appendTo(d)});var b=d,d=0,k;for(k in b)b.hasOwnProperty(k)&&d++;d>1&&e.addClass("showChild");e.find(".langList>li>a:first").click()}});show_waiting_message=!0}}).delegate("button._btnLang",{click:function(){var b=a(this);g=!0;k.trigger("hide"); -b.closest(".multiLangEdit").find("input.vLang,textarea.vLang").eq(0).val(b.data("langkey")).end().eq(1).val(b.text()).end();return!1},mousedown:function(){f=!0},focus:function(){a(this).mouseover()},mouseover:function(){a(this).closest("ul").find("button.active").removeClass("active")}});k=a('
      ').bind("show",function(){a(this).show()}).bind("hide",function(){a(this).hide()});var n=0}); -jQuery(function(a){a(".filebox").bind("before-open.mw",function(){function d(g){e.html(g.html);e.find(".lined .select").bind("click",function(){var d=a("input.select_checkbox:checked");0==d.length?(d=a(this).parent().find("img.filebox_item").attr("src"))?(b.trigger("filebox.selected",[d]),b.trigger("close.mw")):alert("None selected!"):(b.trigger("filebox.selected",[d]),b.trigger("close.mw"));return!1});e.find(".pagination").find("a").filter(function(){return a(this).hasClass("tgAnchor")?!1:!0}).bind("click", -function(){var b=a(this).attr("page");a.exec_json("module.getFileBoxListHtml",{page:b},d);a(window).scrollTop(a(j).find(".modalClose").offset().top);return!1});a("#FileBoxGoTo").find("button").bind("click",function(){var b=a(this).prev("input").val();a.exec_json("module.getFileBoxListHtml",{page:b},d);a(window).scrollTop(a(j).find(".modalClose").offset().top);return!1})}var b,e,j;b=a(this);j=b.attr("href");e=a(j).find(".filebox_list");a.exec_json("module.getFileBoxListHtml",{page:"1"},d)})}); -function showWaitingFogLayer(){var a=jQuery('');a.height(jQuery(window).height());jQuery(".wfsr").wrap('
      ').before(a)}function hideWaitingFogLayer(){jQuery(".wfsr").prev("span").remove();jQuery(".wfsr").unwrap()}function doInstallModule(a){var d=[];d.module_name=a;exec_xml("install","procInstallAdminInstall",d,completeInstallModule);showWaitingFogLayer()} -function doUpdateModule(a){var d=[];d.module_name=a;exec_xml("install","procInstallAdminUpdate",d,completeInstallModule);showWaitingFogLayer()}function completeInstallModule(a){alert(a.message);location.reload()} -jQuery(function(a){a("body").ajaxComplete(function(){hideWaitingFogLayer()});0==a(".x>.body .lnb").length&&a(".x>.body").addClass("single");var d=a(".x .dsTg span.side>button.text");a(".x .dsTg td.title").each(function(){var b=a(this);0==b.find("p.update").length?b.addClass("tg").find(">p:not(:first-child)").hide():b.addClass("up")});var b=a(".x .dsTg td.tg>p:not(:first-child)");d.click(function(){d.toggleClass("details");b.slideToggle(200)});a(".x .content .h2, .x .content .h3").not(".portlet .h2, .modal .h2").each(function(){var b= -a('');a(this).append(b);b.click(function(){var b=a(this),d=b.parent().nextUntil(".h2, .h3").not(".langEdit, .tgContent, .modal");b.parent().next().is(":hidden")?(b.find("i").attr("class","icon-chevron-up"),d.slideDown(200)):(b.find("i").attr("class","icon-chevron-down"),d.slideUp(200))})})}); +jQuery(function(b){var a=27;b(".form li").find('>input:text:not(".notmulti"),>input:password,>textarea').filter('input[value!=""],textarea:not(:empty)').prev("label").css("visibility","hidden").end().end().prev("label").addClass("overlap").css({top:"15px",left:"5px"}).next().focus(function(){var d=b(this).prev().stop().animate({opacity:0,left:"25px"},"fast",function(){d.css("visibility","hidden");});}).blur(function(){var e=b(this),d;if(b.trim(e.val())==""){d=e.prev().stop().css("visibility","visible").animate({opacity:1,left:"5px"},"fast");}}).end().parent().css("position","relative");b(".form th>input:checkbox").change(function(){var e=b(this),d=e.data("name");e.closest("table").find("input:checkbox").filter(function(){var f=b(this);return !f.prop("disabled")&&((f.attr("name")==d)||(f.data("name")==d));}).prop("checked",e.prop("checked")).end().end().trigger("update.checkbox",[d,this.checked]);});b.fn.xePagination=function(){this.not(".xe-pagination").addClass("xe-pagination").find("span.tgContent").css("whiteSpace","nowrap").end().find("a.tgAnchor").each(function(d){var e=b(this);e.after(b(e.attr("href")));}).end();return this;};b(".pagination").xePagination();b(".portlet .action").css({display:"none",position:"absolute"}).parent().mouseleave(function(){b(this).find(">.action").fadeOut(100);}).mouseenter(function(){b(this).find(">.action").fadeIn(100);}).focusin(function(){b(this).mouseenter();}).focusout(function(){var d=b(this),e;clearTimeout(d.data("timer"));e=setTimeout(function(){if(!d.find(":focus").length){d.mouseleave();}},10);d.data("timer",e);});b(window).resize(function(){if(b(document).width()<1300){b(".dashboard>.section>br").remove();b(".dashboard>.section>.portlet:odd").after('
      ');}else{b(".dashboard>.section>br").remove();b(".dashboard>.section>.portlet:eq(2),.dashboard>.section>.portlet:eq(5)").after('
      ');}});b(window).resize();b(".header>.siteTool>a.i").bind("before-open.tc",function(){b(this).addClass("active").next("div.tgContent").find(">.section:gt(0)").hide().end().find(">.btnArea>button").show();}).bind("after-close.tc",function(){b(this).removeClass("active");}).next("#siteMapList").find(">.section:last").after('

      ').find("+p>button").click(function(){b(this).hide().parent().prevAll(".section").show();});b.fn.xeMask=function(){this.each(function(){var d=b(this),f=d.text();var e=/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig;if(e.test(f)){d.html(f.replace(/(@.+)$/,'...$1')).find(">.ellipsis").css({position:"absolute",zIndex:1}).hover(function(){b(this).next(".cover").mouseover();},function(){b(this).next(".cover").mouseout();}).end().find(">.cover").css({zIndex:2,opacity:0}).hover(function(){b(this).css("opacity",1).prev("span").css("visibility","hidden");},function(){b(this).css("opacity",0).prev("span").css("visibility","visible");}).end();}});};b(".masked").xeMask();});jQuery(function(a){a.fn.xeMenu=function(){this.attr("role","navigation").find(">.nav-gnb>li").attr("role","menuitem").filter(":has(>ul)").attr("aria-haspopup","true").end().end().find(">.nav-gnb").mouseover(function(){a(this).parent(".gnb").addClass("active").end().find(">li>ul").css("height","auto").end();}).mouseleave(function(){a(this).parent(".gnb").removeClass("active").end().find(">li>ul").css("height","0").end();}).focusout(function(){var b=a(this);setTimeout(function(){if(!b.find(":focus").length){b.mouseleave();}},1);}).delegate("a",{focus:function(){a(this).mouseover();}});};a("div.gnb").xeMenu();a(".gnb>.mnv").change(function(){window.location.href=a(this).find("option:selected").val();});});jQuery(function(a){var b=27;a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide();}).click(function(){var g=a(this),d,f,e;d=a(g.attr("href"));if(!d.parent("body").length){f=a('');f.click(function(){d.data("anchor").trigger("close.mw");});d.prepend('').append('').find(">.fg").prepend(f).append(f.clone(true)).end().appendTo("body");}d.data("anchor",g);if(d.data("state")=="showing"){g.trigger("close.mw");}else{g.trigger("open.mw");}return false;}).bind("open.mw",function(){var g=a(this),d,e,f;d=a.Event("before-open.mw");g.trigger(d);if(d.isDefaultPrevented()){return false;}e=a(g.attr("href"));f=g.data("duration")||"fast";e.data("state","showing");a("html,body").addClass("modalContainer");function h(){g.trigger("after-open.mw");}a(document).bind("keydown.mw",function(j){if(j.which==b){g.trigger("close.mw");return false;}});e.fadeIn(f,h).find(">.bg").height(a(document).height()).end().find("button.modalClose:first").focus();}).bind("close.mw",function(){var g=a(this),d,e,f;d=a.Event("before-close.mw");g.trigger(d);if(d.isDefaultPrevented()){return false;}e=a(g.attr("href"));f=g.data("duration")||"fast";e.data("state","hiding");a("html,body").removeClass("modalContainer");function h(){g.trigger("after-close.mw");}e.fadeOut(f,h);g.focus();});};a("a.modalAnchor").xeModalWindow();a("div.modal").addClass("x").hide();});jQuery(function(b){var a=false;var d=27;b.fn.xeContentToggler=function(){this.not(".xe-content-toggler").addClass("xe-content-toggler").each(function(){var e=b(this);$layer=b(e.attr("href"));$layer.hide().not(".xe-toggling-content").addClass("xe-toggling-content").mousedown(function(f){a=true;}).focusout(function(f){setTimeout(function(){if(!a&&!$layer.find(":focus").length&&$layer.data("state")=="showing"){e.trigger("close.tc");}a=false;},1);});}).click(function(){var f=b(this),e;e=b(f.attr("href"));e.data("anchor",f);if(e.data("state")=="showing"){f.trigger("close.tc");}else{f.trigger("open.tc");}return false;}).bind("open.tc",function(){var j=b(this),f,g,h;f=b(j.attr("href"));g=j.data("effect");h=j.data("duration")||"fast";f.data("state","showing");j.trigger("before-open.tc");a=false;b(document).unbind("mousedown.tc keydown.tc").bind("mousedown.tc keydown.tc",function(l){if(l){if(l.type=="keydown"&&l.which!=d){return true;}if(l.type=="mousedown"){var m=b(l.target);if(m.is("html,.tgAnchor,.tgContent")||f.has(m).length){return true;}}}j.trigger("close.tc");return false;});function k(){j.trigger("after-open.tc");}switch(g){case"slide":f.slideDown(h,k);break;case"slide-h":var e=f.css({"overflow-x":"",width:""}).width();f.show().css({"overflow-x":"hidden",width:"0px"}).animate({width:e},h,function(){f.css({"overflow-x":"",width:""});k();});break;case"fade":f.fadeIn(h,k);break;default:f.show();j.trigger("after-open.tc");}}).bind("close.tc",function(){var h=b(this),e,f,g;b(document).unbind("mousedown.tc keydown.tc");e=b(h.attr("href"));f=h.data("effect");g=h.data("duration")||"fast";e.data("state","hiding");h.trigger("before-close.tc");function j(){h.trigger("after-close.tc");}switch(f){case"slide":e.slideUp(g,j);break;case"slide-h":e.animate({width:0},g,function(){e.hide();j();});break;case"fade":e.fadeOut(g,j);break;default:e.hide();h.trigger("after-close.tc");}});return this;};b("a.tgAnchor").xeContentToggler();});jQuery(function(a){a.fn.xeModuleFinder=function(){this.not(".xe-module-finder").addClass("xe-module-finder").find("a.tgAnchor.findsite").bind("before-open.tc",function(){var d,b,e;d=a(this);b=a(d.attr("href")).find(">ul");e=d.prev("input:text").val();function f(j){var l,h=j.site_list,g,k;b.empty();d.closest(".modulefinder").find(".moduleList,.moduleIdList").attr("disabled","disabled");if(j.error||!a.isArray(h)){d.trigger("close.tc");return;}for(g=0,k=h.length;g").appendTo(b);a('
    • ');e.fn.xeSortableTable=function(){this.not(".xe-sortable-table").addClass("xe-sortable-table").delegate("button.dragBtn","mousedown.st",function(f){var n,m,r,t,s,g,j,l,h,k,p,o,q;if(f.which!=1){return;}n=e(this);m=n.closest("tr");r=n.closest("table");q=r.get(0).offsetParent;s=m.height();g=m.width();before_event=e.Event("before-drag.st");r.trigger(before_event);if(before_event.isDefaultPrevented()){return false;}l={x:f.pageX,y:f.pageY};j=a(m.get(0),q);$clone=m.attr("target",true).clone(true).appendTo(r);o=(t=r.find("thead th")).length;t.filter("[colspan]").attr("colspan",function(v,u){o+=u-1;});b.find("td").attr("colspan",o);h=[];r.find("tbody>tr:not([target],.sticky,:hidden)").each(function(){var u=e(this),v;v=a(this,q);h.push({top:v.top,bottom:v.top+u.height(),$item:u});});$clone.addClass("draggable").css({position:"absolute",opacity:0.6,width:g,height:s,left:j.left,top:j.top,zIndex:100});b.css({position:"absolute",opacity:0.6,width:g,height:"10px",left:j.left,top:j.top,backgroundColor:"#bbb",overflow:"hidden",zIndex:99}).appendTo(r);m.css("opacity",0.6);e(document).unbind("mousedown.st mouseup.st").bind("mousemove.st",function(x){var y,v,w,u,A,z;p=null;y={x:l.x-x.pageX,y:l.y-x.pageY};v=j.top-y.y;for(u=0,A=h.length;uv)||((uv-12){p.state="before";b.css("top",z.top-5);}else{p.state="after";b.css("top",z.bottom-5);}}$clone.css({top:v});}).bind("mouseup.st",function(u){var v;d=false;e(document).unbind("mousemove.st mouseup.st");m.removeAttr("target").css("opacity","");$clone.remove();b.remove();if(!p){return;}v=e(p.element);v[p.state](m);r.trigger("after-drag.st");});});return this;};e("table.sortable").xeSortableTable();function a(g,f){var j=0,h=0;while(g&&g!=f){j+=g.offsetTop;h+=g.offsetLeft;g=g.offsetParent;}return{top:j,left:h};}});jQuery(function(j){var o=null,a=null,b=0,m=null,k=false,p=false,r;var d=27,q=38,n=40,f=13;j(".multiLangEdit").delegate("input.vLang:text,textarea.vLang",{textchange:function(){var u=j(this),w=j.trim(u.val()),s,v;if(a){clearTimeout(a);a=null;}v=u.data("mle-container");s=r.find(">ul");if(!w||k){k=false;s.parent().hide();u.prev("input.vLang").val("");return;}u.data("mle-langkey").val("");u.prev("input.vLang").val(w);function t(){u.addClass("loading");if(s.parent().is(":visible")){s.parent().hide();}show_waiting_message=false;j.exec_json("module.getLangListByLangcodeForAutoComplete",{search_keyword:w},(function(y){return function(z){x(z,y);};})(b++));show_waiting_message=true;}function x(C,y){var A=C.results,B,z,D;u.removeClass("loading");if(C.error||!A||A.length===0||(b!=y+1)){return;}s.empty();for(z=0,D=A.length;z').data("langkey",A[z].name).text(A[z].value);j("
    • ").append(B).appendTo(s);}r.trigger("show");}a=setTimeout(t,100);},keydown:function(w){var x,t,s,v,u=w.which;x=j(this);t=r.find(">ul");if(!r.is(":visible")||j.inArray(u,[q,n,f,d])<0){return true;}if(u==d){r.trigger("hide");return false;}s=t.find("button.active");if(u==f){if(s.length===0){return true;}s.click();return false;}if(!s.length){t.find("li>button:first").addClass("active");return false;}if(u==q){v=s.parent().prev("li").find(">button");if(!v.length){v=t.find(">li:last>button");}}else{if(u==n){v=s.parent().next("li").find(">button");if(!v.length){v=t.find(">li:first>button");}}}s.removeClass("active");v.addClass("active");return false;},focus:function(){var t=j(this),s=j.trim(t.val()),u=t.closest(".multiLangEdit");t.after(r);if(!t.data("mle-container")){t.data("mle-container",u);}if(!t.data("mle-langkey")){t.data("mle-langkey",u.find("input.vLang:first"));}(function(){var v=j.trim(t.val());if(v!=s){s=v;t.trigger("textchange");}o=setTimeout(arguments.callee,50);})();},blur:function(){clearTimeout(o);o=null;j(this).closest(".multiLangEdit").focusout();},focusout:function(){var s=j(this);clearTimeout(m);m=setTimeout(function(){if(p){p=false;return;}if(!s.find(":focus").is(".vLang,button._btnLang")){r.trigger("hide");}},10);}}).delegate("a.tgAnchor.editUserLang",{"before-open.tc":function(){var x,v,t,y,z,A,w,u;x=j(this);v=j(x.attr("href")).insertBefore(x);t=x.closest(".multiLangEdit");y=t.find("input.vLang,textarea.vLang");z=y.eq(0).val();A=y.eq(1).val();h(v);v.trigger("multilang-reset").removeClass("showChild").find(".langList").empty().end();v.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val(A).prev("label").css("visibility","hidden");r.trigger("hide");if(/^\$user_lang->(.+)$/.test(z)){w="module.getModuleAdminLangListByName";u={lang_name:RegExp.$1};}else{w="module.getModuleAdminLangListByValue";u={value:A};}function s(E){var D=E.lang_list,F,C,H,B,G;if(E.error||!D){return;}D=e(D);v.data("multilang-list",D);G=v.find(".langList");j.each(D,function(J){var L=j("
    • ").appendTo(G);var I=v.data("layer_index");var K=this[xe.current_lang];if(!K){for(lang_code in this){K=this[lang_code];break;}}j('').text(K).data("multilang-name",J).appendTo(L);});if(l(D)>1){v.addClass("showChild");}v.find(".langList>li>a:first").click();}show_waiting_message=false;j.exec_json(w,u,s);show_waiting_message=true;}}).delegate("button._btnLang",{click:function(){var s=j(this);k=true;r.trigger("hide");s.closest(".multiLangEdit").find("input.vLang,textarea.vLang").eq(0).val(s.data("langkey")).end().eq(1).val(s.text()).end();return false;},mousedown:function(){p=true;},focus:function(){j(this).mouseover();},mouseover:function(){j(this).closest("ul").find("button.active").removeClass("active");}});r=j('
        ').bind("show",function(){j(this).show();}).bind("hide",function(){j(this).hide();});var g=0;function h(y){var t,E,F="",A=0,z,D,B,w=[];var C=0,v=1,x=0,s=1;if(y.data("init-multilang-editor")){return;}y.data("init-multilang-editor",true).bind("multilang-reset",function(){y.data("multilang-current-name","").find(".langInput li").find(">input:text,>textarea").val("").prev("label").css("visibility","visible");z=x;G();}).find("h2 a").click(function(){z=!z;G();return false;}).end().delegate("a.langItem","click",function(){var M=j(this),H,L,I,J,N;L=y.data("multilang-list");I=M.data("multilang-name");if(!L||!L[I]){return;}L=L[I];H=y.find(".langInput");y.trigger("multilang-reset").find(".langList li.active").removeClass("active").end().data("multilang-current-name",I);M.parent("li").addClass("active");for(var K in L){if(!L.hasOwnProperty(K)){continue;}H.find("li."+K).find(">input:text,>textarea").data("multilang-value",L[K]).val(L[K]).prev("label").css("visibility","hidden");}F=u();A=0;t.val(w[A]);z=s;G();return false;}).data("layer_index",g).find(".langInput").attr("id","langInput_"+g++);B=y.find("h2 strong").text();D=y.find("h2 a").text();E=y.find("input:text,textarea").change(function(){var H=(u()==F)?C:v;if(H!=A){t.val(w[A=H]);}});function u(){var H=[];E.each(function(){H.push(this.value);});return H.join("\n");}function G(){if(!y.data("multilang-current-name")){y.find("h2").find("strong").text(D).end().find("a").hide();}else{y.find("h2").find("strong").text(z==x?D:B).end().find("a").text(z==x?B:D).show().end();}}t=y.find("input[type=submit]").click(function(){var I=y.data("multilang-current-name");function H(){y.hide().closest(".multiLangEdit").find(".vLang").eq(0).val("$user_lang->"+I).end().eq(1).val(y.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val()).end();}function J(){var L={};if(I&&z==s){L.lang_name=I;}E.each(function(N,M){var O=j(this);L[O.parent("li").attr("class")]=O.val();});j.exec_json("module.procModuleAdminInsertLang",L,K);}function K(L){if(!L||L.error||!L.name){return;}I=L.name;H();}(u()==F)?H():J();return false;});w=t.val().split("|");t.val(w[C]);}function e(u){var s,w,v={},t;for(s=0,w=u.length;s');a.height(jQuery(window).height());jQuery(".wfsr").wrap('
        ').before(a);}function hideWaitingFogLayer(){jQuery(".wfsr").prev("span").remove();jQuery(".wfsr").unwrap();}function doInstallModule(a){var b=new Array();b.module_name=a;exec_xml("install","procInstallAdminInstall",b,completeInstallModule);showWaitingFogLayer();}function doUpdateModule(a){var b=new Array();b.module_name=a;exec_xml("install","procInstallAdminUpdate",b,completeInstallModule);showWaitingFogLayer();}function completeInstallModule(a){alert(a.message);location.reload();}jQuery(function(f){f("body").ajaxComplete(function(){hideWaitingFogLayer();});var e=f(".x .dsTg span.side>button.text");var b=f(".x .dsTg td.title");b.each(function(){var g=f(this);if(g.find("p.update").length==0){g.addClass("tg").find(">*:not(:first-child)").hide();}else{g.addClass("up");}});f(".x .dsTg .thumb").hide();var d=f(".x .dsTg td.tg>*:not(:first-child), .x .dsTg .thumb");e.click(function(){e.toggleClass("details");d.slideToggle(200);});var a=f(".x .content .h2, .x .content .h3").not(".portlet .h2, .modal .h2");a.each(function(){var g=f('');f(this).append(g);g.click(function(){var j=f(this);var h=j.parent().nextUntil(".h2, .h3").not(".langEdit, .tgContent, .modal");if(j.parent().next().is(":hidden")){j.find("i").attr("class","icon-chevron-up");h.slideDown(200);}else{j.find("i").attr("class","icon-chevron-down");h.slideUp(200);}});});}); \ No newline at end of file diff --git a/modules/admin/tpl/js/sitemap.min.js b/modules/admin/tpl/js/sitemap.min.js index c8a93e41f..16c3a971f 100644 --- a/modules/admin/tpl/js/sitemap.min.js +++ b/modules/admin/tpl/js/sitemap.min.js @@ -1,5 +1,5 @@ -jQuery(function(c){function o(a,c){for(var b=0,g=0;a&&a!=c;)b+=a.offsetTop,g+=a.offsetLeft,a=a.offsetParent;return{top:b,left:g}}var l=!1,k=c('
      • ');c("form.siteMap").delegate("li:not(.placeholder)",{"mousedown.st":function(a){var d,b,g,h,n,p,i,m,j;if(!(c(a.target).is("a,input,label,textarea")||1!=a.which)){l=!0;b=c(this);p=b.height();n=b.width();g=b.parentsUntil(".siteMap").filter("ul");h=g.eq(-1);h.css("position","relative");d=a.pageY;i=o(this,h.get(0));$clone=b.clone(!0).attr("target", -!0);for(a=g.length-1;a;a--)$clone=$clone.wrap("
      •  
         
        - + @@ -43,7 +44,7 @@ {@ $target_url = $original_site."?mid=download&package_srl=".$item->package_srl; } - + - + diff --git a/modules/communication/communication.admin.controller.php b/modules/communication/communication.admin.controller.php index c544a5e2b..177e1f741 100644 --- a/modules/communication/communication.admin.controller.php +++ b/modules/communication/communication.admin.controller.php @@ -19,12 +19,13 @@ **/ function procCommunicationAdminInsertConfig() { // get the default information - $args = Context::gets('skin','colorset','editor_skin','editor_colorset', 'mskin'); + $args = Context::gets('skin','colorset','editor_skin','editor_colorset', 'mskin', 'layout_srl', 'mlayout_srl'); if(!$args->skin) $args->skin = 'default'; if(!$args->colorset) $args->colorset = 'white'; if(!$args->editor_skin) $args->editor_skin = 'default'; if(!$args->mskin) $args->mskin = 'default'; + if(!$args->layout_srl) $args->layout_srl = null; // create the module module Controller object $oModuleController = &getController('module'); diff --git a/modules/communication/communication.admin.view.php b/modules/communication/communication.admin.view.php index 75720f418..3b3c26448 100644 --- a/modules/communication/communication.admin.view.php +++ b/modules/communication/communication.admin.view.php @@ -17,13 +17,17 @@ * configuration to manage messages and friends * @return void **/ - function dispCommunicationAdminConfig() { + function dispCommunicationAdminConfig() + { // Creating an object $oEditorModel = &getModel('editor'); $oModuleModel = &getModel('module'); + $oLayoutModel = &getModel('layout'); $oCommunicationModel = &getModel('communication'); // get the configurations of communication module Context::set('communication_config', $oCommunicationModel->getConfig() ); + // get a list of layout + Context::set('layout_list', $oLayoutModel->getLayoutList() ); // get a list of editor skins Context::set('editor_skin_list', $oEditorModel->getEditorSkinList() ); // get a list of communication skins @@ -31,8 +35,16 @@ // get a list of communication skins Context::set('communication_mobile_skin_list', $oModuleModel->getSkins($this->module_path, 'm.skins') ); + // Get a layout list + $layout_list = $oLayoutModel->getLayoutList(); + Context::set('layout_list', $layout_list); + + $mlayout_list = $oLayoutModel->getLayoutList(0, 'M'); + Context::set('mlayout_list', $mlayout_list); + $security = new Security(); $security->encodeHTML('communication_config..'); + $security->encodeHTML('layout_list..'); $security->encodeHTML('editor_skin_list..'); $security->encodeHTML('communication_skin_list..title'); $security->encodeHTML('communication_mobile_skin_list..title'); diff --git a/modules/communication/communication.controller.php b/modules/communication/communication.controller.php index d9352b386..7965872e1 100644 --- a/modules/communication/communication.controller.php +++ b/modules/communication/communication.controller.php @@ -195,12 +195,16 @@ $oCommunicationModel = &getModel('communication'); $message = $oCommunicationModel->getSelectedMessage($message_srl); if(!$message) return new Object(-1,'msg_invalid_request'); - // Check a message type if 'S' or 'R' - if($message->sender_srl == $member_srl && $message->message_type == 'S') { - if(!$message_srl) return new Object(-1, 'msg_invalid_request'); - } elseif($message->receiver_srl == $member_srl && $message->message_type == 'R') { - if(!$message_srl) return new Object(-1, 'msg_invalid_request'); - } + // Check the grant + switch($message->message_type) + { + case 'S': + if($message->sender_srl != $member_srl) return new Object(-1, 'msg_invalid_request'); + break; + case 'R': + if($message->receiver_srl != $member_srl) return new Object(-1, 'msg_invalid_request'); + break; + } // Delete $args->message_srl = $message_srl; $output = executeQuery('communication.deleteMessage', $args); @@ -290,15 +294,27 @@ * Move a group of the friend * @return void|Object (success : void, fail : Object) **/ - function procCommunicationMoveFriend() { + function procCommunicationMoveFriend() + { // Check login information - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + if(!Context::get('is_logged')) + { + return new Object(-1, 'msg_not_logged'); + } + $logged_info = Context::get('logged_info'); // Check variables - $friend_srl_list = trim(Context::get('friend_srl_list')); - if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); + $friend_srl_list = Context::get('friend_srl_list'); + if(!$friend_srl_list) + { + return new Object(-1, 'msg_cart_is_null'); + } + + if(!is_array($friend_srl_list)) + { + $friend_srl_list = explode('|@|', $friend_srl_list); + } - $friend_srl_list = explode('|@|', $friend_srl_list); if(!count($friend_srl_list)) return new Object(-1, 'msg_cart_is_null'); $friend_count = count($friend_srl_list); diff --git a/modules/communication/communication.mobile.php b/modules/communication/communication.mobile.php index eeb13ede6..fa96c1c1c 100644 --- a/modules/communication/communication.mobile.php +++ b/modules/communication/communication.mobile.php @@ -11,6 +11,14 @@ class communicationMobile extends communicationView { $tpl_path = sprintf('%sm.skins/%s', $this->module_path, $skin); $this->setTemplatePath($tpl_path); + + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->communication_config->mlayout_srl); + if($layout_info) + { + $this->module_info->mlayout_srl = $this->communication_config->mlayout_srl; + $this->setLayoutPath($layout_info->path); + } } function dispCommunicationMessages() diff --git a/modules/communication/communication.view.php b/modules/communication/communication.view.php index 5f309b442..d30d20214 100644 --- a/modules/communication/communication.view.php +++ b/modules/communication/communication.view.php @@ -26,6 +26,14 @@ $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); } $this->setTemplatePath($tpl_path); + + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->communication_config->layout_srl); + if($layout_info) + { + $this->module_info->layout_srl = $this->communication_config->layout_srl; + $this->setLayoutPath($layout_info->path); + } } /** @@ -54,6 +62,27 @@ if($message_srl) { $columnList = array('message_srl', 'sender_srl', 'receiver_srl', 'message_type', 'title', 'content', 'readed', 'regdate'); $message = $oCommunicationModel->getSelectedMessage($message_srl, $columnList); + switch($message->message_type) + { + case 'R': + if($message->receiver_srl != $logged_info->member_srl) + { + return $this->stop('msg_invalid_request'); + } + break; + case 'S': + if($message->sender_srl != $logged_info->member_srl) + { + return $this->stop('msg_invalid_request'); + } + break; + case 'T': + if($message->receiver_srl != $logged_info->member_srl && $message->sender_srl != $logged_info->member_srl) + { + return $this->stop('msg_invalid_request'); + } + break; + } if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl || $message->sender_srl == $logged_info->member_srl) ) { stripEmbedTagForAdmin($message->content, $message->sender_srl); Context::set('message', $message); @@ -81,6 +110,7 @@ * @return void|Object (void : success, Object : fail) **/ function dispCommunicationNewMessage() { + $this->setLayoutPath('./common/tpl/'); $this->setLayoutFile('popup_layout'); // Error appears if not logged-in if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); @@ -108,6 +138,7 @@ * @return void|Object (void : success, Object : fail) **/ function dispCommunicationSendMessage() { + $this->setLayoutPath('./common/tpl/'); $this->setLayoutFile("popup_layout"); $oCommunicationModel = &getModel('communication'); $oMemberModel = &getModel('member'); @@ -201,6 +232,7 @@ * @return void|Object (void : success, Object : fail) **/ function dispCommunicationAddFriend() { + $this->setLayoutPath('./common/tpl/'); $this->setLayoutFile("popup_layout"); // error appears if not logged-in if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); @@ -226,6 +258,7 @@ * @return void|Object (void : success, Object : fail) **/ function dispCommunicationAddFriendGroup() { + $this->setLayoutPath('./common/tpl/'); $this->setLayoutFile("popup_layout"); // error apprears if not logged-in if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); diff --git a/modules/communication/tpl/index.html b/modules/communication/tpl/index.html index d5a403f96..8eefbadb8 100644 --- a/modules/communication/tpl/index.html +++ b/modules/communication/tpl/index.html @@ -25,6 +25,15 @@ //]]> + + + + + + + +
        {$current_category} @@ -28,11 +28,12 @@ {$lang->order_download} | {$lang->order_popular} +
        {$lang->category}{$lang->thumbnail}{$lang->thumbnail} {$lang->name} {$lang->distribute_version} {$lang->current_version}
        {$item->category}

        {htmlspecialchars($item->title)}

        {cut_str(htmlspecialchars($item->package_description),200)}

        diff --git a/modules/comment/comment.admin.view.php b/modules/comment/comment.admin.view.php index 16c266f62..bbf7ce37d 100644 --- a/modules/comment/comment.admin.view.php +++ b/modules/comment/comment.admin.view.php @@ -44,7 +44,7 @@ // get a list by using comment->getCommentList. $oCommentModel = &getModel('comment'); $secretNameList = $oCommentModel->getSecretNameList(); - $columnList = array('comment_srl', 'document_srl', 'is_secret', 'status', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress'); + $columnList = array('comment_srl', 'document_srl', 'is_secret', 'status', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress', 'voted_count', 'blamed_count'); $output = $oCommentModel->getTotalCommentList($args, $columnList); $oCommentModel = &getModel("comment"); diff --git a/modules/comment/comment.class.php b/modules/comment/comment.class.php index 7ad0a0737..0734adda5 100644 --- a/modules/comment/comment.class.php +++ b/modules/comment/comment.class.php @@ -69,7 +69,10 @@ { return true; } - + + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'comment', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -128,6 +131,12 @@ array("status", "comment_srl", "module_srl", "document_srl"), true ); + + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'comment', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'comment', 'controller', 'triggerCopyModule', 'after'); + } return new Object(0, 'success_updated'); } diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index 8e07365ce..b74af126f 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -112,8 +112,13 @@ * @param int $module_srl * @return bool */ - function isModuleUsingPublishValidation($document_srl=null, $module_srl=null) + function isModuleUsingPublishValidation($module_srl=null) { + if(!$module_srl == null) + { + return false; + } + $oModuleModel = &getModel('module'); $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); $module_part_config = $oModuleModel->getModulePartConfig('comment',$module_info->module_srl); @@ -956,36 +961,51 @@ return new Object(); } - /** - * Get comment all list - * @return void - */ - function procCommentGetList() - { - if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); - $commentSrls = Context::get('comment_srls'); - if($commentSrls) $commentSrlList = explode(',', $commentSrls); + /** + * Get comment all list + * @return void + */ + function procCommentGetList() + { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + $commentSrls = Context::get('comment_srls'); + if($commentSrls) $commentSrlList = explode(',', $commentSrls); - if(count($commentSrlList) > 0) { - $oCommentModel = &getModel('comment'); - $commentList = $oCommentModel->getComments($commentSrlList); + if(count($commentSrlList) > 0) { + $oCommentModel = &getModel('comment'); + $commentList = $oCommentModel->getComments($commentSrlList); - if(is_array($commentList)) - { - foreach($commentList AS $key=>$value) + if(is_array($commentList)) { - $value->content = strip_tags($value->content); + foreach($commentList AS $key=>$value) + { + $value->content = strip_tags($value->content); + } + } + } + else + { + global $lang; + $commentList = array(); + $this->setMessage($lang->no_documents); + } + + $this->add('comment_list', $commentList); + } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $commentConfig = $oModuleModel->getModulePartConfig('comment', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('comment', $moduleSrl, $commentConfig); } } } - else - { - global $lang; - $commentList = array(); - $this->setMessage($lang->no_documents); - } - - $this->add('comment_list', $commentList); - } } ?> diff --git a/modules/comment/comment.item.php b/modules/comment/comment.item.php index d93dfcb25..87e570ac0 100644 --- a/modules/comment/comment.item.php +++ b/modules/comment/comment.item.php @@ -314,7 +314,7 @@ if(!$this->get('uploaded_count')) return; $oFileModel = &getModel('file'); - $file_list = $oFileModel->getFiles($this->comment_srl, $is_admin); + $file_list = $oFileModel->getFiles($this->comment_srl, array(), 'file_srl', true); return $file_list; } diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index c283ae265..ab6670080 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -280,27 +280,30 @@ if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); else $args->module_srl = $obj->module_srl; $args->list_count = $obj->list_count; - // cache controll + // cache controll $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ $object_key = 'object_newest_comment_list:'.$obj->module_srl; - $cache_key = $oCacheHandler->getGroupKey('newestCommentsList', $object_key); + $cache_key = $oCacheHandler->getGroupKey('newestCommentsList', $object_key); $output = $oCacheHandler->get($cache_key); } - if(!$output){ - + if(!$output) + { if(strpos($args->module_srl,",")===false) { - // check if module is using comment validation system - $oCommentController = &getController("comment"); - $is_using_validation = $oCommentController->isModuleUsingPublishValidation($obj->module_srl); - if($is_using_validation) + if($args->module_srl) { - $args->status = 1; + // check if module is using comment validation system + $oCommentController = &getController("comment"); + $is_using_validation = $oCommentController->isModuleUsingPublishValidation($obj->module_srl); + if($is_using_validation) + { + $args->status = 1; + } } } - $output = executeQuery('comment.getNewestCommentList', $args, $columnList); - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + $output = executeQuery('comment.getNewestCommentList', $args, $columnList); + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); } if(!$output->toBool()) return $output; diff --git a/modules/comment/queries/getNewestCommentList.xml b/modules/comment/queries/getNewestCommentList.xml index d477b2a40..c9829afc1 100644 --- a/modules/comment/queries/getNewestCommentList.xml +++ b/modules/comment/queries/getNewestCommentList.xml @@ -10,7 +10,6 @@ - diff --git a/modules/comment/queries/insertComment.xml b/modules/comment/queries/insertComment.xml index 5389c1939..d466a8f68 100644 --- a/modules/comment/queries/insertComment.xml +++ b/modules/comment/queries/insertComment.xml @@ -24,6 +24,6 @@ - + diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index a19c5c3d3..924479f14 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -75,7 +75,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
        {$comment}{$lang->no_text_comment} {$val->nick_name}0/0{number_format($val->get('voted_count'))}/{number_format($val->get('blamed_count'))} {(zdate($val->regdate,"Y-m-d\nH:i:s"))} {$val->ipaddress} {$secret_name_list['Y']}{$secret_name_list['N']}
        {$lang->layout} + +
        {$lang->skin} @@ -39,6 +48,15 @@ {$lang->colorset}
        {$lang->mobile_layout} + +
        {$lang->mobile_skin} diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 3d1ea54e4..d53bd1e19 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -267,7 +267,7 @@ } // Write a post - $output = $oDocumentController->insertDocument($obj, true); + $output = $oDocumentController->insertDocument($obj, true, true); if(!$output->toBool()) { $oDB->rollback(); return $output; @@ -361,6 +361,7 @@ } // Call a trigger (before) + $triggerObj->copied_srls = $copied_srls; $output = ModuleHandler::triggerCall('document.copyDocumentModule', 'after', $triggerObj); if(!$output->toBool()) { $oDB->rollback(); @@ -480,7 +481,7 @@ $type = Context::get('type'); $is_required = Context::get('is_required'); $default = Context::get('default'); - $desc = Context::get('desc'); + $desc = Context::get('desc') ? Context::get('desc') : ''; $search = Context::get('search'); $eid = Context::get('eid'); @@ -709,7 +710,7 @@ $oDB->begin(); //DB restore - $output = $oDocumentController->insertDocument($originObject, false, true); + $output = $oDocumentController->insertDocument($originObject, false, true, false); if(!$output->toBool()) return new Object(-1, $output->getMessage()); //FILE restore diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index 0022fb365..53eb92212 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -59,6 +59,9 @@ Context::set('status_name_list', $statusNameList); Context::set('page_navigation', $output->page_navigation); + $oSecurity = new Security(); + $oSecurity->encodeHTML('document_list..variables.'); + // set a search option used in the template $count_search_option = count($this->search_option); for($i=0;$i<$count_search_option;$i++) { diff --git a/modules/document/document.class.php b/modules/document/document.class.php index cfdfb0f5b..e0db23a1f 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -120,6 +120,9 @@ class document extends ModuleObject // 2012. 02. 27 Add a trigger to copy extra keys when the module is copied if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after')) return true; + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -296,6 +299,12 @@ class document extends ModuleObject $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after'); } + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModule', 'after'); + } + return new Object(0,'success_updated'); } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 4032f4a9c..dd3cc331e 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -174,7 +174,12 @@ class documentController extends document { * @param bool $isRestore * @return object */ - function insertDocument($obj, $manual_inserted = false, $isRestore = false) { + function insertDocument($obj, $manual_inserted = false, $isRestore = false, $isLatest = true) { + if(!checkCSRF()) + { + return new Object(-1, 'msg_invalid_request'); + } + // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); @@ -212,7 +217,7 @@ class documentController extends document { } // Set the read counts and update order. if(!$obj->readed_count) $obj->readed_count = 0; - if(!$isRestore) $obj->update_order = $obj->list_order = getNextSequence() * -1; + if($isLatest) $obj->update_order = $obj->list_order = getNextSequence() * -1; else $obj->update_order = $obj->list_order; // Check the status of password hash for manually inserting. Apply md5 hashing for otherwise. if($obj->password && !$obj->password_is_hashed) $obj->password = md5($obj->password); @@ -309,6 +314,11 @@ class documentController extends document { * @return object */ function updateDocument($source_obj, $obj) { + if(!checkCSRF()) + { + return new Object(-1, 'msg_invalid_request'); + } + if(!$source_obj->document_srl || !$obj->document_srl) return new Object(-1,'msg_invalied_request'); if(!$obj->status && $obj->is_secret == 'Y') $obj->status = 'SECRET'; if(!$obj->status) $obj->status = 'PUBLIC'; @@ -745,6 +755,8 @@ class documentController extends document { $cache_key = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key); } + + return TRUE; } /** @@ -1616,6 +1628,7 @@ class documentController extends document { $xml_buff = sprintf( 'init(); '. @@ -1862,6 +1875,11 @@ class documentController extends document { set_time_limit(0); if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + if(!checkCSRF()) + { + return new Object(-1, 'msg_invalid_request'); + } + $type = Context::get('type'); $target_module = Context::get('target_module'); $module_srl = Context::get('module_srl'); @@ -1918,14 +1936,14 @@ class documentController extends document { $msg_code = 'success_moved'; } - elseif($type == 'copy') { + elseif($type == 'copy') + { if(!$module_srl) return new Object(-1, 'fail_to_move'); $output = $oDocumentAdminController->copyDocumentModule($document_srl_list, $module_srl, $category_srl); if(!$output->toBool()) return new Object(-1, 'fail_to_move'); - $msg_code = 'success_copy'; - + $msg_code = 'success_copied'; } elseif($type =='delete') { $oDB = &DB::getInstance(); @@ -2130,5 +2148,20 @@ class documentController extends document { } } } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $documentConfig = $oModuleModel->getModulePartConfig('document', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('document', $moduleSrl, $documentConfig); + } + } + } } ?> diff --git a/modules/document/document.item.php b/modules/document/document.item.php index 6ac06ead8..e72deeb2a 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -454,42 +454,52 @@ return $content; } - function getRegdate($format = 'Y.m.d H:i:s') { - return zdate($this->get('regdate'), $format); - } + function getRegdate($format = 'Y.m.d H:i:s') { + return zdate($this->get('regdate'), $format); + } - function getRegdateTime() { - $regdate = $this->get('regdate'); - $year = substr($regdate,0,4); - $month = substr($regdate,4,2); - $day = substr($regdate,6,2); - $hour = substr($regdate,8,2); - $min = substr($regdate,10,2); - $sec = substr($regdate,12,2); - return mktime($hour,$min,$sec,$month,$day,$year); - } + function getRegdateTime() { + $regdate = $this->get('regdate'); + $year = substr($regdate,0,4); + $month = substr($regdate,4,2); + $day = substr($regdate,6,2); + $hour = substr($regdate,8,2); + $min = substr($regdate,10,2); + $sec = substr($regdate,12,2); + return mktime($hour,$min,$sec,$month,$day,$year); + } - function getRegdateGM() { - return $this->getRegdate('D, d M Y H:i:s').' '.$GLOBALS['_time_zone']; - } + function getRegdateGM() { + return $this->getRegdate('D, d M Y H:i:s').' '.$GLOBALS['_time_zone']; + } - function getUpdate($format = 'Y.m.d H:i:s') { - return zdate($this->get('last_update'), $format); - } + function getRegdateDT() + { + return $this->getRegdate('Y-m-d').'T'.$this->getRegdate('H:i:s').substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2); + } - function getUpdateTime() { - $year = substr($this->get('last_update'),0,4); - $month = substr($this->get('last_update'),4,2); - $day = substr($this->get('last_update'),6,2); - $hour = substr($this->get('last_update'),8,2); - $min = substr($this->get('last_update'),10,2); - $sec = substr($this->get('last_update'),12,2); - return mktime($hour,$min,$sec,$month,$day,$year); - } + function getUpdate($format = 'Y.m.d H:i:s') { + return zdate($this->get('last_update'), $format); + } - function getUpdateGM() { - return gmdate("D, d M Y H:i:s", $this->getUpdateTime()); - } + function getUpdateTime() { + $year = substr($this->get('last_update'),0,4); + $month = substr($this->get('last_update'),4,2); + $day = substr($this->get('last_update'),6,2); + $hour = substr($this->get('last_update'),8,2); + $min = substr($this->get('last_update'),10,2); + $sec = substr($this->get('last_update'),12,2); + return mktime($hour,$min,$sec,$month,$day,$year); + } + + function getUpdateGM() { + return gmdate("D, d M Y H:i:s", $this->getUpdateTime()); + } + + function getUpdateDT() + { + return $this->getUpdate('Y-m-d').'T'.$this->getUpdate('H:i:s').substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3,2); + } function getPermanentUrl() { return getFullUrl('','document_srl',$this->get('document_srl')); @@ -499,7 +509,7 @@ if(!$this->document_srl) return; // Generate a key to prevent spams $oTrackbackModel = &getModel('trackback'); - return $oTrackbackModel->getTrackbackUrl($this->document_srl); + return $oTrackbackModel->getTrackbackUrl($this->document_srl, $this->getDocumentMid()); } /** @@ -665,7 +675,7 @@ // Find an iamge file among attached files if exists if($this->get('uploaded_count')) { $oFileModel = &getModel('file'); - $file_list = $oFileModel->getFiles($this->document_srl); + $file_list = $oFileModel->getFiles($this->document_srl, array(), 'file_srl', true); if(count($file_list)) { foreach($file_list as $file) { if($file->direct_download!='Y') continue; @@ -809,7 +819,7 @@ if(!$this->uploadedFiles[$sortIndex]) { $oFileModel = &getModel('file'); - $this->uploadedFiles[$sortIndex] = $oFileModel->getFiles($this->document_srl, array(), $sortIndex); + $this->uploadedFiles[$sortIndex] = $oFileModel->getFiles($this->document_srl, array(), $sortIndex, true); } return $this->uploadedFiles[$sortIndex]; diff --git a/modules/editor/components/image_gallery/tpl/slide_gallery.js b/modules/editor/components/image_gallery/tpl/slide_gallery.js index 08efeafc6..b2aa90358 100644 --- a/modules/editor/components/image_gallery/tpl/slide_gallery.js +++ b/modules/editor/components/image_gallery/tpl/slide_gallery.js @@ -19,10 +19,19 @@ var slideShow = xe.createPlugin('slideShow', { API_SHOW_SLIDE : function(sender, params) { var self=this, srl = params[0], key = '@'+srl, imgs, $zone, $thumb, $holder, i, c; - + var p = params; imgs = this.cast('GET_IMAGES', [srl]); if(!imgs.length) return; + for(var i=0, nLen=imgs.length; ia?a=b.length-1:a>=b.length&&(a=0),this.cast("SET_SLIDE",[g,a]))},API_NEXT_SLIDE:function(g,f){this._showSideSlide(f[0],1)},API_PREV_SLIDE:function(g,f){this._showSideSlide(f[0],-1)},API_SET_SLIDE:function(g,f){var b=f[0],a=f[1],c,d,e;c=this.cast("GET_IMAGES",[b]);if(c.length&&is_def(d=c[a]))this._current["@"+b]=a,k("#zone_gallery_navigator_status_"+b).text(a+1+"/"+c.length),this._thumbs["@"+b].find("img").eq(a).animate({opacity:1}).end().not(":eq("+a+")").animate({opacity:0.5}), -b=this._holders["@"+b],c=b.parent().innerWidth(),a=d.$obj.prop("width"),e=d.$obj.prop("height"),0==a&&(a=d.$obj.attr("width")),0==e&&(e=d.$obj.attr("height")),a>c-20&&(c-=20,e=Math.floor(e*(c/a)),a=c,d.$obj.css("cursor","pointer"),d.$obj.attr("rel","xe_gallery")),d.$obj.css({width:a,height:e,margin:"0 10px"}),b.empty().append(d.$obj)}}),i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new m)})(jQuery); +(function(k){var m=xe.createPlugin("slideShow",{_holders:{},_thumbs:{},_current:{},init:function(){this._holders={};this._thumbs={};this._current={}},API_SHOW_SLIDE:function(h,f){var b=this,a=f[0],d="@"+a,c,e,j,i,g,l;c=this.cast("GET_IMAGES",[a]);if(c.length){g=0;for(e=c.length;ga?a=b.length-1:a>=b.length&&(a=0),this.cast("SET_SLIDE",[h,a]))},API_NEXT_SLIDE:function(h,f){this._showSideSlide(f[0],1)},API_PREV_SLIDE:function(h,f){this._showSideSlide(f[0],-1)},API_SET_SLIDE:function(h,f){var b=f[0],a=f[1],d,c,e;d=this.cast("GET_IMAGES",[b]);if(d.length&&is_def(c=d[a]))this._current["@"+b]=a,k("#zone_gallery_navigator_status_"+ +b).text(a+1+"/"+d.length),this._thumbs["@"+b].find("img").eq(a).animate({opacity:1}).end().not(":eq("+a+")").animate({opacity:0.5}),b=this._holders["@"+b],d=b.parent().innerWidth(),a=c.$obj.prop("width"),e=c.$obj.prop("height"),0==a&&(a=c.$obj.attr("width")),0==e&&(e=c.$obj.attr("height")),a>d-20&&(d-=20,e=Math.floor(e*(d/a)),a=d,c.$obj.css("cursor","pointer"),c.$obj.attr("rel","xe_gallery")),c.$obj.css({width:a,height:e,margin:"0 10px"}),b.empty().append(c.$obj)}}),i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new m)})(jQuery); diff --git a/modules/editor/editor.class.php b/modules/editor/editor.class.php index fd063125a..42953c8f2 100644 --- a/modules/editor/editor.class.php +++ b/modules/editor/editor.class.php @@ -60,6 +60,9 @@ // 2009. 06. 19 Remove unused trigger if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) return true; + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'editor', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -93,6 +96,12 @@ if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) $oModuleController->deleteTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before'); + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'editor', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'editor', 'controller', 'triggerCopyModule', 'after'); + } + return new Object(0, 'success_updated'); } diff --git a/modules/editor/editor.controller.php b/modules/editor/editor.controller.php index c16312512..dcc2fdfac 100644 --- a/modules/editor/editor.controller.php +++ b/modules/editor/editor.controller.php @@ -426,5 +426,20 @@ FileHandler::removeFile($oEditorModel->getCacheFile(true, $site_srl)); FileHandler::removeFile($oEditorModel->getCacheFile(false, $site_srl)); } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $editorConfig = $oModuleModel->getModulePartConfig('editor', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('editor', $moduleSrl, $editorConfig); + } + } + } } ?> diff --git a/modules/editor/skins/xpresseditor/css/default.css b/modules/editor/skins/xpresseditor/css/default.css index 5106786b4..dec78a7a3 100644 --- a/modules/editor/skins/xpresseditor/css/default.css +++ b/modules/editor/skins/xpresseditor/css/default.css @@ -51,7 +51,7 @@ .xpress-editor .tool:after{content:"";display:block;clear:both} .xpress-editor .tool ul{position:relative;overflow:visible;float:left;margin:0 5px 2px 0 !important;z-index:2;border:0 !important} .xpress-editor .tool ul.action{width:43px} -.xpress-editor .tool ul.type{width:auto;white-space:nowrap} +.xpress-editor .tool ul.type{width:auto;white-space:nowrap;height:21px} .xpress-editor .tool ul.style{width:169px;z-index:6} .xpress-editor .tool ul.paragraph{width:169px;z-index:5} .xpress-editor .tool ul.extra1{width:69px;z-index:4} diff --git a/modules/editor/skins/xpresseditor/css/default.min.css b/modules/editor/skins/xpresseditor/css/default.min.css index f967cfe4a..861fbbe0c 100644 --- a/modules/editor/skins/xpresseditor/css/default.min.css +++ b/modules/editor/skins/xpresseditor/css/default.min.css @@ -1 +1 @@ -@charset "utf-8";.xeTextEditor{margin:0 12px 0 0}.xeTextEditor textarea{display:block;margin:0;padding:5px}.xeTextEditor.black textarea{color:#fff;background-color:#000}.xpress-editor *{margin:0;padding:0;font-style:normal;font-size:12px}.xpress-editor img,.xpress-editor fieldset,.xpress-editor button{border:0}.xpress-editor button{background:0;background-repeat:no-repeat;cursor:pointer}.xpress-editor button *{visibility:hidden}.xpress-editor legend{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden}.xpress-editor label{cursor:pointer}.xpress-editor hr{display:none}.xpress-editor li{list-style:none}.xpress-editor{position:relative;background:transparent}.xpress-editor #smart_content{position:relative;clear:both;margin:0 0 10px 0;border:1px solid #c2c2c2;*zoom:1;z-index:1;background:#fff}.xpress-editor.black #smart_content{background:transparent}.xpress-editor #smart_footer{position:relative;text-align:center;padding:10px 0}.xpress-editor #smart_footer *{vertical-align:top}.xpress-editor #smart_footer button{position:relative;width:67px;height:25px;margin:0 5px 0 0}.xpress-editor #smart_footer button.save_temp{background:url(../img/btn_save_temp.gif) no-repeat}.xpress-editor #smart_footer button.preview{background:url(../img/btn_preview.gif) no-repeat}.xpress-editor #smart_footer input{margin:0}.xpress-editor #smart_footer input.reset{width:67px;height:25px;border:0;background:url(../img/btn_cancel.gif) no-repeat;cursor:pointer;margin-left:5px}.xpress-editor a.skip{position:absolute;display:block;top:0;right:0;width:1px;height:1px;overflow:hidden;clear:both;zoom:1}.xpress-editor a.skip:hover,.xpress-editor a.skip:active,.xpress-editor a.skip:focus{position:relative;display:block;padding:5px;right:0;z-index:60;width:auto;height:auto;text-align:right;white-space:nowrap;color:#000;text-decoration:none;letter-spacing:-1px;_zoom:1}.xpress-editor .input_area{position:relative;margin:10px 10px 20px 10px;z-index:30;*zoom:1;height:400px;overflow:hidden}.xpress-editor .input_area iframe,.xpress-editor .input_area textarea{display:block;width:100%!important;position:relative;height:100%;border:0!important;padding:0!important;overflow:auto}.xpress-editor .input_area textarea{*margin:0 -10px;_margin-bottom:-2px}.xpress-editor .input_area textarea.blind{display:none}.xpress-editor .input_control{position:relative;display:block;width:100%;clear:both;text-align:center;border-top:1px solid #ccc;background:#f8f8f8 url(../img/btn_expand.gif) no-repeat center center;cursor:n-resize}.xpress-editor .input_control span{display:block;height:21px;visibility:hidden;overflow:visible;font-size:0;line-height:0;white-space:nowrap;color:#fff}.xpress-editor .input_auto{position:absolute;z-index:2;left:5px;bottom:4px;zoom:1}.xpress-editor .input_auto.line{height:17px;margin:0;display:block;border-top:1px solid #ccc;padding:4px 0 0 8px;background:#f8f8f8}.xpress-editor .input_auto input{margin:0;padding:0;width:13px;height:13px;vertical-align:middle;margin:0 4px 0 0}.xpress-editor .input_auto label{font-size:11px;vertical-align:middle;line-height:13px;color:#666}.xpress-editor.black .input_control{background:#111 url(../img/btn_expand.black.gif) no-repeat center center}.xpress-editor.black .input_control span{border-top:1px solid #333;color:#000}.xpress-editor .tool{position:relative;overflow:visible;padding:5px 10px 6px 10px;*padding:5px 10px 8px 10px;z-index:40;clear:both;background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom;border:0;*zoom:1}.xpress-editor .tool.disable{display:none}.xpress-editor.black .tool{background:#111 url(../img/bg_tool.black.gif) repeat-x left bottom}.xpress-editor .tool:after{content:"";display:block;clear:both}.xpress-editor .tool ul{position:relative;overflow:visible;float:left;margin:0 5px 2px 0!important;z-index:2;border:0!important}.xpress-editor .tool ul.action{width:43px}.xpress-editor .tool ul.type{width:auto;white-space:nowrap}.xpress-editor .tool ul.style{width:169px;z-index:6}.xpress-editor .tool ul.paragraph{width:169px;z-index:5}.xpress-editor .tool ul.extra1{width:69px;z-index:4}.xpress-editor .tool ul.table{width:85px;z-index:3}.xpress-editor .tool ul.extra2{width:auto;z-index:2}.xpress-editor .tool ul.extra3{float:left;width:auto;z-index:1;margin-right:1px}.xpress-editor .tool ul.extra3 li{margin-right:4px}.xpress-editor .tool li{position:relative;float:left;margin:0!important;padding:0!important;border:0!important}.xpress-editor .tool li button{width:21px;height:21px;background:url(../img/btn_set.gif) no-repeat 0 0;vertical-align:top;float:left}.xpress-editor.black .tool li button{width:21px;height:21px;background:url(../img/btn_set.black.gif) no-repeat 0 0;vertical-align:top}.xpress-editor .tool li button span{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.extensions span.exButton,.xpress-editor .tool li.extensions span.exButton button{float:left;position:relative;display:inline-block;width:auto;background:url(../img/btn_set_blank.gif) no-repeat left top}.xpress-editor .tool li.extensions span.exButton button{left:2px;height:21px;background-position:right top;padding:0 4px;font:11px/21px Tahoma,Sans-serif;text-align:left;*overflow:visible;*line-height:20px}.xpress-editor.black .tool li.extensions span.exButton,.xpress-editor.black .tool li.extensions span.exButton button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)}.xpress-editor .tool li.html span,.xpress-editor .tool li.html span button,.xpress-editor .tool li.preview span,.xpress-editor .tool li.preview span button{float:left;position:relative;display:inline-block;width:auto;height:auto;visibility:visible;background:url(../img/btn_set_blank.gif) no-repeat 0 0;white-space:nowrap}.xpress-editor.black .tool li.html span,.xpress-editor.black .tool li.html span button,.xpress-editor.black .tool li.preview span,.xpress-editor.black .tool li.preview span button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)}.xpress-editor .tool li.html span,.xpress-editor .tool li.preview span{margin-right:2px;background-position:left top}.xpress-editor .tool li.html span button,.xpress-editor .tool li.preview span button{left:2px;height:21px;background-position:right top;font:11px/21px Tahoma,Sans-serif;padding:0 4px;*overflow:visible;*line-height:20px}.xpress-editor .tool ul.type li{float:none;display:inline;*top:1px}.xpress-editor .tool ul.type li select{height:21px;width:64px;white-space:nowrap}.xpress-editor .tool ul.type li option{white-space:nowrap}.xpress-editor.black .tool ul.type li select{color:#fff;background-color:#000}.xpress-editor .tool li.undo button{width:22px;background-position:0 0}.xpress-editor .tool li.redo button{background-position:-22px 0}.xpress-editor .tool li.bold button{width:22px;background-position:-43px 0}.xpress-editor .tool li.underline button{background-position:-65px 0}.xpress-editor .tool li.italic button{background-position:-86px 0}.xpress-editor .tool li.del button{background-position:-107px 0}.xpress-editor .tool li.fcolor button{background-position:-128px 0}.xpress-editor .tool li.bcolor button{background-position:-149px 0}.xpress-editor .tool li.sup button{background-position:-170px 0}.xpress-editor .tool li.sub button{background-position:-191px 0}.xpress-editor .tool li.left button{width:22px;background-position:-212px 0}.xpress-editor .tool li.center button{background-position:-234px 0}.xpress-editor .tool li.right button{background-position:-255px 0}.xpress-editor .tool li.justify button{background-position:-276px 0}.xpress-editor .tool li.ol button{background-position:-297px 0}.xpress-editor .tool li.ul button{background-position:-318px 0}.xpress-editor .tool li.outdent button{background-position:-339px 0}.xpress-editor .tool li.indent button{background-position:-360px 0}.xpress-editor .tool li.blockquote button{width:22px;background-position:-381px 0}.xpress-editor .tool li.url button{width:26px;background-position:-403px 0}.xpress-editor .tool li.character button{background-position:-429px 0}.xpress-editor .tool li.table button{width:22px;background-position:-450px 0}.xpress-editor .tool li.merge button{background-position:-472px 0}.xpress-editor .tool li.splitCol button{background-position:-493px 0}.xpress-editor .tool li.splitRow button{background-position:-514px 0}.xpress-editor .tool li.extensions span{background-position:0 0}.xpress-editor .tool li.extensions span button{background-position:right 0}.xpress-editor .tool li.html span{background-position:0 0}.xpress-editor .tool li.html span button{background-position:right 0}.xpress-editor .tool li.preview span{background-position:0 0}.xpress-editor .tool li.preview span button{background-position:right 0}.xpress-editor .tool li.undo button.hover{width:22px;background-position:0 -21px}.xpress-editor .tool li.redo button.hover{background-position:-22px -21px}.xpress-editor .tool li.bold button.hover{width:22px;background-position:-43px -21px}.xpress-editor .tool li.underline button.hover{background-position:-65px -21px}.xpress-editor .tool li.italic button.hover{background-position:-86px -21px}.xpress-editor .tool li.del button.hover{background-position:-107px -21px}.xpress-editor .tool li.fcolor button.hover{background-position:-128px -21px}.xpress-editor .tool li.bcolor button.hover{background-position:-149px -21px}.xpress-editor .tool li.sup button.hover{background-position:-170px -21px}.xpress-editor .tool li.sub button.hover{background-position:-191px -21px}.xpress-editor .tool li.left button.hover{width:22px;background-position:-212px -21px}.xpress-editor .tool li.center button.hover{background-position:-234px -21px}.xpress-editor .tool li.right button.hover{background-position:-255px -21px}.xpress-editor .tool li.justify button.hover{background-position:-276px -21px}.xpress-editor .tool li.ol button.hover{background-position:-297px -21px}.xpress-editor .tool li.ul button.hover{background-position:-318px -21px}.xpress-editor .tool li.outdent button.hover{background-position:-339px -21px}.xpress-editor .tool li.indent button.hover{background-position:-360px -21px}.xpress-editor .tool li.blockquote button.hover{width:22px;background-position:-381px -21px}.xpress-editor .tool li.url button.hover{width:26px;background-position:-403px -21px}.xpress-editor .tool li.character button.hover{background-position:-429px -21px}.xpress-editor .tool li.table button.hover{width:22px;background-position:-450px -21px}.xpress-editor .tool li.merge button.hover{background-position:-472px -21px}.xpress-editor .tool li.splitCol button.hover{background-position:-493px -21px}.xpress-editor .tool li.splitRow button.hover{background-position:-514px -21px}.xpress-editor .tool li.extensions span.hover{background-position:0 -21px}.xpress-editor .tool li.extensions span.hover button{background-position:right -21px}.xpress-editor .tool li.html span.hover{background-position:0 -21px}.xpress-editor .tool li.html span.hover button{background-position:right -21px}.xpress-editor .tool li.preview span.hover{background-position:0 -21px}.xpress-editor .tool li.preview span.hover button{background-position:right -21px}.xpress-editor .tool li.undo button.active{width:22px;background-position:0 -42px}.xpress-editor .tool li.redo button.active{background-position:-22px -42px}.xpress-editor .tool li.bold button.active{width:22px;background-position:-43px -42px}.xpress-editor .tool li.underline button.active{background-position:-65px -42px}.xpress-editor .tool li.italic button.active{background-position:-86px -42px}.xpress-editor .tool li.del button.active{background-position:-107px -42px}.xpress-editor .tool li.fcolor button.active{background-position:-128px -42px}.xpress-editor .tool li.bcolor button.active{background-position:-149px -42px}.xpress-editor .tool li.sup button.active{background-position:-170px -42px}.xpress-editor .tool li.sub button.active{background-position:-191px -42px}.xpress-editor .tool li.left button.active{width:22px;background-position:-212px -42px}.xpress-editor .tool li.center button.active{background-position:-234px -42px}.xpress-editor .tool li.right button.active{background-position:-255px -42px}.xpress-editor .tool li.justify button.active{background-position:-276px -42px}.xpress-editor .tool li.ol button.active{background-position:-297px -42px}.xpress-editor .tool li.ul button.active{background-position:-318px -42px}.xpress-editor .tool li.outdent button.active{background-position:-339px -42px}.xpress-editor .tool li.indent button.active{background-position:-360px -42px}.xpress-editor .tool li.blockquote button.active{width:22px;background-position:-381px -42px}.xpress-editor .tool li.url button.active{width:26px;background-position:-403px -42px}.xpress-editor .tool li.character button.active{background-position:-429px -42px}.xpress-editor .tool li.table button.active{width:22px;background-position:-450px -42px}.xpress-editor .tool li.merge button.active{background-position:-472px -42px}.xpress-editor .tool li.splitCol button.active{background-position:-493px -42px}.xpress-editor .tool li.splitRow button.active{background-position:-514px -42px}.xpress-editor .tool li.extensions span.active{background-position:0 -42px}.xpress-editor .tool li.extensions span.active button{background-position:right -42px}.xpress-editor .tool li.html span.active{background-position:0 -42px}.xpress-editor .tool li.html span.active button{background-position:right -42px}.xpress-editor .tool li.preview span.active{background-position:0 -42px}.xpress-editor .tool li.preview span.active button{background-position:right -42px}.xpress-editor .tool.off li.undo button,.xpress-editor .tool li.undo button.off{width:22px;background-position:0 -63px}.xpress-editor .tool.off li.redo button,.xpress-editor .tool li.redo button.off{background-position:-22px -63px}.xpress-editor .tool.off li.bold button{width:22px;background-position:-43px -63px}.xpress-editor .tool.off li.underline button{background-position:-65px -63px}.xpress-editor .tool.off li.italic button{background-position:-86px -63px}.xpress-editor .tool.off li.del button{background-position:-107px -63px}.xpress-editor .tool.off li.fcolor button{background-position:-128px -63px}.xpress-editor .tool.off li.bcolor button{background-position:-149px -63px}.xpress-editor .tool.off li.sup button{background-position:-170px -63px}.xpress-editor .tool.off li.sub button{background-position:-191px -63px}.xpress-editor .tool.off li.left button{width:22px;background-position:-212px -63px}.xpress-editor .tool.off li.center button{background-position:-234px -63px}.xpress-editor .tool.off li.right button{background-position:-255px -63px}.xpress-editor .tool.off li.justify button{background-position:-276px -63px}.xpress-editor .tool.off li.ol button{background-position:-297px -63px}.xpress-editor .tool.off li.ul button{background-position:-318px -63px}.xpress-editor .tool.off li.outdent button{background-position:-339px -63px}.xpress-editor .tool.off li.indent button{background-position:-360px -63px}.xpress-editor .tool.off li.blockquote button{width:22px;background-position:-381px -63px}.xpress-editor .tool.off li.url button{width:26px;background-position:-403px -63px}.xpress-editor .tool.off li.character button{background-position:-429px -63px}.xpress-editor .tool.off li.table button{width:22px;background-position:-450px -63px}.xpress-editor .tool.off li.merge button,.xpress-editor .tool li.merge button.off{background-position:-472px -63px}.xpress-editor .tool.off li.splitCol button,.xpress-editor .tool li.splitCol button.off{background-position:-493px -63px}.xpress-editor .tool.off li.splitRow button,.xpress-editor .tool li.splitRow button.off{background-position:-514px -63px}.xpress-editor .tool.off li.extensions span{background-position:0 -63px}.xpress-editor .tool.off li.extensions span button{background-position:right -63px;color:#bcbcbc}.xpress-editor .tool.off li button{cursor:default}.xpress-editor .tool.off ul.extra3 li button{cursor:pointer}.xpress-editor .tool .layer{display:none;position:absolute;left:0;top:20px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}.xpress-editor .tool .layer li{float:none;left:0}.xpress-editor .tool .layer button,.xpress-editor.black .tool .layer button{margin:0!important;width:auto;height:auto;background:0;float:none}.xpress-editor .tool .layer button span{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool .btn_area{position:relative;clear:both;text-align:center!important;padding:7px 0 12px 0;width:100%;white-space:nowrap;*zoom:1}.xpress-editor .tool .btn_area *{vertical-align:top}.xpress-editor .tool button.close{position:absolute;top:4px;right:3px;width:21px;height:20px;background:url(../img/btn_layer_close.gif) no-repeat center center!important}.xpress-editor .tool button.close span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool .layer .btn_area button{*margin:0 2px!important}.xpress-editor .tool .layer .btn_area button.confirm{width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat}.xpress-editor .tool .layer .btn_area button.cancel{width:38px;height:21px;background:url(../img/btn_layer_cancel.gif) no-repeat}.xpress-editor .tool li.fcolor .layer{width:218px!important;height:auto!important;background-image:none!important;overflow:hidden}.xpress-editor .tool .layer .palette{width:210px;position:relative;left:7px;padding:8px 0 7px 0;margin:0}.xpress-editor .tool .layer .palette li{float:left;margin:0 1px 1px 0!important;font-size:0;line-height:0}.xpress-editor .tool .layer .palette button{position:relative;overflow:hidden;width:11px!important;height:11px!important}.xpress-editor .tool li.bcolor .layer{width:218px;overflow:hidden}.xpress-editor .tool .layer .background{width:210px;position:relative;left:7px;margin:0 0 -2px 0;padding:8px 0 0 0;*padding-bottom:8px;_padding-bottom:4px}.xpress-editor .tool .layer .background li{float:left;margin:0 5px 2px 0!important}.xpress-editor .tool .layer .background button{position:relative;overflow:hidden;width:65px;height:19px;text-align:left;padding:4px}.xpress-editor .tool .layer .background button span{position:relative;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto}.xpress-editor .tool li.style .layer{padding:4px 2px;_overflow:hidden;filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2)}.xpress-editor .tool li.style .layer li{position:relative;background:#fbfbfb}.xpress-editor .tool li.style .layer li button{display:block;width:134px;position:relative}.xpress-editor .tool li.style .layer li button span{display:block;width:130px;text-align:left;letter-spacing:normal}.xpress-editor .tool li.style .layer li.h3 button span{padding:3px 0 1px 4px;height:15px;font-size:16px;font-weight:bold}.xpress-editor .tool li.style .layer li.h4 button span{padding:3px 0 2px 4px;height:13px;font-size:14px;font-weight:bold}.xpress-editor .tool li.style .layer li.h5 button span{padding:3px 0 1px 4px;height:11px;font-size:12px;font-weight:bold}.xpress-editor .tool li.style .layer li.h6 button span{padding:3px 0 1px 4px;height:11px;font-size:12px}.xpress-editor .tool li.style .layer li.p button span{padding:3px 0 1px 4px;height:11px;font-size:12px;color:#5d5d5d}.xpress-editor .tool li.style .layer li button.hover{background:#c1f471;*height:1%}.xpress-editor .tool li.blockquote .layer{padding:6px 0 6px 7px;left:0;width:294px}.xpress-editor .tool li.blockquote .layer ul{*zoom:1;margin:0}.xpress-editor .tool li.blockquote .layer ul:after{content:"";display:block;clear:both}.xpress-editor .tool li.blockquote .layer li{position:relative;float:left;overflow:hidden;width:32px;height:34px;margin:0 2px 0 0!important;border:1px solid #cdcecc!important;background-image:url(../img/btn_qmark.gif);background-repeat:no-repeat}.xpress-editor .tool li.blockquote .layer li.q1{background-position:0 0}.xpress-editor .tool li.blockquote .layer li.q2{background-position:-32px 0}.xpress-editor .tool li.blockquote .layer li.q3{background-position:-64px 0}.xpress-editor .tool li.blockquote .layer li.q4{background-position:-96px 0}.xpress-editor .tool li.blockquote .layer li.q5{background-position:-128px 0}.xpress-editor .tool li.blockquote .layer li.q6{background-position:-160px 0}.xpress-editor .tool li.blockquote .layer li.q7{background-position:-192px 0}.xpress-editor .tool li.blockquote .layer li.q8{background-position:-224px 0}.xpress-editor .tool li.blockquote .layer li button{width:32px;height:34px}.xpress-editor .tool li.url .layer{width:231px;height:125px;background-image:url(../img/bx_url.gif);background-repeat:no-repeat;background-position:10px 14px}.xpress-editor .tool li.url .layer fieldset{position:absolute;width:212px;left:10px;top:14px}.xpress-editor .tool li.url .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:0;margin:0;padding:0;font-weight:normal}.xpress-editor .tool li.url .layer fieldset input.link{position:absolute;left:12px;top:19px;width:179px;padding:2px 0 1px 6px;*margin:-1px 0;font-size:11px;height:13px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.url .layer fieldset p{position:absolute;left:12px;top:44px}.xpress-editor .tool li.url .layer fieldset p input{width:13px;height:13px;vertical-align:middle;margin-right:3px}.xpress-editor .tool li.url .layer .btn_area{position:absolute;bottom:12px;padding:0}.xpress-editor .tool li.table .layer{width:242px;height:239px;background-image:url(../img/bx_table.gif);background-repeat:no-repeat;background-position:10px 14px}.xpress-editor .tool li.table .layer fieldset{position:absolute;width:222px;left:10px}.xpress-editor .tool li.table .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:0;margin:0;padding:0;font-weight:normal}.xpress-editor .tool li.table .layer fieldset dl{position:absolute;left:10px}.xpress-editor .tool li.table .layer fieldset dt{float:left;padding:3px 0 0 0;height:20px;white-space:nowrap;letter-spacing:-1px}.xpress-editor .tool li.table .layer fieldset dd{float:right;position:relative}.xpress-editor .tool li.table .layer fieldset dd button.add,.xpress-editor .tool li.table .layer fieldset dd button.del{position:absolute;left:27px;width:15px;height:8px;background:url(../img/btn_layer_cell_adjust.gif) no-repeat}.xpress-editor .tool li.table .layer fieldset dd button.add{top:1px}.xpress-editor .tool li.table .layer fieldset dd button.del{top:9px;background-position:0 -8px}.xpress-editor .tool li.table .layer fieldset dd .preview_palette{display:block;float:left;margin:0 3px 0 0;padding:2px;position:relative;border:1px solid #c8c9c6;width:14px;height:14px;overflow:hidden}.xpress-editor .tool li.table .layer fieldset dd .preview_palette button{width:14px;height:14px;font-size:500px;line-height:0}.xpress-editor .tool li.table .layer fieldset dd .find_palette{width:33px;height:20px;background:url(../img/btn_search.gif) no-repeat}.xpress-editor .tool li.table .layer fieldset.num{top:14px}.xpress-editor .tool li.table .layer fieldset.num dl{top:18px;width:60px}.xpress-editor .tool li.table .layer fieldset.num dt{height:20px}.xpress-editor .tool li.table .layer fieldset.num dd{height:23px}.xpress-editor .tool li.table .layer fieldset.num dt label{font-size:11px;color:#333}.xpress-editor .tool li.table .layer fieldset.num dd input{padding:3px 0 0 6px;*margin:-1px 0;width:35px;height:13px;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.table .layer fieldset.color{top:96px}.xpress-editor .tool li.table .layer fieldset.color dl{top:18px;width:210px}.xpress-editor .tool li.table .layer fieldset.color dt{height:23px}.xpress-editor .tool li.table .layer fieldset.color dd{height:26px;width:146px}.xpress-editor .tool li.table .layer fieldset.color dt label{font-size:11px;color:#333}.xpress-editor .tool li.table .layer fieldset.color dd input{padding:3px 0 0 6px;*margin:-1px 0;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{width:35px;height:13px}.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_color,.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{width:70px;height:15px;*margin-right:3px}.xpress-editor .tool li.table .layer table{position:absolute;top:18px;left:75px;width:137px;height:40px;table-layout:fixed;border-collapse:separate;border:0}.xpress-editor .tool li.table .layer table *{font-size:0;line-height:0}.xpress-editor .tool li.table .layer table th,.xpress-editor .tool li.table .layer table td{text-align:center;padding:0;border:0}.xpress-editor .tool li.table .layer .btn_area{position:absolute;bottom:12px;padding:0;z-index:1}.xpress-editor .tool li.table .layer .palette{display:none;position:absolute;z-index:2;left:11px;width:204px;padding:8px 7px 7px 7px;_padding-right:6px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}.xpress-editor .tool li.table .layer.p1 .palette{display:block;top:163px}.xpress-editor .tool li.table .layer.p2 .palette{display:block;top:189px}.xpress-editor .tool li.character .layer{width:433px;height:242px;overflow:hidden}.xpress-editor .tool li.character .layer ul{margin:0}.xpress-editor .tool li.character .layer h3{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.character .layer .nav{position:absolute;top:11px;left:-1px;overflow:hidden;white-space:nowrap}.xpress-editor .tool li.character .layer .nav li{display:inline;margin:0 -4px 0 0;padding:0 8px!important;background:url(../img/vr_layer_character.gif) no-repeat 0 0}.xpress-editor .tool li.character .layer .nav li a{color:#444;text-decoration:none;letter-spacing:-1px}.xpress-editor .tool li.character .layer .nav li a:hover,.xpress-editor .tool li.character .layer .nav li a:active,.xpress-editor .tool li.character .layer .nav li a:focus{text-decoration:underline}.xpress-editor .tool li.character .layer .nav li a.on{font-weight:bold;color:#004790;display:inline}.xpress-editor .tool li.character .layer .list{position:absolute;left:7px;top:30px;width:421px;height:172px;background:url(../img/bx_character.gif) no-repeat}.xpress-editor .tool li.character .layer .list li{position:relative;top:1px;left:1px;float:left;width:20px;height:18px;margin:0 1px 1px 0!important}.xpress-editor .tool li.character .layer .list li button{width:20px;height:18px}.xpress-editor .tool li.character .layer .list li button.hover{border:2px solid #27c11a}.xpress-editor .tool li.character .layer .list li button span{overflow:visible;font-size:12px;width:auto;height:auto;position:relative;visibility:visible;line-height:normal}.xpress-editor .tool li.character .layer p{position:absolute;top:212px;left:7px}.xpress-editor .tool li.character .layer p *{vertical-align:top}.xpress-editor .tool li.character .layer p label{position:relative;top:4px;margin:0 7px 0 0;color:#333;letter-spacing:-1px}.xpress-editor .tool li.character .layer p input{padding:3px 0 0 4px;margin:0 4px 0 0;width:300px;_width:306px;height:16px;_height:20px;border:1px solid #acacac;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.character .layer p button{position:relative;*top:1px;width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat}.xpress-editor .tool li.character .layer p button span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.extensions .layer{width:auto;white-space:nowrap;padding:5px 10px}.xpress-editor .tool li.extensions .layer li{margin:2px 0}.xpress-editor .tool li.extensions .layer li a{color:#000;text-decoration:none}.xpress-editor .tool li.extensions .layer li a:hover{text-decoration:underline}.xpress-editor .fileUploader{clear:both;padding-top:5px;margin-bottom:10px}.xpress-editor .fileUploader:after{content:"";display:block;clear:both}.xpress-editor .fileUploader .preview{float:left;width:64px;height:64px;border:1px solid #ccc;padding:2px;margin:0 10px 5px 0}.xpress-editor .fileUploader .preview.black{background-color:#000;border:1px solid #666}.xpress-editor .fileUploader .preview img{display:block;width:64px;height:64px}.xpress-editor .fileUploader .fileListArea{float:left;width:260px;margin:0 10px 5px 0}.xpress-editor .fileUploader .fileListArea select{width:100%;height:70px;overflow:auto;margin:0;padding:0;float:none}.xpress-editor .fileUploader .fileListArea select option{font-size:11px}.xpress-editor .fileUploader .fileListArea.black select{background-color:#000;border:1px solid #666}.xpress-editor .fileUploader .fileListArea.black select option{color:#aaa}.xpress-editor .fileUploader .fileUploadControl{clear:right}.xpress-editor .fileUploader .fileUploadControl .button{margin-bottom:5px}.xpress-editor .fileUploader .file_attach_info{clear:right;margin:5px 0;font-size:11px;color:#333}.xpress-editor .autosave_message{display:none;background:#f6ffdb;padding:6px 10px;margin:0;line-height:1}.xpress-editor.black .autosave_message{display:none;background:#222;padding:6px 10px;margin:0;line-height:1;color:#fff}.xpress-editor .input_syntax.black{background:transparent;color:#fff} \ No newline at end of file +@charset "utf-8";.xeTextEditor{margin:0 12px 0 0}.xeTextEditor textarea{display:block;margin:0;padding:5px}.xeTextEditor.black textarea{color:#fff;background-color:#000}.xpress-editor *{margin:0;padding:0;font-style:normal;font-size:12px}.xpress-editor img,.xpress-editor fieldset,.xpress-editor button{border:0}.xpress-editor button{background:0;background-repeat:no-repeat;cursor:pointer}.xpress-editor button *{visibility:hidden}.xpress-editor legend{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden}.xpress-editor label{cursor:pointer}.xpress-editor hr{display:none}.xpress-editor li{list-style:none}.xpress-editor{position:relative;background:transparent}.xpress-editor #smart_content{position:relative;clear:both;margin:0 0 10px 0;border:1px solid #c2c2c2;*zoom:1;z-index:1;background:#fff}.xpress-editor.black #smart_content{background:transparent}.xpress-editor #smart_footer{position:relative;text-align:center;padding:10px 0}.xpress-editor #smart_footer *{vertical-align:top}.xpress-editor #smart_footer button{position:relative;width:67px;height:25px;margin:0 5px 0 0}.xpress-editor #smart_footer button.save_temp{background:url(../img/btn_save_temp.gif) no-repeat}.xpress-editor #smart_footer button.preview{background:url(../img/btn_preview.gif) no-repeat}.xpress-editor #smart_footer input{margin:0}.xpress-editor #smart_footer input.reset{width:67px;height:25px;border:0;background:url(../img/btn_cancel.gif) no-repeat;cursor:pointer;margin-left:5px}.xpress-editor a.skip{position:absolute;display:block;top:0;right:0;width:1px;height:1px;overflow:hidden;clear:both;zoom:1}.xpress-editor a.skip:hover,.xpress-editor a.skip:active,.xpress-editor a.skip:focus{position:relative;display:block;padding:5px;right:0;z-index:60;width:auto;height:auto;text-align:right;white-space:nowrap;color:#000;text-decoration:none;letter-spacing:-1px;_zoom:1}.xpress-editor .input_area{position:relative;margin:10px 10px 20px 10px;z-index:30;*zoom:1;height:400px;overflow:hidden}.xpress-editor .input_area iframe,.xpress-editor .input_area textarea{display:block;width:100%!important;position:relative;height:100%;border:0!important;padding:0!important;overflow:auto}.xpress-editor .input_area textarea{*margin:0 -10px;_margin-bottom:-2px}.xpress-editor .input_area textarea.blind{display:none}.xpress-editor .input_control{position:relative;display:block;width:100%;clear:both;text-align:center;border-top:1px solid #ccc;background:#f8f8f8 url(../img/btn_expand.gif) no-repeat center center;cursor:n-resize}.xpress-editor .input_control span{display:block;height:21px;visibility:hidden;overflow:visible;font-size:0;line-height:0;white-space:nowrap;color:#fff}.xpress-editor .input_auto{position:absolute;z-index:2;left:5px;bottom:4px;zoom:1}.xpress-editor .input_auto.line{height:17px;margin:0;display:block;border-top:1px solid #ccc;padding:4px 0 0 8px;background:#f8f8f8}.xpress-editor .input_auto input{margin:0;padding:0;width:13px;height:13px;vertical-align:middle;margin:0 4px 0 0}.xpress-editor .input_auto label{font-size:11px;vertical-align:middle;line-height:13px;color:#666}.xpress-editor.black .input_control{background:#111 url(../img/btn_expand.black.gif) no-repeat center center}.xpress-editor.black .input_control span{border-top:1px solid #333;color:#000}.xpress-editor .tool{position:relative;overflow:visible;padding:5px 10px 6px 10px;*padding:5px 10px 8px 10px;z-index:40;clear:both;background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom;border:0;*zoom:1}.xpress-editor .tool.disable{display:none}.xpress-editor.black .tool{background:#111 url(../img/bg_tool.black.gif) repeat-x left bottom}.xpress-editor .tool:after{content:"";display:block;clear:both}.xpress-editor .tool ul{position:relative;overflow:visible;float:left;margin:0 5px 2px 0!important;z-index:2;border:0!important}.xpress-editor .tool ul.action{width:43px}.xpress-editor .tool ul.type{width:auto;white-space:nowrap;height:21px}.xpress-editor .tool ul.style{width:169px;z-index:6}.xpress-editor .tool ul.paragraph{width:169px;z-index:5}.xpress-editor .tool ul.extra1{width:69px;z-index:4}.xpress-editor .tool ul.table{width:85px;z-index:3}.xpress-editor .tool ul.extra2{width:auto;z-index:2}.xpress-editor .tool ul.extra3{float:left;width:auto;z-index:1;margin-right:1px}.xpress-editor .tool ul.extra3 li{margin-right:4px}.xpress-editor .tool li{position:relative;float:left;margin:0!important;padding:0!important;border:0!important}.xpress-editor .tool li button{width:21px;height:21px;background:url(../img/btn_set.gif) no-repeat 0 0;vertical-align:top;float:left}.xpress-editor.black .tool li button{width:21px;height:21px;background:url(../img/btn_set.black.gif) no-repeat 0 0;vertical-align:top}.xpress-editor .tool li button span{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.extensions span.exButton,.xpress-editor .tool li.extensions span.exButton button{float:left;position:relative;display:inline-block;width:auto;background:url(../img/btn_set_blank.gif) no-repeat left top}.xpress-editor .tool li.extensions span.exButton button{left:2px;height:21px;background-position:right top;padding:0 4px;font:11px/21px Tahoma,Sans-serif;text-align:left;*overflow:visible;*line-height:20px}.xpress-editor.black .tool li.extensions span.exButton,.xpress-editor.black .tool li.extensions span.exButton button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)}.xpress-editor .tool li.html span,.xpress-editor .tool li.html span button,.xpress-editor .tool li.preview span,.xpress-editor .tool li.preview span button{float:left;position:relative;display:inline-block;width:auto;height:auto;visibility:visible;background:url(../img/btn_set_blank.gif) no-repeat 0 0;white-space:nowrap}.xpress-editor.black .tool li.html span,.xpress-editor.black .tool li.html span button,.xpress-editor.black .tool li.preview span,.xpress-editor.black .tool li.preview span button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)}.xpress-editor .tool li.html span,.xpress-editor .tool li.preview span{margin-right:2px;background-position:left top}.xpress-editor .tool li.html span button,.xpress-editor .tool li.preview span button{left:2px;height:21px;background-position:right top;font:11px/21px Tahoma,Sans-serif;padding:0 4px;*overflow:visible;*line-height:20px}.xpress-editor .tool ul.type li{float:none;display:inline;*top:1px}.xpress-editor .tool ul.type li select{height:21px;width:64px;white-space:nowrap}.xpress-editor .tool ul.type li option{white-space:nowrap}.xpress-editor.black .tool ul.type li select{color:#fff;background-color:#000}.xpress-editor .tool li.undo button{width:22px;background-position:0 0}.xpress-editor .tool li.redo button{background-position:-22px 0}.xpress-editor .tool li.bold button{width:22px;background-position:-43px 0}.xpress-editor .tool li.underline button{background-position:-65px 0}.xpress-editor .tool li.italic button{background-position:-86px 0}.xpress-editor .tool li.del button{background-position:-107px 0}.xpress-editor .tool li.fcolor button{background-position:-128px 0}.xpress-editor .tool li.bcolor button{background-position:-149px 0}.xpress-editor .tool li.sup button{background-position:-170px 0}.xpress-editor .tool li.sub button{background-position:-191px 0}.xpress-editor .tool li.left button{width:22px;background-position:-212px 0}.xpress-editor .tool li.center button{background-position:-234px 0}.xpress-editor .tool li.right button{background-position:-255px 0}.xpress-editor .tool li.justify button{background-position:-276px 0}.xpress-editor .tool li.ol button{background-position:-297px 0}.xpress-editor .tool li.ul button{background-position:-318px 0}.xpress-editor .tool li.outdent button{background-position:-339px 0}.xpress-editor .tool li.indent button{background-position:-360px 0}.xpress-editor .tool li.blockquote button{width:22px;background-position:-381px 0}.xpress-editor .tool li.url button{width:26px;background-position:-403px 0}.xpress-editor .tool li.character button{background-position:-429px 0}.xpress-editor .tool li.table button{width:22px;background-position:-450px 0}.xpress-editor .tool li.merge button{background-position:-472px 0}.xpress-editor .tool li.splitCol button{background-position:-493px 0}.xpress-editor .tool li.splitRow button{background-position:-514px 0}.xpress-editor .tool li.extensions span{background-position:0 0}.xpress-editor .tool li.extensions span button{background-position:right 0}.xpress-editor .tool li.html span{background-position:0 0}.xpress-editor .tool li.html span button{background-position:right 0}.xpress-editor .tool li.preview span{background-position:0 0}.xpress-editor .tool li.preview span button{background-position:right 0}.xpress-editor .tool li.undo button.hover{width:22px;background-position:0 -21px}.xpress-editor .tool li.redo button.hover{background-position:-22px -21px}.xpress-editor .tool li.bold button.hover{width:22px;background-position:-43px -21px}.xpress-editor .tool li.underline button.hover{background-position:-65px -21px}.xpress-editor .tool li.italic button.hover{background-position:-86px -21px}.xpress-editor .tool li.del button.hover{background-position:-107px -21px}.xpress-editor .tool li.fcolor button.hover{background-position:-128px -21px}.xpress-editor .tool li.bcolor button.hover{background-position:-149px -21px}.xpress-editor .tool li.sup button.hover{background-position:-170px -21px}.xpress-editor .tool li.sub button.hover{background-position:-191px -21px}.xpress-editor .tool li.left button.hover{width:22px;background-position:-212px -21px}.xpress-editor .tool li.center button.hover{background-position:-234px -21px}.xpress-editor .tool li.right button.hover{background-position:-255px -21px}.xpress-editor .tool li.justify button.hover{background-position:-276px -21px}.xpress-editor .tool li.ol button.hover{background-position:-297px -21px}.xpress-editor .tool li.ul button.hover{background-position:-318px -21px}.xpress-editor .tool li.outdent button.hover{background-position:-339px -21px}.xpress-editor .tool li.indent button.hover{background-position:-360px -21px}.xpress-editor .tool li.blockquote button.hover{width:22px;background-position:-381px -21px}.xpress-editor .tool li.url button.hover{width:26px;background-position:-403px -21px}.xpress-editor .tool li.character button.hover{background-position:-429px -21px}.xpress-editor .tool li.table button.hover{width:22px;background-position:-450px -21px}.xpress-editor .tool li.merge button.hover{background-position:-472px -21px}.xpress-editor .tool li.splitCol button.hover{background-position:-493px -21px}.xpress-editor .tool li.splitRow button.hover{background-position:-514px -21px}.xpress-editor .tool li.extensions span.hover{background-position:0 -21px}.xpress-editor .tool li.extensions span.hover button{background-position:right -21px}.xpress-editor .tool li.html span.hover{background-position:0 -21px}.xpress-editor .tool li.html span.hover button{background-position:right -21px}.xpress-editor .tool li.preview span.hover{background-position:0 -21px}.xpress-editor .tool li.preview span.hover button{background-position:right -21px}.xpress-editor .tool li.undo button.active{width:22px;background-position:0 -42px}.xpress-editor .tool li.redo button.active{background-position:-22px -42px}.xpress-editor .tool li.bold button.active{width:22px;background-position:-43px -42px}.xpress-editor .tool li.underline button.active{background-position:-65px -42px}.xpress-editor .tool li.italic button.active{background-position:-86px -42px}.xpress-editor .tool li.del button.active{background-position:-107px -42px}.xpress-editor .tool li.fcolor button.active{background-position:-128px -42px}.xpress-editor .tool li.bcolor button.active{background-position:-149px -42px}.xpress-editor .tool li.sup button.active{background-position:-170px -42px}.xpress-editor .tool li.sub button.active{background-position:-191px -42px}.xpress-editor .tool li.left button.active{width:22px;background-position:-212px -42px}.xpress-editor .tool li.center button.active{background-position:-234px -42px}.xpress-editor .tool li.right button.active{background-position:-255px -42px}.xpress-editor .tool li.justify button.active{background-position:-276px -42px}.xpress-editor .tool li.ol button.active{background-position:-297px -42px}.xpress-editor .tool li.ul button.active{background-position:-318px -42px}.xpress-editor .tool li.outdent button.active{background-position:-339px -42px}.xpress-editor .tool li.indent button.active{background-position:-360px -42px}.xpress-editor .tool li.blockquote button.active{width:22px;background-position:-381px -42px}.xpress-editor .tool li.url button.active{width:26px;background-position:-403px -42px}.xpress-editor .tool li.character button.active{background-position:-429px -42px}.xpress-editor .tool li.table button.active{width:22px;background-position:-450px -42px}.xpress-editor .tool li.merge button.active{background-position:-472px -42px}.xpress-editor .tool li.splitCol button.active{background-position:-493px -42px}.xpress-editor .tool li.splitRow button.active{background-position:-514px -42px}.xpress-editor .tool li.extensions span.active{background-position:0 -42px}.xpress-editor .tool li.extensions span.active button{background-position:right -42px}.xpress-editor .tool li.html span.active{background-position:0 -42px}.xpress-editor .tool li.html span.active button{background-position:right -42px}.xpress-editor .tool li.preview span.active{background-position:0 -42px}.xpress-editor .tool li.preview span.active button{background-position:right -42px}.xpress-editor .tool.off li.undo button,.xpress-editor .tool li.undo button.off{width:22px;background-position:0 -63px}.xpress-editor .tool.off li.redo button,.xpress-editor .tool li.redo button.off{background-position:-22px -63px}.xpress-editor .tool.off li.bold button{width:22px;background-position:-43px -63px}.xpress-editor .tool.off li.underline button{background-position:-65px -63px}.xpress-editor .tool.off li.italic button{background-position:-86px -63px}.xpress-editor .tool.off li.del button{background-position:-107px -63px}.xpress-editor .tool.off li.fcolor button{background-position:-128px -63px}.xpress-editor .tool.off li.bcolor button{background-position:-149px -63px}.xpress-editor .tool.off li.sup button{background-position:-170px -63px}.xpress-editor .tool.off li.sub button{background-position:-191px -63px}.xpress-editor .tool.off li.left button{width:22px;background-position:-212px -63px}.xpress-editor .tool.off li.center button{background-position:-234px -63px}.xpress-editor .tool.off li.right button{background-position:-255px -63px}.xpress-editor .tool.off li.justify button{background-position:-276px -63px}.xpress-editor .tool.off li.ol button{background-position:-297px -63px}.xpress-editor .tool.off li.ul button{background-position:-318px -63px}.xpress-editor .tool.off li.outdent button{background-position:-339px -63px}.xpress-editor .tool.off li.indent button{background-position:-360px -63px}.xpress-editor .tool.off li.blockquote button{width:22px;background-position:-381px -63px}.xpress-editor .tool.off li.url button{width:26px;background-position:-403px -63px}.xpress-editor .tool.off li.character button{background-position:-429px -63px}.xpress-editor .tool.off li.table button{width:22px;background-position:-450px -63px}.xpress-editor .tool.off li.merge button,.xpress-editor .tool li.merge button.off{background-position:-472px -63px}.xpress-editor .tool.off li.splitCol button,.xpress-editor .tool li.splitCol button.off{background-position:-493px -63px}.xpress-editor .tool.off li.splitRow button,.xpress-editor .tool li.splitRow button.off{background-position:-514px -63px}.xpress-editor .tool.off li.extensions span{background-position:0 -63px}.xpress-editor .tool.off li.extensions span button{background-position:right -63px;color:#bcbcbc}.xpress-editor .tool.off li button{cursor:default}.xpress-editor .tool.off ul.extra3 li button{cursor:pointer}.xpress-editor .tool .layer{display:none;position:absolute;left:0;top:20px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}.xpress-editor .tool .layer li{float:none;left:0}.xpress-editor .tool .layer button,.xpress-editor.black .tool .layer button{margin:0!important;width:auto;height:auto;background:0;float:none}.xpress-editor .tool .layer button span{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool .btn_area{position:relative;clear:both;text-align:center!important;padding:7px 0 12px 0;width:100%;white-space:nowrap;*zoom:1}.xpress-editor .tool .btn_area *{vertical-align:top}.xpress-editor .tool button.close{position:absolute;top:4px;right:3px;width:21px;height:20px;background:url(../img/btn_layer_close.gif) no-repeat center center!important}.xpress-editor .tool button.close span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool .layer .btn_area button{*margin:0 2px!important}.xpress-editor .tool .layer .btn_area button.confirm{width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat}.xpress-editor .tool .layer .btn_area button.cancel{width:38px;height:21px;background:url(../img/btn_layer_cancel.gif) no-repeat}.xpress-editor .tool li.fcolor .layer{width:218px!important;height:auto!important;background-image:none!important;overflow:hidden}.xpress-editor .tool .layer .palette{width:210px;position:relative;left:7px;padding:8px 0 7px 0;margin:0}.xpress-editor .tool .layer .palette li{float:left;margin:0 1px 1px 0!important;font-size:0;line-height:0}.xpress-editor .tool .layer .palette button{position:relative;overflow:hidden;width:11px!important;height:11px!important}.xpress-editor .tool li.bcolor .layer{width:218px;overflow:hidden}.xpress-editor .tool .layer .background{width:210px;position:relative;left:7px;margin:0 0 -2px 0;padding:8px 0 0 0;*padding-bottom:8px;_padding-bottom:4px}.xpress-editor .tool .layer .background li{float:left;margin:0 5px 2px 0!important}.xpress-editor .tool .layer .background button{position:relative;overflow:hidden;width:65px;height:19px;text-align:left;padding:4px}.xpress-editor .tool .layer .background button span{position:relative;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto}.xpress-editor .tool li.style .layer{padding:4px 2px;_overflow:hidden;filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2)}.xpress-editor .tool li.style .layer li{position:relative;background:#fbfbfb}.xpress-editor .tool li.style .layer li button{display:block;width:134px;position:relative}.xpress-editor .tool li.style .layer li button span{display:block;width:130px;text-align:left;letter-spacing:normal}.xpress-editor .tool li.style .layer li.h3 button span{padding:3px 0 1px 4px;height:15px;font-size:16px;font-weight:bold}.xpress-editor .tool li.style .layer li.h4 button span{padding:3px 0 2px 4px;height:13px;font-size:14px;font-weight:bold}.xpress-editor .tool li.style .layer li.h5 button span{padding:3px 0 1px 4px;height:11px;font-size:12px;font-weight:bold}.xpress-editor .tool li.style .layer li.h6 button span{padding:3px 0 1px 4px;height:11px;font-size:12px}.xpress-editor .tool li.style .layer li.p button span{padding:3px 0 1px 4px;height:11px;font-size:12px;color:#5d5d5d}.xpress-editor .tool li.style .layer li button.hover{background:#c1f471;*height:1%}.xpress-editor .tool li.blockquote .layer{padding:6px 0 6px 7px;left:0;width:294px}.xpress-editor .tool li.blockquote .layer ul{*zoom:1;margin:0}.xpress-editor .tool li.blockquote .layer ul:after{content:"";display:block;clear:both}.xpress-editor .tool li.blockquote .layer li{position:relative;float:left;overflow:hidden;width:32px;height:34px;margin:0 2px 0 0!important;border:1px solid #cdcecc!important;background-image:url(../img/btn_qmark.gif);background-repeat:no-repeat}.xpress-editor .tool li.blockquote .layer li.q1{background-position:0 0}.xpress-editor .tool li.blockquote .layer li.q2{background-position:-32px 0}.xpress-editor .tool li.blockquote .layer li.q3{background-position:-64px 0}.xpress-editor .tool li.blockquote .layer li.q4{background-position:-96px 0}.xpress-editor .tool li.blockquote .layer li.q5{background-position:-128px 0}.xpress-editor .tool li.blockquote .layer li.q6{background-position:-160px 0}.xpress-editor .tool li.blockquote .layer li.q7{background-position:-192px 0}.xpress-editor .tool li.blockquote .layer li.q8{background-position:-224px 0}.xpress-editor .tool li.blockquote .layer li button{width:32px;height:34px}.xpress-editor .tool li.url .layer{width:231px;height:125px;background-image:url(../img/bx_url.gif);background-repeat:no-repeat;background-position:10px 14px}.xpress-editor .tool li.url .layer fieldset{position:absolute;width:212px;left:10px;top:14px}.xpress-editor .tool li.url .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:0;margin:0;padding:0;font-weight:normal}.xpress-editor .tool li.url .layer fieldset input.link{position:absolute;left:12px;top:19px;width:179px;padding:2px 0 1px 6px;*margin:-1px 0;font-size:11px;height:13px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.url .layer fieldset p{position:absolute;left:12px;top:44px}.xpress-editor .tool li.url .layer fieldset p input{width:13px;height:13px;vertical-align:middle;margin-right:3px}.xpress-editor .tool li.url .layer .btn_area{position:absolute;bottom:12px;padding:0}.xpress-editor .tool li.table .layer{width:242px;height:239px;background-image:url(../img/bx_table.gif);background-repeat:no-repeat;background-position:10px 14px}.xpress-editor .tool li.table .layer fieldset{position:absolute;width:222px;left:10px}.xpress-editor .tool li.table .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:0;margin:0;padding:0;font-weight:normal}.xpress-editor .tool li.table .layer fieldset dl{position:absolute;left:10px}.xpress-editor .tool li.table .layer fieldset dt{float:left;padding:3px 0 0 0;height:20px;white-space:nowrap;letter-spacing:-1px}.xpress-editor .tool li.table .layer fieldset dd{float:right;position:relative}.xpress-editor .tool li.table .layer fieldset dd button.add,.xpress-editor .tool li.table .layer fieldset dd button.del{position:absolute;left:27px;width:15px;height:8px;background:url(../img/btn_layer_cell_adjust.gif) no-repeat}.xpress-editor .tool li.table .layer fieldset dd button.add{top:1px}.xpress-editor .tool li.table .layer fieldset dd button.del{top:9px;background-position:0 -8px}.xpress-editor .tool li.table .layer fieldset dd .preview_palette{display:block;float:left;margin:0 3px 0 0;padding:2px;position:relative;border:1px solid #c8c9c6;width:14px;height:14px;overflow:hidden}.xpress-editor .tool li.table .layer fieldset dd .preview_palette button{width:14px;height:14px;font-size:500px;line-height:0}.xpress-editor .tool li.table .layer fieldset dd .find_palette{width:33px;height:20px;background:url(../img/btn_search.gif) no-repeat}.xpress-editor .tool li.table .layer fieldset.num{top:14px}.xpress-editor .tool li.table .layer fieldset.num dl{top:18px;width:60px}.xpress-editor .tool li.table .layer fieldset.num dt{height:20px}.xpress-editor .tool li.table .layer fieldset.num dd{height:23px}.xpress-editor .tool li.table .layer fieldset.num dt label{font-size:11px;color:#333}.xpress-editor .tool li.table .layer fieldset.num dd input{padding:3px 0 0 6px;*margin:-1px 0;width:35px;height:13px;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.table .layer fieldset.color{top:96px}.xpress-editor .tool li.table .layer fieldset.color dl{top:18px;width:210px}.xpress-editor .tool li.table .layer fieldset.color dt{height:23px}.xpress-editor .tool li.table .layer fieldset.color dd{height:26px;width:146px}.xpress-editor .tool li.table .layer fieldset.color dt label{font-size:11px;color:#333}.xpress-editor .tool li.table .layer fieldset.color dd input{padding:3px 0 0 6px;*margin:-1px 0;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{width:35px;height:13px}.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_color,.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{width:70px;height:15px;*margin-right:3px}.xpress-editor .tool li.table .layer table{position:absolute;top:18px;left:75px;width:137px;height:40px;table-layout:fixed;border-collapse:separate;border:0}.xpress-editor .tool li.table .layer table *{font-size:0;line-height:0}.xpress-editor .tool li.table .layer table th,.xpress-editor .tool li.table .layer table td{text-align:center;padding:0;border:0}.xpress-editor .tool li.table .layer .btn_area{position:absolute;bottom:12px;padding:0;z-index:1}.xpress-editor .tool li.table .layer .palette{display:none;position:absolute;z-index:2;left:11px;width:204px;padding:8px 7px 7px 7px;_padding-right:6px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}.xpress-editor .tool li.table .layer.p1 .palette{display:block;top:163px}.xpress-editor .tool li.table .layer.p2 .palette{display:block;top:189px}.xpress-editor .tool li.character .layer{width:433px;height:242px;overflow:hidden}.xpress-editor .tool li.character .layer ul{margin:0}.xpress-editor .tool li.character .layer h3{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.character .layer .nav{position:absolute;top:11px;left:-1px;overflow:hidden;white-space:nowrap}.xpress-editor .tool li.character .layer .nav li{display:inline;margin:0 -4px 0 0;padding:0 8px!important;background:url(../img/vr_layer_character.gif) no-repeat 0 0}.xpress-editor .tool li.character .layer .nav li a{color:#444;text-decoration:none;letter-spacing:-1px}.xpress-editor .tool li.character .layer .nav li a:hover,.xpress-editor .tool li.character .layer .nav li a:active,.xpress-editor .tool li.character .layer .nav li a:focus{text-decoration:underline}.xpress-editor .tool li.character .layer .nav li a.on{font-weight:bold;color:#004790;display:inline}.xpress-editor .tool li.character .layer .list{position:absolute;left:7px;top:30px;width:421px;height:172px;background:url(../img/bx_character.gif) no-repeat}.xpress-editor .tool li.character .layer .list li{position:relative;top:1px;left:1px;float:left;width:20px;height:18px;margin:0 1px 1px 0!important}.xpress-editor .tool li.character .layer .list li button{width:20px;height:18px}.xpress-editor .tool li.character .layer .list li button.hover{border:2px solid #27c11a}.xpress-editor .tool li.character .layer .list li button span{overflow:visible;font-size:12px;width:auto;height:auto;position:relative;visibility:visible;line-height:normal}.xpress-editor .tool li.character .layer p{position:absolute;top:212px;left:7px}.xpress-editor .tool li.character .layer p *{vertical-align:top}.xpress-editor .tool li.character .layer p label{position:relative;top:4px;margin:0 7px 0 0;color:#333;letter-spacing:-1px}.xpress-editor .tool li.character .layer p input{padding:3px 0 0 4px;margin:0 4px 0 0;width:300px;_width:306px;height:16px;_height:20px;border:1px solid #acacac;border-right:1px solid #dadada;border-bottom:1px solid #dadada}.xpress-editor .tool li.character .layer p button{position:relative;*top:1px;width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat}.xpress-editor .tool li.character .layer p button span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.xpress-editor .tool li.extensions .layer{width:auto;white-space:nowrap;padding:5px 10px}.xpress-editor .tool li.extensions .layer li{margin:2px 0}.xpress-editor .tool li.extensions .layer li a{color:#000;text-decoration:none}.xpress-editor .tool li.extensions .layer li a:hover{text-decoration:underline}.xpress-editor .fileUploader{clear:both;padding-top:5px;margin-bottom:10px}.xpress-editor .fileUploader:after{content:"";display:block;clear:both}.xpress-editor .fileUploader .preview{float:left;width:64px;height:64px;border:1px solid #ccc;padding:2px;margin:0 10px 5px 0}.xpress-editor .fileUploader .preview.black{background-color:#000;border:1px solid #666}.xpress-editor .fileUploader .preview img{display:block;width:64px;height:64px}.xpress-editor .fileUploader .fileListArea{float:left;width:260px;margin:0 10px 5px 0}.xpress-editor .fileUploader .fileListArea select{width:100%;height:70px;overflow:auto;margin:0;padding:0;float:none}.xpress-editor .fileUploader .fileListArea select option{font-size:11px}.xpress-editor .fileUploader .fileListArea.black select{background-color:#000;border:1px solid #666}.xpress-editor .fileUploader .fileListArea.black select option{color:#aaa}.xpress-editor .fileUploader .fileUploadControl{clear:right}.xpress-editor .fileUploader .fileUploadControl .button{margin-bottom:5px}.xpress-editor .fileUploader .file_attach_info{clear:right;margin:5px 0;font-size:11px;color:#333}.xpress-editor .autosave_message{display:none;background:#f6ffdb;padding:6px 10px;margin:0;line-height:1}.xpress-editor.black .autosave_message{display:none;background:#222;padding:6px 10px;margin:0;line-height:1;color:#fff}.xpress-editor .input_syntax.black{background:transparent;color:#fff} \ No newline at end of file diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js index f9482dc55..0e64fe10b 100755 --- a/modules/editor/tpl/js/uploader.js +++ b/modules/editor/tpl/js/uploader.js @@ -88,6 +88,11 @@ function start(cfg) { uploaderStatusID : cfg.uploaderStatusID }; + if(typeof(enforce_ssl)!=="undefined" && enforce_ssl) + { + settings.upload_url = request_uri+'index.php'; + }; + // preview $('#'+cfg.fileListAreaID).click(previewFiles); @@ -137,7 +142,7 @@ function _true(){ return true }; defaultHandlers = { onFileQueued : _true, - onFileQueueError : function(flie, errorCode, message) { + onFileQueueError : function(file, errorCode, message) { try { switch(errorCode) { case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED : diff --git a/modules/file/file.class.php b/modules/file/file.class.php index eb08aa3ba..25740b981 100644 --- a/modules/file/file.class.php +++ b/modules/file/file.class.php @@ -70,6 +70,9 @@ // A column to determine a target type if(!$oDB->isColumnExists('files', 'upload_target_type')) return true; + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'file', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -124,6 +127,12 @@ // A column to determine a target type if(!$oDB->isColumnExists('files', 'upload_target_type')) $oDB->addColumn('files', 'upload_target_type', 'char', '3'); + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'file', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'file', 'controller', 'triggerCopyModule', 'after'); + } + return new Object(0, 'success_updated'); } diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index 2d6108ca8..42ea8b021 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -777,5 +777,20 @@ function printUploadedFileList($editor_sequence, $upload_target_srl) { return; } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $fileConfig = $oModuleModel->getModulePartConfig('file', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('file', $moduleSrl, $fileConfig); + } + } + } } ?> diff --git a/modules/file/file.model.php b/modules/file/file.model.php index 34005e0d3..5c251107d 100644 --- a/modules/file/file.model.php +++ b/modules/file/file.model.php @@ -177,9 +177,10 @@ * @param string $sortIndex The column that used as sort index * @return array Returns array of object that contains file information. If no result returns null. **/ - function getFiles($upload_target_srl, $columnList = array(), $sortIndex = 'file_srl') { + function getFiles($upload_target_srl, $columnList = array(), $sortIndex = 'file_srl', $ckValid = false) { $args->upload_target_srl = $upload_target_srl; $args->sort_index = $sortIndex; + if($ckValid) $args->isvalid = 'Y'; $output = executeQuery('file.getFiles', $args, $columnList); if(!$output->data) return; diff --git a/modules/file/lang/lang.xml b/modules/file/lang/lang.xml index 664798cc6..c184a894e 100644 --- a/modules/file/lang/lang.xml +++ b/modules/file/lang/lang.xml @@ -156,7 +156,7 @@ - + diff --git a/modules/file/queries/getFiles.xml b/modules/file/queries/getFiles.xml index 66ef5e905..d0e326fb3 100644 --- a/modules/file/queries/getFiles.xml +++ b/modules/file/queries/getFiles.xml @@ -4,6 +4,7 @@ + diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index a0618d56f..1020a0393 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -150,7 +150,7 @@ $buff = ' $val) { if(!$val) continue; - if(preg_match('/(<\?|<\?php|\?>)/xsm', preg_replace('/\s/', '', $val))) + if(preg_match('/(<\?|<\?php|\?>|fputs|fopen|fwrite|fgets|fread|\/\*|\*\/|chr\()/xsm', preg_replace('/\s/', '', $val))) { continue; } diff --git a/modules/install/script/welcome_content/welcome_content_en.html b/modules/install/script/welcome_content/welcome_content_en.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_en.html +++ b/modules/install/script/welcome_content/welcome_content_en.html @@ -2,7 +2,7 @@

        We recommend you to delete this demo page before launching the site.
        Please check the following list to verify whether the installation has been properly completed.
        You can see all the components on the administration page.

        1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
        2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_es.html b/modules/install/script/welcome_content/welcome_content_es.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_es.html +++ b/modules/install/script/welcome_content/welcome_content_es.html @@ -2,7 +2,7 @@

          We recommend you to delete this demo page before launching the site.
          Please check the following list to verify whether the installation has been properly completed.
          You can see all the components on the administration page.

          1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
          2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_fr.html b/modules/install/script/welcome_content/welcome_content_fr.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_fr.html +++ b/modules/install/script/welcome_content/welcome_content_fr.html @@ -2,7 +2,7 @@

            We recommend you to delete this demo page before launching the site.
            Please check the following list to verify whether the installation has been properly completed.
            You can see all the components on the administration page.

            1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
            2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_jp.html b/modules/install/script/welcome_content/welcome_content_jp.html index c4ae50fe4..1c1ea4141 100644 --- a/modules/install/script/welcome_content/welcome_content_jp.html +++ b/modules/install/script/welcome_content/welcome_content_jp.html @@ -2,7 +2,7 @@

              ウェブサイトを始める前にこのページを削除してください。
              以下のリストの格項目をチェックして設置状態を確認することができます。
              管理ページから全てのコンポネントを確認することができます。

              1. - 画面の構成から header, body, footerが見えたら、レイアウトは正常に設置されたことです。 + 画面の構成から header, body, footerが見えたら、レイアウトは正常に設置されたことです。
              2. 画面上端と左に位置する二つのメニューが見えたら、メニューモジュールは正常に設置されたことです diff --git a/modules/install/script/welcome_content/welcome_content_ko.html b/modules/install/script/welcome_content/welcome_content_ko.html index 8f85c2201..332d6da27 100644 --- a/modules/install/script/welcome_content/welcome_content_ko.html +++ b/modules/install/script/welcome_content/welcome_content_ko.html @@ -2,7 +2,7 @@

                XE core설치가 성공적으로 완료되었습니다.
                이 페이지는 데모 페이지 이므로 추후 사이트 운영시 삭제 가능합니다.
                모든 설치요소는 관리자로 로그인하셔야 확인할 수 있습니다.

                1. - 헤더, 본문, 풋터로 구성된 화면이 보인다면 레이아웃이 정상적으로 설치된 것입니다. + 헤더, 본문, 풋터로 구성된 화면이 보인다면 레이아웃이 정상적으로 설치된 것입니다.
                2. 글로벌 네비게이션로컬 네비게이션이 보인다면 메뉴 모듈이 설치된 것입니다. diff --git a/modules/install/script/welcome_content/welcome_content_mn.html b/modules/install/script/welcome_content/welcome_content_mn.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_mn.html +++ b/modules/install/script/welcome_content/welcome_content_mn.html @@ -2,7 +2,7 @@

                  We recommend you to delete this demo page before launching the site.
                  Please check the following list to verify whether the installation has been properly completed.
                  You can see all the components on the administration page.

                  1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
                  2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_ru.html b/modules/install/script/welcome_content/welcome_content_ru.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_ru.html +++ b/modules/install/script/welcome_content/welcome_content_ru.html @@ -2,7 +2,7 @@

                    We recommend you to delete this demo page before launching the site.
                    Please check the following list to verify whether the installation has been properly completed.
                    You can see all the components on the administration page.

                    1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
                    2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_tr.html b/modules/install/script/welcome_content/welcome_content_tr.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_tr.html +++ b/modules/install/script/welcome_content/welcome_content_tr.html @@ -2,7 +2,7 @@

                      We recommend you to delete this demo page before launching the site.
                      Please check the following list to verify whether the installation has been properly completed.
                      You can see all the components on the administration page.

                      1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
                      2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_vi.html b/modules/install/script/welcome_content/welcome_content_vi.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_vi.html +++ b/modules/install/script/welcome_content/welcome_content_vi.html @@ -2,7 +2,7 @@

                        We recommend you to delete this demo page before launching the site.
                        Please check the following list to verify whether the installation has been properly completed.
                        You can see all the components on the administration page.

                        1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
                        2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_zh-CN.html b/modules/install/script/welcome_content/welcome_content_zh-CN.html index 1c0398c4c..3e9229262 100644 --- a/modules/install/script/welcome_content/welcome_content_zh-CN.html +++ b/modules/install/script/welcome_content/welcome_content_zh-CN.html @@ -2,7 +2,7 @@

                          We recommend you to delete this demo page before launching the site.
                          Please check the following list to verify whether the installation has been properly completed.
                          You can see all the components on the administration page.

                          1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer.
                          2. When Menu module has been successfully installed, you can see both global and local navigations. diff --git a/modules/install/script/welcome_content/welcome_content_zh-TW.html b/modules/install/script/welcome_content/welcome_content_zh-TW.html index 24ecb9e46..4967564df 100644 --- a/modules/install/script/welcome_content/welcome_content_zh-TW.html +++ b/modules/install/script/welcome_content/welcome_content_zh-TW.html @@ -2,7 +2,7 @@

                            ءߢ
                            ?
                            ʦη̸졣

                            1. - ͪ ʦ̸ Ү ڭ + ͪ ʦ̸ Ү ڭ
                            2. Ӥټ ʦ̸ ӤӤ diff --git a/modules/integration_search/skins/default/header.html b/modules/integration_search/skins/default/header.html index 7fd8abccb..7b040e228 100644 --- a/modules/integration_search/skins/default/header.html +++ b/modules/integration_search/skins/default/header.html @@ -11,8 +11,6 @@ - -
        - {$lang->cmd_insert}... + {$lang->cmd_insert}... +
        + diff --git a/modules/layout/tpl/layout_modify.html b/modules/layout/tpl/layout_modify.html index b9f54f3f8..8e1c4ebbe 100644 --- a/modules/layout/tpl/layout_modify.html +++ b/modules/layout/tpl/layout_modify.html @@ -2,11 +2,10 @@

        {$selected_layout->layout_title}

        -

        {$selected_layout->title}

        -
        + - + @@ -97,6 +96,12 @@ + + + + + + @@ -177,4 +182,4 @@
        - + diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 870d43eb7..ba2b7eda5 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -897,7 +897,7 @@ - + @@ -1576,6 +1576,7 @@ + @@ -2486,18 +2487,23 @@ Bạn có thể quản lý thành viên bằng cách tạo những nhóm mới, + + + + + - 확인하지 않은 로그인 실패 기록이 있습니다.
        %1$s

        * 이 알림은 한번만 보입니다.
        * 이 메시지는 쪽지와 이메일로 발송됩니다.
        * 이 메시지는 로그인이 성공한 순간, 로그인 성공 이전 실패 기록을 모아서 발송합니다.
        발송 시각: %2$s

        ]]>
        - There is unfolded sign in failure report
        %1$s

        * This notification is shown once.
        * This message will be send to your email and message.
        * This message contains sign in failure records, before a ID sign in success.
        Sending: %2$s

        ]]>
        + 로그인 실패 기록을 알려드립니다.
        %1$s

        * 비밀번호를 틀리는 등의 일이 없었는데 이 메시지를 보신다면, 계정 관리에 유의해주시기 바랍니다.
        * 이 메시지는 로그인이 성공한 순간 누적 로그인 실패 기록이 많을 경우, 로그인 성공 이전 실패 기록을 모아서 발송합니다.
        발송 시각: %2$s

        ]]>
        + There is recorded sign in failures.
        %1$s

        * This notification is shown once.
        * This message contains sign in failure records, before a ID sign in success.
        Sending: %2$s

        ]]>
        diff --git a/modules/member/m.skins/default/css/member.css b/modules/member/m.skins/default/css/member.css new file mode 100644 index 000000000..6cccfd3d1 --- /dev/null +++ b/modules/member/m.skins/default/css/member.css @@ -0,0 +1,34 @@ +@charset "utf-8"; +/* Element Reset */ +.xm, +.xm table, +.xm input, +.xm textarea, +.xm select, +.xm button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333} +.xm button, +.xm input[type=submit], +.xm input[type=reset], +.xm input[type=button]{cursor:pointer;overflow:visible} +.xm img{border:0} +.xm p{line-height:1.5} +/* Heading */ +.xm .hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0} +.xm .hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff} +.xm .hx.h2{background:#e5e5e5;text-shadow:1px 1px 0 #fff;position:relative;zoom:1} +.xm .hx>h2{margin:0 10px 0 0;display:inline;font-size:16px;line-height:1.4} +.xm .hx a{color:#000} +/* Content */ +.xm .co{margin: 10px;line-height: 1.4;font-size: 14px;color:#333} +/* DL */ +.xm .dl{margin:15px 0} +.xm .dl>dt{font-weight:bold;margin-top:10px} +.xm .dl>dt>em{font-style:normal;color:#e00} +.xm .dl>dd{margin-left:20px} +/* Button Area */ +.xm .ba{margin:15px 0;padding:0;list-style:none;border:1px solid #ddd;border-radius:4px} +.xm .ba li{border-top:1px solid #ddd} +.xm .ba li:first-child{border:0} +.xm .ba li>a, +.xm .ba li>button, +.xm .ba li>input{display:block;white-space:nowrap;padding:7px 10px;text-decoration:none;color:#000;background:#f4f4f4;text-shadow:0 1px 0 #fff;overflow:hidden;text-overflow:ellipsis} \ No newline at end of file diff --git a/modules/member/m.skins/default/css/mlogin.css b/modules/member/m.skins/default/css/mlogin.css new file mode 100644 index 000000000..69cc0934e --- /dev/null +++ b/modules/member/m.skins/default/css/mlogin.css @@ -0,0 +1,48 @@ +/* Mobile XE Login (/modules/member/tpl/login_form.html) */ +body{margin:0;background:#fff;color:#000;word-wrap:break-word} +body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif} +img{border:0} +em{font-style:normal} +form{margin:0;padding:0} +fieldset{margin:0;padding:0;border:0} +textarea{resize:vertical} +input[type=checkbox], +input[type=radio]{width:13px;height:13px;margin:0;padding:0} +/* Common */ +.fl{float:left} +.fr{float:right} +/* Body */ +.bd{background:#f8f8f8;padding:1px 0;border-bottom:1px solid #ccc8be} +.bd:after{content:"";margin:0;position:relative;top:3px;display:block;clear:both;height:1px;background:#fff} +/* Hx */ +.hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0} +.hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff} +.hx.h2{background:#e5e5e5} +.hx h2{margin:0 10px 0 0;display:inline} +.hx h2{font-size:16px;line-height:1.4} +/* Form Field */ +.ff{margin:0;padding:10px 0} +.ff ul{margin:0 10px 10px 10px;padding:10px 0 0 0;list-style:none} +.ff li{margin:0 0 5px 0;padding:0} +.ff label+input[type=text], +.ff label+input[type=password], +.ff label+textarea, +.ff label+select{display:block;width:96%;font-size:14px;margin:0 0 5px 0} +.ff label+input[type=text], +.ff label+input[type=password], +.ff label+textarea{padding:5px} +/* Help */ +.hp{background:#eee;border-top:1px solid #ddd;padding:12px 10px !important;margin:10px 0px !important;} +.hp li{margin:0;display:inline;border-left:1px solid #ccc;padding:0 4px 0 8px;} +.hp li:first-child{border:0;} +.hp a{color:#333;text-decoration:none} +/* Button Area */ +.bna{text-align:center;padding:0 10px;margin:10px 0} +.bna:after{content:"";display:block;clear:both} +.bn{display:inline-block;line-height:26px !important;padding:0 10px;font-size:12px;font-weight:bold;border:1px solid;text-decoration:none;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;cursor:pointer;vertical-align:middle} +.bn[type=submit], +.bn[type=button]{height:28px} +.bn[href]{height:26px} +.bn.dark{border-color:#666;background:#777 -webkit-gradient(linear,0% 0%,0% 100%,from(#7e7c78),to(#5c5b58));background:#777 -moz-linear-gradient(top,#7e7c78,#5c5b58);background-color:#777;color:#fff;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset} +.bn.white{border-color:#b5b5b5;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#f6f6f6),color-stop(0.5,#f0f0f0),color-stop(0.5,#e4e4e4));background:#1b1b1b -moz-linear-gradient(top,#fff,#e4e4e4);background-color:#fff;color:#000} +.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}.message p{margin:1em 0!important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#e0e8ec;background:#edf9ff url(../../../../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#efdcdc;background:#ffecec url(../../../../../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#eae9dc;background:#fffdef url(../../../../../common/img/msg.update.png) no-repeat 1em .5em} diff --git a/modules/member/m.skins/default/css/msignup.css b/modules/member/m.skins/default/css/msignup.css new file mode 100644 index 000000000..0f417c65d --- /dev/null +++ b/modules/member/m.skins/default/css/msignup.css @@ -0,0 +1,60 @@ +@charset "utf-8"; +/* Mobile XE (/modules/member/tpl/signup_form.html) */ +body{margin:0;background:#fff;color:#000;word-wrap:break-word} +body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif} +img{border:0} +em{font-style:normal} +form{margin:0;padding:0} +fieldset{margin:0;padding:0;border:0} +textarea{resize:vertical} +input[type=checkbox], +input[type=radio]{width:13px;height:13px;margin:0;padding:0} +/* Body */ +.bd{background:#f8f8f8;padding:1px 0} +/* Hx */ +.hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0} +.hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff} +.hx.h2{background:#e5e5e5;text-shadow:1px 1px 0 #fff} +.hx.h2 em{font-size:12px;color:#6352d2} +.hx.h3{background:#868686;color:#fff} +.hx.h3 em{font-size:12px} +.hx h2, .hx h3{margin:0 10px 0 0;display:inline} +.hx h2{font-size:16px;line-height:1.4} +.hx h3{font-size:14px} +.hx a{color:#000} +.hx .ex{font-size:12px} +.hx .tg{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:visible;border:0;cursor:pointer;opacity:0;background:none} +.hx .ca{font-size:12px;text-decoration:underline;color:#333} +.hx .ca:after{content:"";display:inline-block;position:relative;left:4px;width:0;height:0;border:4px solid;border-color:transparent;border-left-color:#8d7de1;margin:0 -8px 0 0} +.hx .write{position:absolute;top:8px;right:10px;background-position:0 0;display:inline-block;width:28px;height:27px;font-size:0;overflow:hidden;text-indent:28px} +/* Form Field */ +.ff{margin:0;padding:10px 0} +.ff ul{margin:0 10px 10px 10px;padding:10px 0 0 0;list-style:none} +.ff li{margin:0 0 5px 0;padding:0} +.ff li p{color:#666} +.ff li>label:first-child{display:block;font-weight:bold} +.ff label+input[type=text], +.ff label+input[type=password], +.ff label+textarea, +.ff label+select, +.ff label+select+input[type=text], +.ff .inputText{display:block;width:96%;font-size:14px;margin:0 0 5px 0} +.ff label+input[type=text], +.ff label+input[type=password], +.ff label+textarea, +.ff label+select+input[type=text], +.ff .inputText, +.ff .tel input[type=text]{padding:5px} +.ff .krZip input[type=text]{width:77%;font-size:14px;margin:0 0 5px 0;padding:5px} +/* Button Area */ +.bna{text-align:center;padding:0 10px;margin:10px 0} +.bna:after{content:"";display:block;clear:both} +.bn{display:inline-block;line-height:26px !important;padding:0 10px;font-size:12px;font-weight:bold;border:1px solid;text-decoration:none;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;cursor:pointer;vertical-align:middle} +.bn[type=submit], +.bn[type=button]{height:28px} +.bn[href]{height:26px} +.bn.dark{border-color:#666;background:#777 -webkit-gradient(linear,0% 0%,0% 100%,from(#7e7c78),to(#5c5b58));background:#777 -moz-linear-gradient(top,#7e7c78,#5c5b58);background-color:#777;color:#fff;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset} +.bn.white{border-color:#b5b5b5;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#f6f6f6),color-stop(0.5,#f0f0f0),color-stop(0.5,#e4e4e4));background:#1b1b1b -moz-linear-gradient(top,#fff,#e4e4e4);background-color:#fff;color:#000} +.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}.message p{margin:1em 0!important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#e0e8ec;background:#edf9ff url(../../../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#efdcdc;background:#ffecec url(../../../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#eae9dc;background:#fffdef url(../../../../common/img/msg.update.png) no-repeat 1em .5em} +.agreement .text{height:200px;overflow-y:auto;} +.bn a{text-decoration:none;} diff --git a/modules/member/tpl/find_member_account.html b/modules/member/m.skins/default/find_member_account.html similarity index 91% rename from modules/member/tpl/find_member_account.html rename to modules/member/m.skins/default/find_member_account.html index 4268b11ca..8150c436c 100644 --- a/modules/member/tpl/find_member_account.html +++ b/modules/member/m.skins/default/find_member_account.html @@ -1,5 +1,5 @@ - - + +

        {$XE_VALIDATOR_MESSAGE}

        diff --git a/modules/member/tpl/find_temp_password.html b/modules/member/m.skins/default/find_temp_password.html similarity index 100% rename from modules/member/tpl/find_temp_password.html rename to modules/member/m.skins/default/find_temp_password.html diff --git a/modules/member/m.skins/default/leave_form.html b/modules/member/m.skins/default/leave_form.html new file mode 100644 index 000000000..d4e6c4e75 --- /dev/null +++ b/modules/member/m.skins/default/leave_form.html @@ -0,0 +1,27 @@ + + + +

        {$member_title = $lang->msg_leave_member}

        +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        + + + + + + +
          +
        • + +

          {$formValue}

          +
        • +
        • + + +
        • +
        +
        + +
        + diff --git a/modules/member/m.skins/default/login_form.html b/modules/member/m.skins/default/login_form.html new file mode 100644 index 000000000..735500a86 --- /dev/null +++ b/modules/member/m.skins/default/login_form.html @@ -0,0 +1,44 @@ + + +
        +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        +

        {$lang->cmd_login}

        +
        +
        + + + +
          +
        • +
        • +
        + +
        +
        +
        +
        + +
        +
        + + diff --git a/modules/member/m.skins/default/member_info.html b/modules/member/m.skins/default/member_info.html new file mode 100644 index 000000000..a261fb0a1 --- /dev/null +++ b/modules/member/m.skins/default/member_info.html @@ -0,0 +1,28 @@ + +
        +
        +

        {$lang->member_info}

        +
        +
        +
        + +
        {$item->title} *
        +
        {$item->value}
        +
        +
        {$lang->member_group}
        +
        {implode(', ', $memberInfo['group_list'])}
        +
        {$lang->signup_date}
        +
        {zdate($memberInfo[regdate],"Y-m-d")}
        + +
        {$lang->last_login}
        +
        {zdate($memberInfo[last_login],"Y-m-d")}
        +
        +
        + +
        +
        diff --git a/modules/member/m.skins/default/modify_email_address.html b/modules/member/m.skins/default/modify_email_address.html new file mode 100644 index 000000000..09e963dbc --- /dev/null +++ b/modules/member/m.skins/default/modify_email_address.html @@ -0,0 +1,22 @@ + + + +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        + + + +

        {$lang->cmd_modify_member_email_address}

        +

        {$lang->about_modify_member_email_address}

        +
          +
        • + + +
        • +
        +
        + +
        +
        diff --git a/modules/member/m.skins/default/modify_info.html b/modules/member/m.skins/default/modify_info.html new file mode 100644 index 000000000..3c324cb04 --- /dev/null +++ b/modules/member/m.skins/default/modify_info.html @@ -0,0 +1,48 @@ +{@ Context::loadFile(array("./common/js/jquery.js", 'head', '', -100000), true) } +{@ Context::loadFile(array("./common/js/js_app.js", 'head', '', -100000), true) } +{@ Context::loadFile(array("./common/js/common.js", 'head', '', -100000), true) } +{@ Context::loadFile(array("./common/js/xml_handler.js", 'head', '', -100000), true) } +{@ Context::loadFile(array("./common/js/xml_js_filter.js", 'head', '', -100000), true) } + + + + + + +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        +

        {$lang->msg_update_member}

        +
        + + + + + +
        +
          +
        • + + + +
        • +
        • + +
          {$formTag->inputTag}
          + + +
        • +
        • allow_mailing!='N')-->checked="checked" />

          {$lang->about_allow_mailing}

        • +
        +
        + +
        +
        diff --git a/modules/member/m.skins/default/modify_password.html b/modules/member/m.skins/default/modify_password.html new file mode 100644 index 000000000..c460adf45 --- /dev/null +++ b/modules/member/m.skins/default/modify_password.html @@ -0,0 +1,32 @@ + + + +

        {$member_title = $lang->cmd_modify_member_password}

        +
        + + + + + +
          +
        • + + +
        • +
        • + + +
        • +
        • + + {$lang->about_password} +
        • +
        • + + +
        • +
        +
        + +
        +
        diff --git a/modules/member/m.skins/default/rechecked_password.html b/modules/member/m.skins/default/rechecked_password.html new file mode 100644 index 000000000..218d8a53d --- /dev/null +++ b/modules/member/m.skins/default/rechecked_password.html @@ -0,0 +1,24 @@ + +

        {$lang->msg_rechecked_password}

        +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        + + +
          +
        • + +

          {$identifierValue}

          +
        • +
        • + + +

          {$lang->about_rechecked_password}

          +
        • +
        + +
        diff --git a/modules/member/m.skins/default/signup_form.html b/modules/member/m.skins/default/signup_form.html new file mode 100644 index 000000000..0f43d777c --- /dev/null +++ b/modules/member/m.skins/default/signup_form.html @@ -0,0 +1,60 @@ + + + + +
        +
        +

        {$lang->cmd_signup}

        +
        +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        + + + +
        +
        + {$member_config->agreement} +
        +
        + + +
        +
        + +
          +
        • + + +
        • +
        • + + +
        • +
        • + + +
        • +
        • + +
          {$formTag->inputTag}
          + +
        • +
        • + + + +
        • +
        • + + + + +
        • +
        +
        + +
        +
        +
        diff --git a/modules/member/m.skins/default/skin.xml b/modules/member/m.skins/default/skin.xml new file mode 100644 index 000000000..5f0acf38e --- /dev/null +++ b/modules/member/m.skins/default/skin.xml @@ -0,0 +1,19 @@ + + + 회원 기본 모바일 스킨 + XE Basic Member Mobile Skin + + XE 기본 모바일 스킨 입니다. + NHN (developers@xpressengine.com) + + 0.1 + 2012-09-21 + + + NHN + NHN + NHN + NHN + + + diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index d6cb31756..8c1d145cb 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -26,7 +26,7 @@ $config = $oMemberModel->getMemberConfig (); $getVars = array(); if ($config->signupForm){ - foreach($config->signupForm as $formInfo){ + foreach($config->signupForm as $formInfo) { if($formInfo->isDefaultForm && ($formInfo->isUse || $formInfo->required || $formInfo->mustRequired)){ $getVars[] = $formInfo->name; } @@ -138,6 +138,7 @@ 'webmaster_email', 'limit_day', 'change_password_date', + 'enable_login_fail_report', 'max_error_count','max_error_count_time', 'agreement', 'after_login_url', @@ -146,6 +147,8 @@ 'layout_srl', 'skin', 'colorset', + 'mlayout_srl', + 'mskin', 'profile_image', 'profile_image_max_width', 'profile_image_max_height', 'image_name', 'image_name_max_width', 'image_name_max_height', 'image_mark', 'image_mark_max_width', 'image_mark_max_height', @@ -160,91 +163,91 @@ $oMemberModel = &getModel('member'); // default setting start - if($input_args->enable_join != 'Y'){ - $args->enable_join = 'N'; - }else{ - $args = $input_args; - $args->enable_join = 'Y'; - if($args->enable_confirm !='Y') $args->enable_confirm = 'N'; - $args->limit_day = (int)$args->limit_day; - if(!$args->change_password_date) $args->change_password_date = 0; - if(!trim(strip_tags($args->agreement))) - { - $agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt'; - FileHandler::removeFile($agreement_file); - $args->agreement = null; - } - if(!trim(strip_tags($args->after_login_url))) $args->after_login_url = null; - if(!trim(strip_tags($args->after_logout_url))) $args->after_logout_url = null; - if(!trim(strip_tags($args->redirect_url))) $args->redirect_url = null; - - if(!$args->skin) $args->skin = "default"; - if(!$args->colorset) $args->colorset = "white"; - - $args->profile_image = $args->profile_image?'Y':'N'; - $args->image_name = $args->image_name?'Y':'N'; - $args->image_mark = $args->image_mark?'Y':'N'; - if($args->signature!='Y') $args->signature = 'N'; - $args->identifier = $all_args->identifier; - - // set default - $all_args->is_nick_name_public = 'Y'; - $all_args->is_find_account_question_public = 'N'; - - // signupForm - global $lang; - $signupForm = array(); - $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark', 'profile_image_max_width', 'profile_image_max_height', 'image_name_max_width', 'image_name_max_height', 'image_mark_max_width', 'image_mark_max_height'); - $mustRequireds = array('email_address', 'nick_name', 'password', 'find_account_question'); - $extendItems = $oMemberModel->getJoinFormList(); - foreach($list_order as $key){ - unset($signupItem); - $signupItem->isIdentifier = ($key == $all_args->identifier); - $signupItem->isDefaultForm = in_array($key, $items); - - $signupItem->name = $key; - if(!in_array($key, $items)) $signupItem->title = $key; - else $signupItem->title = $lang->{$key}; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->imageType = (strpos($key, 'image') !== false); - $signupItem->required = ($all_args->{$key} == 'required') || $signupItem->mustRequired || $signupItem->isIdentifier; - $signupItem->isUse = in_array($key, $usable_list) || $signupItem->required; - - $signupItem->isPublic = ($all_args->{'is_'.$key.'_public'} == 'Y' && $signupItem->isUse) ? 'Y' : 'N'; - - if ($signupItem->imageType){ - $signupItem->max_width = $all_args->{$key.'_max_width'}; - $signupItem->max_height = $all_args->{$key.'_max_height'}; - } - - // set extends form - if (!$signupItem->isDefaultForm){ - $extendItem = $extendItems[$all_args->{$key.'_member_join_form_srl'}]; - $signupItem->type = $extendItem->column_type; - $signupItem->member_join_form_srl = $extendItem->member_join_form_srl; - $signupItem->title = $extendItem->column_title; - $signupItem->description = $extendItem->description; - - // check usable value change, required/option - if ($signupItem->isUse != ($extendItem->is_active == 'Y') || $signupItem->required != ($extendItem->required == 'Y')){ - unset($update_args); - $update_args->member_join_form_srl = $extendItem->member_join_form_srl; - $update_args->is_active = $signupItem->isUse?'Y':'N'; - $update_args->required = $signupItem->required?'Y':'N'; - - $update_output = executeQuery('member.updateJoinForm', $update_args); - } - unset($extendItem); - } - $signupForm[] = $signupItem; - } - $args->signupForm = $signupForm; - - // create Ruleset - $this->_createSignupRuleset($signupForm, $args->agreement); - $this->_createLoginRuleset($args->identifier); - $this->_createFindAccountByQuestion($args->identifier); + $args = $input_args; + $args->enable_join = $args->enable_join != 'N' ? 'Y' : 'N'; + if($args->enable_confirm !='Y') $args->enable_confirm = 'N'; + $args->limit_day = (int)$args->limit_day; + if(!$args->change_password_date) $args->change_password_date = 0; + if(!trim(strip_tags($args->agreement))) + { + $agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt'; + FileHandler::removeFile($agreement_file); + $args->agreement = null; } + if(!trim(strip_tags($args->after_login_url))) $args->after_login_url = null; + if(!trim(strip_tags($args->after_logout_url))) $args->after_logout_url = null; + if(!trim(strip_tags($args->redirect_url))) $args->redirect_url = null; + + if(!$args->skin) $args->skin = 'default'; + if(!$args->colorset) $args->colorset = 'white'; + + if(!$args->mskin) $args->mskin = 'default'; + + $args->profile_image = $args->profile_image?'Y':'N'; + $args->image_name = $args->image_name?'Y':'N'; + $args->image_mark = $args->image_mark?'Y':'N'; + if($args->signature!='Y') $args->signature = 'N'; + $args->identifier = $all_args->identifier; + $args->layout_srl = $args->layout_srl ? $args->layout_srl : null; + $args->mlayout_srl = $args->mlayout_srl ? $args->mlayout_srl : null; + + // set default + $all_args->is_nick_name_public = 'Y'; + $all_args->is_find_account_question_public = 'N'; + + // signupForm + global $lang; + $signupForm = array(); + $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark', 'profile_image_max_width', 'profile_image_max_height', 'image_name_max_width', 'image_name_max_height', 'image_mark_max_width', 'image_mark_max_height'); + $mustRequireds = array('email_address', 'nick_name', 'password', 'find_account_question'); + $extendItems = $oMemberModel->getJoinFormList(); + foreach($list_order as $key){ + unset($signupItem); + $signupItem->isIdentifier = ($key == $all_args->identifier); + $signupItem->isDefaultForm = in_array($key, $items); + + $signupItem->name = $key; + if(!in_array($key, $items)) $signupItem->title = $key; + else $signupItem->title = $lang->{$key}; + $signupItem->mustRequired = in_array($key, $mustRequireds); + $signupItem->imageType = (strpos($key, 'image') !== false); + $signupItem->required = ($all_args->{$key} == 'required') || $signupItem->mustRequired || $signupItem->isIdentifier; + $signupItem->isUse = in_array($key, $usable_list) || $signupItem->required; + + $signupItem->isPublic = ($all_args->{'is_'.$key.'_public'} == 'Y' && $signupItem->isUse) ? 'Y' : 'N'; + + if ($signupItem->imageType){ + $signupItem->max_width = $all_args->{$key.'_max_width'}; + $signupItem->max_height = $all_args->{$key.'_max_height'}; + } + + // set extends form + if (!$signupItem->isDefaultForm){ + $extendItem = $extendItems[$all_args->{$key.'_member_join_form_srl'}]; + $signupItem->type = $extendItem->column_type; + $signupItem->member_join_form_srl = $extendItem->member_join_form_srl; + $signupItem->title = $extendItem->column_title; + $signupItem->description = $extendItem->description; + + // check usable value change, required/option + if ($signupItem->isUse != ($extendItem->is_active == 'Y') || $signupItem->required != ($extendItem->required == 'Y')){ + unset($update_args); + $update_args->member_join_form_srl = $extendItem->member_join_form_srl; + $update_args->is_active = $signupItem->isUse?'Y':'N'; + $update_args->required = $signupItem->required?'Y':'N'; + + $update_output = executeQuery('member.updateJoinForm', $update_args); + } + unset($extendItem); + } + $signupForm[] = $signupItem; + } + $args->signupForm = $signupForm; + + // create Ruleset + $this->_createSignupRuleset($signupForm, $args->agreement); + $this->_createLoginRuleset($args->identifier); + $this->_createFindAccountByQuestion($args->identifier); // check agreement value exist if($args->agreement) @@ -493,7 +496,8 @@ * Add a join form * @return void|Object (void : success, Object : fail) **/ - function procMemberAdminInsertJoinForm() { + function procMemberAdminInsertJoinForm() + { $args->member_join_form_srl = Context::get('member_join_form_srl'); $args->column_type = Context::get('column_type'); @@ -503,13 +507,25 @@ $args->required = Context::get('required'); $args->is_active = (isset($args->required)); if(!in_array(strtoupper($args->required), array('Y','N')))$args->required = 'N'; - $args->description = Context::get('description'); + $args->description = Context::get('description') ? Context::get('description') : ''; // Default values if(in_array($args->column_type, array('checkbox','select','radio')) && count($args->default_value) ) { $args->default_value = serialize($args->default_value); } else { $args->default_value = ''; } + + // Check ID duplicated + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + foreach($config->signupForm as $item) + { + if($item->name == $args->column_name) + { + if($args->member_join_form_srl && $args->member_join_form_srl == $item->member_join_form_srl) continue; + return new Object(-1,'msg_exists_user_id'); + } + } // Fix if member_join_form_srl exists. Add if not exists. $isInsert; if(!$args->member_join_form_srl){ @@ -534,6 +550,7 @@ $oMemberModel = &getModel('member'); $config = $oMemberModel->getMemberConfig(); + unset($config->agreement); if($isInsert){ $config->signupForm[] = $signupItem; @@ -563,6 +580,7 @@ $oMemberModel = &getModel('member'); $config = $oMemberModel->getMemberConfig(); + unset($config->agreement); foreach($config->signupForm as $key=>$val){ if ($val->member_join_form_srl == $member_join_form_srl){ @@ -940,6 +958,7 @@ // group image mark option $config = $oMemberModel->getMemberConfig(); $config->group_image_mark = $vars->group_image_mark; + unset($config->agreement); $output = $oModuleController->updateModuleConfig('member', $config); // group data save diff --git a/modules/member/member.admin.model.php b/modules/member/member.admin.model.php index 64012361c..b31f6756e 100644 --- a/modules/member/member.admin.model.php +++ b/modules/member/member.admin.model.php @@ -245,6 +245,16 @@ Context::set('formInfo', $output->data); } + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + foreach($config->signupForm as $item) + { + $list[] = $item->name; + } + + $id_list = implode(',',$list); + Context::set('id_list',$id_list); + $oTemplate = &TemplateHandler::getInstance(); $tpl = $oTemplate->compile($this->module_path.'tpl', 'insert_join_form'); diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 4bfdad8b4..02b134ee8 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -115,10 +115,18 @@ Context::set('layout_list', $layout_list); + $mlayout_list = $oLayoutModel->getLayoutList(0, 'M'); + + Context::set('mlayout_list', $mlayout_list); + // list of skins for member module $skin_list = $oModuleModel->getSkins($this->module_path); Context::set('skin_list', $skin_list); + // list of skins for member module + $mskin_list = $oModuleModel->getSkins($this->module_path, 'm.skins'); + Context::set('mskin_list', $mskin_list); + // retrieve skins of editor $oEditorModel = &getModel('editor'); Context::set('editor_skin_list', $oEditorModel->getEditorSkinList()); @@ -269,6 +277,7 @@ if($formInfo->isDefaultForm){ if($formInfo->imageType){ + $formTag->type = 'image'; if($formInfo->name == 'profile_image'){ $target = $memberInfo['profile_image']; $functionName = 'doDeleteProfileImage'; @@ -300,12 +309,14 @@ ,$member_config->{$formInfo->name.'_max_height'}); }//end imageType elseif($formInfo->name == 'birthday'){ + $formTag->type = 'date'; $inputTag = sprintf(' ' ,$memberInfo['birthday'] ,zdate($memberInfo['birthday'], 'Y-m-d', false) ,$lang->cmd_delete); }elseif($formInfo->name == 'find_account_question'){ - $inputTag = ''; + $formTag->type = 'select'; + $inputTag = ''; $optionTag = array(); foreach($lang->find_account_question_items as $key=>$val){ if($key == $memberInfo['find_account_question']) $selected = 'selected="selected"'; @@ -316,9 +327,11 @@ ,$val); } $inputTag = sprintf($inputTag, implode('', $optionTag)); - $inputTag .= ''; + $inputTag .= ''; }else{ - $inputTag = sprintf('' + $formTag->type = 'text'; + $inputTag = sprintf('' + ,$formInfo->name ,$formInfo->name ,$memberInfo[$formInfo->name]); } @@ -329,8 +342,9 @@ 'value' => $extendForm->value); $extentionReplace = array(); + $formTag->type = $extendForm->column_type; if($extendForm->column_type == 'text' || $extendForm->column_type == 'homepage' || $extendForm->column_type == 'email_address'){ - $template = ''; + $template = ''; }elseif($extendForm->column_type == 'tel'){ $extentionReplace = array('tel_0' => $extendForm->value[0], 'tel_1' => $extendForm->value[1], @@ -362,7 +376,7 @@ $template = sprintf($template, implode('', $optionTag)); } }elseif($extendForm->column_type == 'select'){ - $template = ''; + $template = ''; $optionTag = array(); if($extendForm->default_value){ foreach($extendForm->default_value as $v){ @@ -404,7 +418,7 @@ EOD; }elseif($extendForm->column_type == 'jp_zip'){ - $template = ''; + $template = ''; }elseif($extendForm->column_type == 'date'){ $extentionReplace = array('date' => zdate($extendForm->value, 'Y-m-d'), 'cmd_delete' => $lang->cmd_delete); diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 537750851..8c3d9c4de 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -355,19 +355,20 @@ function recordLoginError($error = 0, $message = 'success') { if($error == 0) return new Object($error, $message); + + // Create a member model object + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + // Check if there is recoding table. $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('member_login_count')) return new Object($error, $message); - + if(!$oDB->isTableExists('member_login_count') || $config->enable_login_fail_report == 'N') return new Object($error, $message); $args->ipaddress = $_SERVER['REMOTE_ADDR']; $output = executeQuery('member.getLoginCountByIp', $args); if($output->data && $output->data->count) { - // Create a member model object - $oMemberModel = &getModel('member'); - $config = $oMemberModel->getMemberConfig(); $last_update = strtotime($output->data->last_update); $term = intval(time()-$last_update); //update, if IP address access in a short time, update count. If not, make count 1. @@ -398,10 +399,14 @@ function recordMemberLoginError($error = 0, $message = 'success', $args = NULL) { if($error == 0 || !$args->member_srl) return new Object($error, $message); + + // Create a member model object + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + // Check if there is recoding table. $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('member_count_history')) return new Object($error, $message); - + if(!$oDB->isTableExists('member_count_history') || $config->enable_login_fail_report == 'N') return new Object($error, $message); $output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args); if($output->data && $output->data->content) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 355a4bf93..f0158e692 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -388,7 +388,7 @@ $memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList); $this->memberInfo->password = $memberInfo->password; } - // Verify the cuttent password + // Verify the current password if(!$oMemberModel->isValidPassword($this->memberInfo->password, $password)) { return new Object(-1, 'invalid_password'); @@ -396,7 +396,7 @@ $_SESSION['rechecked_password_step'] = 'VALIDATE_PASSWORD'; - $redirectUrl = getUrl('', 'act', 'dispMemberModifyInfo'); + $redirectUrl = getNotEncodedUrl('', 'act', 'dispMemberModifyInfo'); $this->setRedirectUrl($redirectUrl); } @@ -436,6 +436,7 @@ // Login Information $logged_info = Context::get('logged_info'); $args->member_srl = $logged_info->member_srl; + $args->birthday = strtr($args->birthday, array('-'=>'', '/'=>'', '.'=>'', ' '=>'')); // Remove some unnecessary variables from all the vars $all_args = Context::getRequestVars(); unset($all_args->module); @@ -1020,7 +1021,7 @@ } // Get content of the email to send a member Context::set('auth_args', $auth_args); - Context::set('member_info', $member_info); + Context::set('memberInfo', $member_info); $oModuleModel = &getModel('module'); $member_config = $oModuleModel->getModuleConfig('member'); @@ -1081,7 +1082,7 @@ if(!$output->data || !$output->data[0]->auth_key) return new Object(-1, 'msg_invalid_request'); $auth_info = $output->data[0]; // Get content of the email to send a member - Context::set('member_info', $memberInfo); + Context::set('memberInfo', $memberInfo); $oModuleModel = &getModel('module'); $member_config = $oModuleModel->getModuleConfig('member'); if(!$member_config->skin) $member_config->skin = "default"; @@ -1555,37 +1556,45 @@ // Update the latest login time $args->member_srl = $this->memberInfo->member_srl; $output = executeQuery('member.updateLastLogin', $args); - // check if there is login fail records. - $output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args); - if($output->data && $output->data->content) - { - $title = Context::getLang('login_fail_report'); - $message = '
          '; - $content = unserialize($output->data->content); - foreach($content as $val) - { - $message .= '
        • '.date('Y-m-d H:i:s P',$val[2]).'
          Access IP: '.$val[0].'
          Message: '.$val[1].'
        • '; - } - $message .= '
        '; - $content = sprintf(Context::getLang('login_fail_report_contents'),$message,date('Y-m-d H:i:s P')); - //send message - $oCommunicationController = &getController('communication'); - $oCommunicationController->sendMessage($args->member_srl, $args->member_srl, $title, $content, true); - - if($this->memberInfo->email_address && $this->memberInfo->allow_mailing == 'Y') + // Check if there is recoding table. + $oDB = &DB::getInstance(); + if($oDB->isTableExists('member_count_history') && $config->enable_login_fail_report != 'N') + { + // check if there is login fail records. + $output = executeQuery('member.getLoginCountHistoryByMemberSrl', $args); + if($output->data && $output->data->content) { - $view_url = Context::getRequestUri(); - $title = sprintf("%s @ %s",$title,$view_url); - $content = sprintf("%s

        From: %s
        To: %s(%s)

        ",$content, $view_url, $view_url, $this->memberInfo->nick_name, $this->memberInfo->email_id); - $oMail = new Mail(); - $oMail->setTitle($title); - $oMail->setContent($content); - $oMail->setSender($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address); - $oMail->setReceiptor($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address); - $oMail->send(); + $title = Context::getLang('login_fail_report'); + $message = '
          '; + $content = unserialize($output->data->content); + if(count($content) > $config->max_error_count) + { + foreach($content as $val) + { + $message .= '
        • '.date('Y-m-d H:i:s P',$val[2]).'
          Access IP: '.$val[0].'
          Message: '.$val[1].'
        • '; + } + $message .= '
        '; + $content = sprintf(Context::getLang('login_fail_report_contents'),$message,date('Y-m-d H:i:s P')); + + //send message + $oCommunicationController = &getController('communication'); + $oCommunicationController->sendMessage($args->member_srl, $args->member_srl, $title, $content, true); + + if($this->memberInfo->email_address && $this->memberInfo->allow_mailing == 'Y') + { + $view_url = Context::getRequestUri(); + $content = sprintf("%s

        From: %s
        To: %s(%s)

        ",$content, $view_url, $view_url, $this->memberInfo->nick_name, $this->memberInfo->email_id); + $oMail = new Mail(); + $oMail->setTitle($title); + $oMail->setContent($content); + $oMail->setSender($config->webmaster_name?$config->webmaster_name:'webmaster', $config->webmaster_email); + $oMail->setReceiptor($this->memberInfo->email_id.'('.$this->memberInfo->nick_name.')', $this->memberInfo->email_address); + $oMail->send(); + } + $output = executeQuery('member.deleteLoginCountHistoryByMemberSrl', $args); + } } - $output = executeQuery('member.deleteLoginCountHistoryByMemberSrl', $args); } // Call a trigger after successfully log-in (after) $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $this->memberInfo); @@ -2047,6 +2056,10 @@ **/ function destroySessionInfo() { if(!$_SESSION || !is_array($_SESSION)) return; + + $memberInfo = Context::get('logged_info'); + $memberSrl = $memberInfo->member_srl; + foreach($_SESSION as $key => $val) { $_SESSION[$key] = ''; } @@ -2054,10 +2067,11 @@ setcookie(session_name(), '', time()-42000, '/'); setcookie('sso','',time()-42000, '/'); - if($_COOKIE['xeak']) { - $args->autologin_key = $_COOKIE['xeak']; - executeQuery('member.deleteAutologin', $args); - } + if($memberSrl) + { + $args->member_srl = $memberSrl; + $output = executeQuery('member.deleteAutologin', $args); + } } function _updatePointByGroup($memberSrl, $groupSrlList) diff --git a/modules/member/member.mobile.php b/modules/member/member.mobile.php index dfaedab05..e32974a09 100644 --- a/modules/member/member.mobile.php +++ b/modules/member/member.mobile.php @@ -1,223 +1,67 @@ member_config = $oModuleModel->getModuleConfig('member'); + function init() + { + // Get the member configuration + $oMemberModel = &getModel('member'); + $this->member_config = $oMemberModel->getMemberConfig(); + Context::set('member_config', $this->member_config); + + $mskin = $this->member_config->mskin; + // Set the template path + if(!$mskin) + { + $mskin = 'default'; + $template_path = sprintf('%sm.skins/%s', $this->module_path, $mskin); + } + else + { + $template_path = sprintf('%sm.skins/%s', $this->module_path, $mskin); + } // if member_srl exists, set memberInfo $member_srl = Context::get('member_srl'); - if($member_srl) { + if($member_srl) + { $oMemberModel = &getModel('member'); $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$this->memberInfo) Context::set('member_srl',''); - else Context::set('member_info',$this->memberInfo); + if(!$this->memberInfo) + { + Context::set('member_srl',''); + } + else + { + Context::set('member_info',$this->memberInfo); + } } - - Context::set('member_config', $this->member_config); - $this->setTemplatePath($this->module_path.'tpl'); - } + $this->setTemplatePath($template_path); - function dispMemberLoginForm() { - if(Context::get('is_logged')) { - Context::set('redirect_url', getUrl('act','')); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('redirect.html'); - return; - } - - // get member module configuration. - $oMemberModel = &getModel('member'); - $config = $oMemberModel->getMemberConfig(); - Context::set('identifier', $config->identifier); - - // Set a template file - Context::set('referer_url', htmlspecialchars($_SERVER['HTTP_REFERER'])); - $this->setTemplateFile('login_form'); - } - - function dispMemberSignUpForm(){ - $oMemberModel = &getModel('member'); - - if($oMemberModel->isLogged()) return $this->stop('msg_already_logged'); - - $trigger_output = ModuleHandler::triggerCall('member.dispMemberSignUpForm', 'before', $this->member_config); - if(!$trigger_output->toBool()) return $trigger_output; - - if ($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); - $oMemberAdminView = &getAdminView('member'); - $formTags = $oMemberAdminView->_getMemberInputTag($member_info); - Context::set('formTags', $formTags); - - $member_config = $oMemberModel->getMemberConfig(); - Context::set('member_config', $member_config); - - global $lang; - $identifierForm->title = $lang->{$member_config->identifier}; - $identifierForm->name = $member_config->identifier; - $identifierForm->value = $member_info->{$member_config->identifier}; - Context::set('identifierForm', $identifierForm); - // Set a template file - $this->setTemplateFile('signup_form'); - } - - function dispMemberInfo() { - $oMemberModel = &getModel('member'); - $logged_info = Context::get('logged_info'); - - // Don't display member info to non-logged user - if(!$logged_info->member_srl) return $this->stop('msg_not_permitted'); - $member_srl = Context::get('member_srl'); - if(!$member_srl && Context::get('is_logged')) { - $member_srl = $logged_info->member_srl; - } elseif(!$member_srl) { - return $this->dispMemberSignUpForm(); - } - - $site_module_info = Context::get('site_module_info'); - if(!$this->memberInfo) + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->member_config->mlayout_srl); + if($layout_info) { - $columnList = array('user_name', 'nick_name', 'homepage', 'blog', 'birthday', 'regdate', 'last_login'); - $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl, $site_module_info->site_srl, $columnList); + $this->module_info->mlayout_srl = $this->member_config->mlayout_srl; + $this->setLayoutPath($layout_info->path); } - unset($this->memberInfo->password); - unset($this->memberInfo->email_id); - unset($this->memberInfo->email_host); - unset($this->memberInfo->email_address); - - if(!$this->memberInfo->member_srl) return $this->dispMemberSignUpForm(); - - Context::set('member_info', $this->memberInfo); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->memberInfo)); - $this->setTemplateFile('member_info_mobile'); - } + } - /** - * @brief Find user ID and password - **/ - function dispMemberFindAccount() { - if(Context::get('is_logged')) return $this->stop('already_logged'); - - $oMemberModel = &getModel('member'); - $config = $oMemberModel->getMemberConfig(); - Context::set('identifier', $config->identifier); - - $this->setTemplateFile('find_member_account'); + function dispMemberModifyInfo() + { + parent::dispMemberModifyInfo(); + + if($this->member_info) + { + Context::set('oMemberInfo', get_object_vars($this->member_info)); } - - /** - * @brief Generate a temporary password - **/ - function dispMemberGetTempPassword() { - if(Context::get('is_logged')) return $this->stop('already_logged'); - - $oMemberModel = &getModel('member'); - $config = $oMemberModel->getMemberConfig(); - Context::set('identifier', $config->identifier); - - $user_id = Context::get('user_id'); - $temp_password = $_SESSION['xe_temp_password_'.$user_id]; - unset($_SESSION['xe_temp_password_'.$user_id]); - - if(!$user_id||!$temp_password) return new Object(-1,'msg_invaild_request'); - Context::set('temp_password', $temp_password); - - $this->setTemplateFile('find_temp_password'); - } - - /** - * @brief Edit member profile - **/ - function dispMemberModifyInfo() { - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - $memberModuleConfig = $oModuleModel->getModuleConfig('member'); - - // A message appears if the user is not logged-in - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - if(!$this->memberInfo) $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - $this->memberInfo->signature = $oMemberModel->getSignature($member_srl); - Context::set('member_info',$this->memberInfo); - - // Receive a member join form - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->memberInfo)); - - // Call getEditor of the editor module and set it for signiture - if($this->memberInfo->member_srl) { - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'member_srl'; - $option->content_key_name = 'signature'; - $option->allow_fileupload = false; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = false; - $option->resizable = false; - $option->disable_html = true; - $option->height = 200; - $option->skin = $this->member_config->editor_skin; - $option->colorset = $this->member_config->editor_colorset; - $editor = $oEditorModel->getEditor($this->memberInfo->member_srl, $option); - Context::set('editor', $editor); - } - - // Set a template file - $this->setTemplateFile('modify_info'); - } - - /** - * @brief Change the user password - **/ - function dispMemberModifyPassword() { - $oMemberModel = &getModel('member'); - - // A message appears if the user is not logged-in - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $config = $oMemberModel->getMemberConfig(); - Context::set('identifier', $config->identifier); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - if(!$this->memberInfo) { - $columnList = array('member_srl', 'user_id'); - $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList); - } - Context::set('member_info',$this->memberInfo); - - // Set a template file - $this->setTemplateFile('modify_password'); - } - - /** - * @brief Member withdrawl - **/ - function dispMemberLeave() { - $oMemberModel = &getModel('member'); - - // A message appears if the user is not logged-in - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - if(!$this->memberInfo) { - $columnList = array('member_srl', 'user_id'); - $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList); - } - Context::set('member_info',$this->memberInfo); - - // Set a template file - $this->setTemplateFile('leave_form'); - } + } } ?> diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 7c9b484e0..7b85da6b3 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -38,7 +38,7 @@ { foreach($config->signupForm AS $key=>$value) { - $config->signupForm[$key]->title = Context::getLang($value->title); + $config->signupForm[$key]->title = ($value->isDefaultForm) ? Context::getLang($value->name) : $value->title; if($config->signupForm[$key]->isPublic != 'N') $config->signupForm[$key]->isPublic = 'Y'; if($value->name == 'find_account_question') $config->signupForm[$key]->isPublic = 'N'; } @@ -63,12 +63,6 @@ if (!$config->max_error_count) $config->max_error_count = 10; if (!$config->max_error_count_time) $config->max_error_count_time = 300; - if (!$config->layout_srl) - { - $oModuleModel = &getModel('module'); - $defaultModuleInfo = $oModuleModel->getDefaultMid(); - $config->layout_srl = $defaultModuleInfo->layout_srl; - } if (!$config->signature_editor_skin || $config->signature_editor_skin == 'default') $config->signature_editor_skin = 'xpresseditor'; if (!$config->sel_editor_colorset) $config->sel_editor_colorset = 'white'; diff --git a/modules/member/member.view.php b/modules/member/member.view.php index fff0970df..bf8386803 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -98,6 +98,7 @@ function _getDisplayedMemberInfo($memberInfo, $extendFormInfo, $memberConfig) { + $logged_info = Context::get('logged_info'); $displayDatas = array(); foreach($memberConfig->signupForm as $no=>$formInfo) { @@ -270,6 +271,7 @@ $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList); $member_info->signature = $oMemberModel->getSignature($member_srl); Context::set('member_info',$member_info); + // Get a list of extend join form Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); @@ -291,6 +293,8 @@ Context::set('editor', $editor); } + $this->member_info = $member_info; + $oMemberAdminView = &getAdminView('member'); $formTags = $oMemberAdminView->_getMemberInputTag($member_info); Context::set('formTags', $formTags); @@ -382,7 +386,7 @@ **/ function dispMemberLoginForm() { if(Context::get('is_logged')) { - Context::set('redirect_url', getUrl('act','')); + Context::set('redirect_url', getNotEncodedUrl('act','')); $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('redirect.html'); return; diff --git a/modules/member/queries/deleteAutologin.xml b/modules/member/queries/deleteAutologin.xml index 5919a4058..a26672edc 100644 --- a/modules/member/queries/deleteAutologin.xml +++ b/modules/member/queries/deleteAutologin.xml @@ -3,6 +3,7 @@ - + + diff --git a/modules/member/queries/getMemberInfoByEmailAddress.xml b/modules/member/queries/getMemberInfoByEmailAddress.xml index 14ab0f645..3f672c07e 100644 --- a/modules/member/queries/getMemberInfoByEmailAddress.xml +++ b/modules/member/queries/getMemberInfoByEmailAddress.xml @@ -6,6 +6,6 @@ - + diff --git a/modules/member/queries/getScrapDocument.xml b/modules/member/queries/getScrapDocument.xml index 8f965ec0f..097a0a9d7 100644 --- a/modules/member/queries/getScrapDocument.xml +++ b/modules/member/queries/getScrapDocument.xml @@ -3,7 +3,7 @@
        - + diff --git a/modules/member/skins/default/find_member_account.html b/modules/member/skins/default/find_member_account.html index 0b79c09f4..212305d4a 100644 --- a/modules/member/skins/default/find_member_account.html +++ b/modules/member/skins/default/find_member_account.html @@ -1,5 +1,8 @@ +
        +

        {$XE_VALIDATOR_MESSAGE}

        +

        {$lang->cmd_find_member_account_with_email}

        {$lang->about_find_member_account}

        diff --git a/modules/member/tpl/insert_join_form.html b/modules/member/tpl/insert_join_form.html index b1ea3abc6..fcad10e96 100644 --- a/modules/member/tpl/insert_join_form.html +++ b/modules/member/tpl/insert_join_form.html @@ -1,3 +1,5 @@ + +

        {$lang->cmd_input_extend_form}

          diff --git a/modules/member/tpl/js/member_admin_config.js b/modules/member/tpl/js/member_admin_config.js index 6c0c7ac19..16b067ee5 100644 --- a/modules/member/tpl/js/member_admin_config.js +++ b/modules/member/tpl/js/member_admin_config.js @@ -64,23 +64,6 @@ jQuery(function($){ // hide form if enable_join is setted "No" var suSetting = $('fieldset.suSetting'); // 회원가입 설정 var suForm = $('fieldset.suForm'); // 회원가입 양식 - var isEnable = suSetting.find(':radio[name=enable_join]:checked').val(); - if (isEnable == 'N'){ - suSetting.find('>ul>li:gt(0)').hide(); - suForm.hide(); - } - - suSetting.find(':radio[name=enable_join]').change(function(){ - if($('#enable_join_yes').is(':checked')){ - // 회원 가입을 허용하지 않는 경우 불필요한 항목을 모두 감춘다 - suSetting.find('>ul>li:gt(0)').slideDown(200); - suForm.slideDown(200); - } else { - // 회원 가입을 허용하는 경우 필요한 항목을 모두 펼친다 - suSetting.find('>ul>li:gt(0)').slideUp(200); - suForm.slideUp(200); - } - }); suForm.find(':checkbox[name="usable_list[]"]').each(function(){ var $i = $(this); $i.change(function(){ @@ -241,4 +224,17 @@ jQuery(function($){ resp = ['error','message'] // response tags ); }); + + $('#userDefine form').submit(function(e) { + var id_list = $(this).find('input[name=join_form_id_list]').val(); + var id_list_arr = id_list.split(','); + + var column_id = $(this).find('input[name=column_id]').val(); + var old_column_id = $(this).find('input[name=old_column_id]').val(); + if($.inArray(column_id, id_list_arr) > -1 && column_id != old_column_id) { + alert(xe.lang.msg_exists_user_id); + return false; + } + else return true; + }); }); diff --git a/modules/member/tpl/leave_form.html b/modules/member/tpl/leave_form.html deleted file mode 100644 index c98fabddc..000000000 --- a/modules/member/tpl/leave_form.html +++ /dev/null @@ -1,28 +0,0 @@ -{@ Context::loadFile(array("./common/js/jquery.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/js_app.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/common.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/xml_handler.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/xml_js_filter.js", 'head', '', -100000), true) } - - - - -
          -

          {$member_title = $lang->msg_leave_member}

          - - - - -
          -
            -
          • {$member_info->user_id}
          • -
          • -
          -
          - - - -
          diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index f6f72dcc5..5d9e83a44 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -6,6 +6,7 @@ xe.lang.cmd_delete = '{$lang->cmd_delete}'; xe.lang.msg_null_prohibited_id = '{$lang->msg_null_prohibited_id}'; xe.lang.msg_null_prohibited_nick_name = '{$lang->msg_null_prohibited_nick_name}'; + xe.lang.msg_exists_user_id= '{$lang->msg_exists_user_id}';

          {$XE_VALIDATOR_MESSAGE}

          @@ -54,6 +55,13 @@

          {$lang->unit_day}({$lang->about_change_password_date})

          +
        • +

          {$lang->enable_login_fail_report}

          +

          + + +

          +
        • {$lang->about_login_trial_limit1}

          @@ -85,9 +93,10 @@

          {$lang->about_redirect_url}

        • -

          +

          - +

          @@ -104,6 +113,23 @@

        • +
        • +

          +

          + +

          +
        • +
        • +

          +

          + +

          +
        • @@ -261,5 +287,6 @@
          +
          diff --git a/modules/member/tpl/modify_info_mobile.html b/modules/member/tpl/modify_info_mobile.html deleted file mode 100644 index a14e9da4c..000000000 --- a/modules/member/tpl/modify_info_mobile.html +++ /dev/null @@ -1,185 +0,0 @@ -{@ Context::loadFile(array("./common/js/jquery.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/js_app.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/common.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/xml_handler.js", 'head', '', -100000), true) } -{@ Context::loadFile(array("./common/js/xml_js_filter.js", 'head', '', -100000), true) } - - - - - - - - - - - - - - - - - - - -
          -

          {$lang->msg_update_member}

          -

          {$lang->member_default_info}

          -
          profile_image == 'Y' || $member_config->image_name=='Y' || $member_config->image_mark=='Y')-->enctype="multipart/form-data" target="tmp_upload_iframe"> - - - - - - -
          -
            -
          • {htmlspecialchars($member_info->user_id)}
          • -
          • {$lang->about_user_name}

          • -
          • {$lang->about_nick_name}

          • -
          • {$lang->about_email_address}

          • - -
          • - -
            - profile_image - -
            - - -

            {$lang->profile_image_max_width} : {$member_config->profile_image_max_width}px, {$lang->profile_image_max_height} : {$member_config->profile_image_max_height}px

            -
          • - - -
          • - -
            -
            image_name
            - -
            - - -

            {$lang->image_name_max_width} : {$member_config->image_name_max_width}px, {$lang->image_name_max_height} : {$member_config->image_name_max_height}px

            -
          • - - -
          • - -
            - image_mark - -
            - - - -

            {$lang->image_mark_max_width} : {$member_config->image_mark_max_width}px, {$lang->image_mark_max_height} : {$member_config->image_mark_max_height}px

            -
          • - -
          • {$lang->about_homepage}

          • -
          • {$lang->about_blog_url}

          • -
          • {$lang->about_birthday}

          • - -
          • allow_mailing!='N')-->checked="checked" />

            {$lang->about_allow_mailing}

          • - -
          • - -
          -
          - -

          {$lang->member_extend_info}

          -
          -
            - -
          • - - - - - - - - - - - - - - - - - - - - - - value)&&in_array($v, $val->value))-->checked="checked"/> - - - - - - value)&&in_array($v, $val->value))-->checked="checked"/> - - - - - - - - - - - - - - - - - - -

            {$val->description}

            - -
          • - -
          -
          - - - -
          diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 308bfa4d3..51013824a 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -606,16 +606,24 @@ //$info = $oModuleModel->getModuleInfoXml($moduleName); $info = $oModuleModel->getModuleActionXml($moduleName); - $url = getNotEncodedUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index); - if(empty($url)) $url = getNotEncodedUrl('', 'module', 'admin', 'act', $info->admin_index_act); - if(empty($url)) $url = getNotEncodedUrl('', 'module', 'admin'); + $url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index); + if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->admin_index_act); + if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin'); $dbInfo = Context::getDBInfo(); $args->menu_item_srl = (!$requestArgs->menu_item_srl) ? getNextSequence() : $requestArgs->menu_item_srl; $args->parent_srl = $requestArgs->parent_srl; $args->menu_srl = $requestArgs->menu_srl; $args->name = sprintf('{$lang->menu_gnb_sub[\'%s\']}', $menuName); - $args->url = str_replace($dbInfo->default_url, '', $url); + //if now page is https... + if(strpos($url, 'https') !== false) + { + $args->url = str_replace('https'.substr($dbInfo->default_url, 4), '', $url); + } + else + { + $args->url = str_replace($dbInfo->default_url, '', $url); + } $args->open_window = 'N'; $args->expand = 'N'; $args->normal_btn = ''; @@ -722,6 +730,7 @@ $xml_buff = sprintf( 'init(); '. @@ -743,6 +752,7 @@ $php_buff = sprintf( 'list = array(%s); '. diff --git a/modules/menu/menu.admin.view.php b/modules/menu/menu.admin.view.php index 4140ecb4d..72e2875f9 100644 --- a/modules/menu/menu.admin.view.php +++ b/modules/menu/menu.admin.view.php @@ -183,6 +183,20 @@ $layoutList = $oLayoutModel->getLayoutList(); Context::set('layout_list', $layoutList); + // choice theme file + $theme_file = _XE_PATH_.'files/theme/theme_info.php'; + if(is_readable($theme_file)) + { + @include($theme_file); + Context::set('current_layout', $theme_info->layout); + } + else + { + $oModuleModel = &getModel('module'); + $default_mid = $oModuleModel->getDefaultMid(); + Context::set('current_layout', $default_mid->layout_srl); + } + // get default group list $oMemberModel = &getModel('member'); $output = $oMemberModel->getGroups(); @@ -208,7 +222,7 @@ function _menuInfoSetting(&$menu) { $oModuleModel = &getModel('module'); - if(!preg_match('/^http/i', $menu['url'])) + if($menu['url'] && !preg_match('/^http/i', $menu['url'])) { unset($midInfo); unset($moduleInfo); diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index f727ef88e..b4ae216c8 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -62,7 +62,7 @@ $('form.siteMap') editForm.find('input[name=menu_srl]').val(menuItem.menu_srl); editForm.find('input[name=menu_item_srl]').val(menuItem.menu_item_srl); editForm.find('input[name=parent_srl]').val(menuItem.parent_srl); - editForm.find('input[name=menu_name_key]').val(menuName); + editForm.find('input[name=menu_name_key]').val(menuItem.name_key); editForm.find('input[name=menu_name]').val(menuName); editForm.find('input[name=success_return_url]').val(successReturnUrl); @@ -161,7 +161,7 @@ $('form.siteMap') editForm.find('input[name=menu_name]').val(''); editForm.find('input[name=cType]').attr('checked', false); editForm.find('input[name=create_menu_url]').val(''); - editForm.find('select[name=layout_srl]')[0].options[0].selected = true; + editForm.find('select[name=layout_srl]').val(xe.current_layout); editForm.find('input[name=menu_url]').val(''); editForm.find('input[name=menu_open_window]')[0].checked = true; editForm.find('input[name=group_srls\\[\\]]').attr('checked', false); @@ -292,7 +292,7 @@ $('form.siteMap') } else if(checkedValue == 'CREATE') { - $('#layoutSrl').val('0'); + $('#layoutSrl').val(xe.current_layout); } } diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index e30a9204e..c16b40ab4 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -1,5 +1,6 @@ @@ -17,7 +18,7 @@ jQuery( function() { jQuery('.grant_default').change( function(event) { doShowMe - + {$lang->collapsing}/{$lang->expanding} @@ -42,7 +43,7 @@ jQuery( function() { jQuery('.grant_default').change( function(event) { doShowMe - +
          @@ -56,7 +57,7 @@ jQuery( function() { jQuery('.grant_default').change( function(event) { doShowMe - +

          {$lang->add_menu}{$lang->edit_menu}

          • @@ -128,11 +129,11 @@ jQuery( function() { jQuery('.grant_default').change( function(event) { doShowMe
        • -

          +

        • diff --git a/modules/message/message.admin.controller.php b/modules/message/message.admin.controller.php index 3fb6bbe2c..e472b5621 100644 --- a/modules/message/message.admin.controller.php +++ b/modules/message/message.admin.controller.php @@ -18,7 +18,7 @@ **/ function procMessageAdminInsertConfig() { // Get information - $args->skin = Context::get('skin'); + $args = Context::gets('skin', 'mskin'); // Create a module Controller object $oModuleController = &getController('module'); $output = $oModuleController->insertModuleConfig('message',$args); diff --git a/modules/message/message.admin.view.php b/modules/message/message.admin.view.php index 6a3322db6..bf6893536 100644 --- a/modules/message/message.admin.view.php +++ b/modules/message/message.admin.view.php @@ -19,17 +19,24 @@ function dispMessageAdminConfig() { // Get a list of skins(themes) $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getskins($this->module_path); Context::set('skin_list', $skin_list); + + $mskin_list = $oModuleModel->getSkins($this->module_path, "m.skins"); + Context::set('mskin_list', $mskin_list); + // Get configurations (using module model object) $config = $oModuleModel->getModuleConfig('message'); Context::set('config',$config); + // Set a template file $this->setTemplatePath($this->module_path.'tpl'); + //Security $security = new Security(); - $security->encodeHTML('skin_list..title'); + $security->encodeHTML('skin_list..title', 'mskin_list..title'); $this->setTemplateFile('config'); } diff --git a/modules/message/message.mobile.php b/modules/message/message.mobile.php index 31bb66869..afbdeb42a 100644 --- a/modules/message/message.mobile.php +++ b/modules/message/message.mobile.php @@ -16,9 +16,9 @@ // Get configurations (using module model object) $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('message'); - if(!$config->skin) $config->skin = 'default'; + if(!$config->mskin) $config->mskin = 'default'; // Set the template path - $template_path = sprintf('%sm.skins/%s', $this->module_path, $config->skin); + $template_path = sprintf('%sm.skins/%s', $this->module_path, $config->mskin); // Get the member configuration $oModuleModel = &getModel('module'); $member_config = $oModuleModel->getModuleConfig('member'); diff --git a/modules/message/tpl/config.html b/modules/message/tpl/config.html index e76a001e8..06e8e9332 100644 --- a/modules/message/tpl/config.html +++ b/modules/message/tpl/config.html @@ -3,7 +3,7 @@

          {$XE_VALIDATOR_MESSAGE}

          -
          +

          {$lang->about_skin}

          @@ -18,6 +18,16 @@

          +
        • +

          +

          + +

          +
        diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index c7f35e1a1..46b547010 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -114,14 +114,34 @@ } } + $tmpModuleSkinVars = $oModuleModel->getModuleSkinVars($module_srl); + $tmpModuleMobileSkinVars = $oModuleModel->getModuleMobileSkinVars($module_srl); + if($tmpModuleSkinVars) + { + foreach($tmpModuleSkinVars AS $key=>$value) + { + $moduleSkinVars->{$key} = $value->value; + } + } + + if($tmpModuleMobileSkinVars) + { + foreach($tmpModuleMobileSkinVars AS $key=>$value) + { + $moduleMobileSkinVars->{$key} = $value->value; + } + } $oDB = &DB::getInstance(); $oDB->begin(); // Copy a module $triggerObj->originModuleSrl = $module_srl; $triggerObj->moduleSrlList = array(); - foreach($clones as $mid => $browser_title) { + + $errorLog = array(); + foreach($clones as $mid => $browser_title) + { $clone_args = null; $clone_args = clone($module_info); $clone_args->module_srl = null; @@ -131,6 +151,12 @@ $clone_args->is_default = 'N'; // Create a module $output = $oModuleController->insertModule($clone_args); + + if(!$output->toBool()) + { + $errorLog[] = $mid . ' : '. $output->message; + continue; + } $module_srl = $output->get('module_srl'); if($module_info->module == 'page' && $extra_vars->page_type == 'ARTICLE') @@ -143,23 +169,47 @@ { $extra_vars->document_srl = array_pop($document_srls); } + + if($extra_vars->mdocument_srl) + { + $copyOutput = $oDocumentAdminController->copyDocumentModule(array($extra_vars->mdocument_srl), $module_srl, $module_info->category_srl); + $copiedSrls = $copyOutput->get('copied_srls'); + if($copiedSrls && count($copiedSrls) > 0) + { + $extra_vars->mdocument_srl = array_pop($copiedSrls); + } + } } // Grant module permissions if(count($grant)) $oModuleController->insertModuleGrants($module_srl, $grant); if ($extra_vars) $oModuleController->insertModuleExtraVars($module_srl, $extra_vars); + if($moduleSkinVars) $oModuleController->insertModuleSkinVars($module_srl, $moduleSkinVars); + if($moduleMobileSkinVars) $oModuleController->insertModuleMobileSkinVars($module_srl, $moduleMobileSkinVars); + array_push($triggerObj->moduleSrlList, $module_srl); } $output = ModuleHandler::triggerCall('module.procModuleAdminCopyModule', 'after', $triggerObj); $oDB->commit(); - $this->setMessage('success_registed'); + + if(count($errorLog) > 0) + { + $message = implode('\n', $errorLog); + $this->setMessage($message); + } + else + { + $mseeage = $lang->success_registed; + $this->setMessage('success_registed'); + } + if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; htmlHeader(); - alertScript($lang->success_registed); + alertScript($message); reload(true); closePopupScript(); htmlFooter(); @@ -574,6 +624,7 @@ // Variable setting for site keyword $site_keyword = Context::get('site_keyword'); $site_srl = Context::get('site_srl'); + $vid = Context::get('vid'); // If there is no site keyword, use as information of the current virtual site $args = null; $logged_info = Context::get('logged_info'); @@ -582,7 +633,7 @@ if(!$site_srl) { - if($logged_info->is_admin == 'Y' && !$site_keyword) $args->site_srl = 0; + if($logged_info->is_admin == 'Y' && !$site_keyword && !$vid) $args->site_srl = 0; else $args->site_srl = (int)$site_module_info->site_srl; } else $args->site_srl = $site_srl; diff --git a/modules/module/module.admin.model.php b/modules/module/module.admin.model.php index 9d55725e1..e3065dc5c 100644 --- a/modules/module/module.admin.model.php +++ b/modules/module/module.admin.model.php @@ -50,11 +50,51 @@ return $output; } + function getSelectedManageHTML($grantList) + { + // Grant virtual permission for access and manager + $grantList->access->title = Context::getLang('grant_access'); + $grantList->access->default = 'guest'; + if(count($grantList)) + { + foreach($grantList as $key => $val) { + if(!$val->default) $val->default = 'guest'; + if($val->default == 'root') $val->default = 'manager'; + $grant_list->{$key} = $val; + } + } + $grant_list->manager->title = Context::getLang('grant_manager'); + $grant_list->manager->default = 'manager'; + Context::set('grant_list', $grant_list); + + // Get a list of groups + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(0); + Context::set('group_list', $group_list); + + Context::set('module_srls', 'dummy'); + $content = ''; + // Call a trigger for additional settings + // Considering uses in the other modules, trigger name cen be publicly used + $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'before', $content); + $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content); + Context::set('setup_content', $content); + + // Get information of module_grants + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($this->module_path.'tpl', 'include.manage_selected.html'); + } + /** * @brief Common:: module's permission displaying page in the module * Available when using module instance in all the modules **/ function getModuleGrantHTML($module_srl, $source_grant_list) { + if(!$module_srl) + { + return; + } + // get member module's config $oMemberModel = &getModel('member'); $member_config = $oMemberModel->getMemberConfig(); @@ -169,15 +209,24 @@ $skin_vars = $oModuleModel->getModuleMobileSkinVars($module_srl); } - if(count($skin_info->extra_vars)) { - foreach($skin_info->extra_vars as $key => $val) { + if(count($skin_info->extra_vars)) + { + foreach($skin_info->extra_vars as $key => $val) + { $group = $val->group; $name = $val->name; $type = $val->type; - if($skin_vars[$name]) $value = $skin_vars[$name]->value; + if($skin_vars[$name]) + { + $value = $skin_vars[$name]->value; + } else $value = ''; - if($type=="checkbox") $value = $value?unserialize($value):array(); - + if($type=="checkbox") + { + $value = $value?unserialize($value):array(); + } + + $value = empty($value) ? $val->default : $value; $skin_info->extra_vars[$key]->value= $value; } } diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 6a436d6b2..b6b550744 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -244,7 +244,7 @@ if(isSiteID($args->domain) && $oModuleModel->isIDExists($args->domain)) return new Object(-1,'msg_already_registed_vid'); if($args->domain && !isSiteID($args->domain)) { - $args->domain = strtolower($args->domain); + $args->domain = $args->domain; } } diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 4af881a94..33ebb9230 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -151,6 +151,11 @@ * @brief Get module information by mid **/ function getModuleInfoByMid($mid, $site_srl = 0, $columnList = array()) { + if(!$mid) + { + return; + } + $args->mid = $mid; $args->site_srl = (int)$site_srl; $oCacheHandler = &CacheHandler::getInstance('object'); diff --git a/modules/module/queries/updateModuleSite.xml b/modules/module/queries/updateModuleSite.xml index c26d7a2f1..d997b244e 100644 --- a/modules/module/queries/updateModuleSite.xml +++ b/modules/module/queries/updateModuleSite.xml @@ -4,7 +4,7 @@ - + diff --git a/modules/module/tpl/skin_config.html b/modules/module/tpl/skin_config.html index 22d7eb640..38285ace4 100644 --- a/modules/module/tpl/skin_config.html +++ b/modules/module/tpl/skin_config.html @@ -100,7 +100,7 @@

        - +

        diff --git a/modules/page/m.skins/default/mobile.html b/modules/page/m.skins/default/mobile.html index ae21637a3..85984b8b6 100644 --- a/modules/page/m.skins/default/mobile.html +++ b/modules/page/m.skins/default/mobile.html @@ -1,11 +1,2 @@ -
        {$lang->title} : {$oDocument->getTitle()}
        -
        {$lang->content} : {$oDocument->getContent()}
        -
        {$lang->tag} : {implode(',', $oDocument->get('tag_list'))}
        - - - +

        {$oDocument->getTitle()}

        +{$oDocument->getContent($module_info->display_popupmenu != 'hide')} diff --git a/modules/page/m.skins/default/skin.xml b/modules/page/m.skins/default/skin.xml new file mode 100644 index 000000000..01490e3fb --- /dev/null +++ b/modules/page/m.skins/default/skin.xml @@ -0,0 +1,38 @@ + + + Default Mobile Page Skin + Default Mobile Page Skin + + 문서형 페이지의 기본 스킨입니다. + + 0.2 + 2012-08-30 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + 제목표시 + Display title + + 문서의 제목을 표시 할지 결정합니다. + + + 출력 + Show + + + 출력하지 않음 + Hide + + + + diff --git a/modules/page/page.admin.controller.php b/modules/page/page.admin.controller.php index f47f49eee..f8f5c65cc 100644 --- a/modules/page/page.admin.controller.php +++ b/modules/page/page.admin.controller.php @@ -289,19 +289,30 @@ $bAnonymous = false; // 이미 존재하는 경우 수정 - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) + { $output = $oDocumentController->updateDocument($oDocument, $obj); $msg_code = 'success_updated'; // 그렇지 않으면 신규 등록 - } else { + } + else + { + if($obj->ismobile == 'Y') + { + $target = 'mdocument_srl'; + } + else + { + $target = 'document_srl'; + } + $output = $oDocumentController->insertDocument($obj, $bAnonymous); $msg_code = 'success_registed'; - $obj->document_srl = $output->get('document_srl'); + $document_srl = $output->get('document_srl'); $oModuleController = &getController('module'); - $this->module_info->document_srl = $obj->document_srl; + $this->module_info->{$target} = $document_srl; $oModuleController->updateModule($this->module_info); - } // 오류 발생시 멈춤 @@ -310,6 +321,7 @@ // 결과를 리턴 $this->add('mid', Context::get('mid')); $this->add('document_srl', $output->get('document_srl')); + $this->add('is_mobile', $obj->ismobile); // 성공 메세지 등록 $this->setMessage($msg_code); diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php index 6886127bb..65b569266 100644 --- a/modules/page/page.admin.view.php +++ b/modules/page/page.admin.view.php @@ -186,27 +186,30 @@ $this->setTemplateFile('page_insert'); } - function dispPageAdminMobileContent() { - if($this->module_srl) Context::set('module_srl',$this->module_srl); - // Specifying the cache file - $cache_file = sprintf("%sfiles/cache/page/%d.%s.%s.m.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType(), Context::getSslStatus()); - $interval = (int)($this->module_info->page_caching_interval); - if($interval>0) { - if(!file_exists($cache_file)) $mtime = 0; - else $mtime = filemtime($cache_file); + function dispPageAdminMobileContent() + { + if($this->module_info->page_type == 'OUTSIDE') + { + return $this->stop(-1, 'msg_invalid_request'); + } - if($mtime + $interval*60 > time()) { - $page_content = FileHandler::readFile($cache_file); - } else { - $oWidgetController = &getController('widget'); - $page_content = $oWidgetController->transWidgetCode($this->module_info->mcontent); - FileHandler::writeFile($cache_file, $page_content); - } - } else { - if(file_exists($cache_file)) FileHandler::removeFile($cache_file); - $page_content = $this->module_info->mcontent; - } - $page_content = preg_replace('@<\!--#Meta:@', ' {$lang->cmd_page_modify}... - + Mobile
        diff --git a/modules/page/tpl/filter/insert_article.xml b/modules/page/tpl/filter/insert_article.xml index 7532ecff2..e3964ec06 100644 --- a/modules/page/tpl/filter/insert_article.xml +++ b/modules/page/tpl/filter/insert_article.xml @@ -9,5 +9,6 @@ + diff --git a/modules/page/tpl/js/page_admin.js b/modules/page/tpl/js/page_admin.js index 3afea8db6..d250f2940 100644 --- a/modules/page/tpl/js/page_admin.js +++ b/modules/page/tpl/js/page_admin.js @@ -30,10 +30,15 @@ function completeArticleDocumentInserted(ret_obj){ var message = ret_obj['message']; var mid = ret_obj['mid']; + var is_mobile = ret_obj['is_mobile']; alert(message); var url = ''; + + if(is_mobile == 'Y') + url = current_url.setQuery('act', 'dispPageAdminMobileContent').setQuery('mid', mid); + else url = current_url.setQuery('act', 'dispPageIndex').setQuery('mid', mid); diff --git a/modules/page/tpl/page_insert.html b/modules/page/tpl/page_insert.html index 73be8b4dc..1cfcff7e7 100644 --- a/modules/page/tpl/page_insert.html +++ b/modules/page/tpl/page_insert.html @@ -99,7 +99,7 @@

        {$lang->about_page_caching_interval}

        -
        + - + +
        {$lang->skin}
        {$lang->default_group}
        diff --git a/modules/poll/poll.admin.controller.php b/modules/poll/poll.admin.controller.php index b992f4983..6198bef8c 100644 --- a/modules/poll/poll.admin.controller.php +++ b/modules/poll/poll.admin.controller.php @@ -80,12 +80,19 @@ /** * @brief Delete the poll (when several questions are registered in one poll, delete this question) **/ - function deletePollTitle($poll_index_srl) { + function deletePollTitle($poll_index_srl) + { $args->poll_index_srl = $poll_index_srl; $oDB = &DB::getInstance(); $oDB->begin(); + $output = executeQueryArray('poll.getPollByDeletePollTitle', $args); + if($output->toBool() && $output->data && $output->data[0]->count == 1) + { + $dargs->poll_srl = $output->data[0]->poll_srl; + } + $output = $oDB->executeQuery('poll.deletePollTitle', $args); if(!$output) { $oDB->rollback(); @@ -98,6 +105,20 @@ return $output; } + if($dargs->poll_srl) + { + $output = executeQuery('poll.deletePoll', $dargs); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = executeQuery('poll.deletePollLog', $dargs); + if(!$output) { + $oDB->rollback(); + return $output; + } + } $oDB->commit(); return new Object(); diff --git a/modules/poll/queries/getPollByDeletePollTitle.xml b/modules/poll/queries/getPollByDeletePollTitle.xml new file mode 100644 index 000000000..b68225982 --- /dev/null +++ b/modules/poll/queries/getPollByDeletePollTitle.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + +
        + + + + + + + + + + + + + diff --git a/modules/rss/rss.class.php b/modules/rss/rss.class.php index bf6d7f0c4..e7020d481 100644 --- a/modules/rss/rss.class.php +++ b/modules/rss/rss.class.php @@ -41,6 +41,9 @@ if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) return true; + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'rss', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -64,6 +67,12 @@ if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) $oModuleController->deleteTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before'); + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'rss', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'rss', 'controller', 'triggerCopyModule', 'after'); + } + return new Object(0, 'success_updated'); } diff --git a/modules/rss/rss.controller.php b/modules/rss/rss.controller.php index c52db667c..3e155ea92 100644 --- a/modules/rss/rss.controller.php +++ b/modules/rss/rss.controller.php @@ -58,5 +58,20 @@ return new Object(); } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $rssConfig = $oModuleModel->getModulePartConfig('rss', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('rss', $moduleSrl, $rssConfig); + } + } + } } ?> diff --git a/modules/rss/tpl/rss_admin_index.html b/modules/rss/tpl/rss_admin_index.html index 3ef69f84a..8e63e6fdb 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -47,29 +47,29 @@ - -

        {$lang->feed} {$lang->cmd_management}

        -
        -
        - - - - - - - - - - - +

        {$lang->feed} {$lang->cmd_management}

        +
        +
        {$lang->mid}{$lang->description}{$lang->open_rss} - - {$lang->cmd_save}
        + + + + + + + + + + + - - - - - + + + + - - - -
        {$lang->mid}{$lang->description}{$lang->open_rss} + + {$lang->cmd_save}
        {$value['mid']} + {$value['mid']} + {$value['feed_description']} @@ -83,10 +83,8 @@
        -
        - + + + + diff --git a/modules/rss/tpl/rss_module_config.html b/modules/rss/tpl/rss_module_config.html index 85b2c3038..431ece1ef 100644 --- a/modules/rss/tpl/rss_module_config.html +++ b/modules/rss/tpl/rss_module_config.html @@ -1,9 +1,9 @@
        - - - - - + + + + +

        {$lang->open_rss}

        {$lang->about_open_rss}

        diff --git a/modules/spamfilter/spamfilter.controller.php b/modules/spamfilter/spamfilter.controller.php index e0d889b92..3fb8b3c7b 100644 --- a/modules/spamfilter/spamfilter.controller.php +++ b/modules/spamfilter/spamfilter.controller.php @@ -120,7 +120,7 @@ return new Object(-1,'msg_alert_trackback_denied'); } // If trackbacks have been registered by one C-class IP address more than once for the last 30 minutes, ban the IP address and delete all the posts - /* 호스팅 환경을 감안하여 일단 이 부분은 동작하지 않도록 주석 처리 + /* ?스???경??감안?여 ?단 ??부분? ?작?? ?도?주석 처리 $count = $oTrackbackModel->getRegistedTrackback(30*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); if($count > 1) { $oTrackbackController->deleteTrackbackSender(3*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); diff --git a/modules/trackback/lang/lang.xml b/modules/trackback/lang/lang.xml index aff0a2870..ed0fe6ead 100644 --- a/modules/trackback/lang/lang.xml +++ b/modules/trackback/lang/lang.xml @@ -200,4 +200,8 @@ - \ No newline at end of file + + + + + diff --git a/modules/trackback/trackback.class.php b/modules/trackback/trackback.class.php index ad851004a..fc37f48f2 100644 --- a/modules/trackback/trackback.class.php +++ b/modules/trackback/trackback.class.php @@ -43,6 +43,9 @@ // 2007. 10. The ability to receive 19 additional modular yeokingeul if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) return true; + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'trackback', 'controller', 'triggerCopyModule', 'after')) return true; + return false; } @@ -66,6 +69,12 @@ if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) $oModuleController->insertTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before'); + // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied + if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'trackback', 'controller', 'triggerCopyModule', 'after')) + { + $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'trackback', 'controller', 'triggerCopyModule', 'after'); + } + return new Object(0, 'success_updated'); } diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php index 575b092fb..8a08d0c3e 100644 --- a/modules/trackback/trackback.controller.php +++ b/modules/trackback/trackback.controller.php @@ -97,7 +97,7 @@ $document_srl = Context::get('target_srl'); $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || !$oDocument->getSummary()) return new Object(); + if(!$oDocument->isExists()) return new Object(); if($oDocument->getMemberSrl() != $logged_info->member_srl) return new Object(); // Add a link sent yeokingeul $oDocumentController = &getController('document'); @@ -278,22 +278,22 @@ */ function sendTrackback($oDocument, $trackback_url, $charset) { $oModuleController = &getController('module'); + // Information sent by $http = parse_url($trackback_url); + $obj->blog_name = str_replace(array('<','>','&','"'), array('<','>','&','"'), Context::getBrowserTitle()); $oModuleController->replaceDefinedLangCode($obj->blog_name); $obj->title = $oDocument->getTitleText(); $obj->excerpt = $oDocument->getSummary(200); $obj->url = getFullUrl('','document_srl',$oDocument->document_srl); + // blog_name, title, excerpt, url charset of the string to the requested change if($charset && function_exists('iconv')) { foreach($obj as $key=>$val) { $obj->{$key} = iconv('UTF-8',$charset,$val); } } - // written information sent to socket - if($http['query']) $http['query'].="&"; - if(!$http['port']) $http['port'] = 80; $content = sprintf( @@ -306,42 +306,27 @@ urlencode($obj->blog_name), urlencode($obj->excerpt) ); - if($http['query']) $content .= '&'.$http['query']; - $content_length = strlen($content); - // header by - $header = - sprintf( - "POST %s HTTP/1.1\r\n". - "Host: %s\r\n". - "Content-Type: %s\r\n". - "Content-Length: %s\r\n\r\n". - "%s\r\n", - $http['path'], - $http['host'], - "application/x-www-form-urlencoded", - $content_length, - $content - ); - if(!$http['host']||!$http['port']) return new Object(-1,'msg_trackback_url_is_invalid'); - // Opens a socket on the target server you want to send - $fp = @fsockopen($http['host'], $http['port'], $errno, $errstr, 5); - if(!$fp) return new Object(-1,'msg_trackback_url_is_invalid'); - // Header information sent by - fputs($fp, $header); - // Waiting for the results (in particular the server may not be falling EOF - while(!feof($fp)) { - $line = trim(fgets($fp, 4096)); - if(preg_match("/^/i",$line)){ - $error = preg_replace('/[^0-9]/','',$line); - break; - } - } - // Close socket - fclose($fp); - if($error == "0") return new Object(0, 'msg_trackback_send_success'); - - return new Object(-1, 'msg_trackback_send_failed'); + $buff = FileHandler::getRemoteResource($trackback_url, $content, 3, 'POST', 'application/x-www-form-urlencoded'); + + $oXmlParser = new XmlParser(); + $xmlDoc = $oXmlParser->parse($buff); + + if($xmlDoc->response->error->body == '0') + { + return new Object(0, 'msg_trackback_send_success'); + } + else + { + if($xmlDoc->response->message->body) + { + return new Object(-1, sprintf('%s: %s', Context::getLang('msg_trackback_send_failed'), $xmlDoc->response->message->body)); + } + else + { + return new Object(-1, 'msg_trackback_send_failed'); + } + } } /** @@ -369,5 +354,20 @@ $this->deleteTrackback($trackback_srl, true); } } + + function triggerCopyModule(&$obj) + { + $oModuleModel = &getModel('module'); + $trackbackConfig = $oModuleModel->getModulePartConfig('trackback', $obj->originModuleSrl); + + $oModuleController = &getController('module'); + if(is_array($obj->moduleSrlList)) + { + foreach($obj->moduleSrlList AS $key=>$moduleSrl) + { + $oModuleController->insertModulePartConfig('trackback', $moduleSrl, $trackbackConfig); + } + } + } } ?> diff --git a/modules/trackback/trackback.model.php b/modules/trackback/trackback.model.php index d644c0251..211da4abd 100644 --- a/modules/trackback/trackback.model.php +++ b/modules/trackback/trackback.model.php @@ -158,8 +158,8 @@ * @param int $document_srl * @return string */ - function getTrackbackUrl($document_srl) { - $url = getFullUrl('','document_srl',$document_srl,'act','trackback','key',$this->getTrackbackKey($document_srl)); + function getTrackbackUrl($document_srl, $mid = NULL) { + $url = getFullUrl('', 'mid', $mid, 'document_srl',$document_srl,'act','trackback','key',$this->getTrackbackKey($document_srl)); return $url; } diff --git a/modules/widget/tpl/widget_generate_code.include.html b/modules/widget/tpl/widget_generate_code.include.html index 5109f505e..4fb42b916 100644 --- a/modules/widget/tpl/widget_generate_code.include.html +++ b/modules/widget/tpl/widget_generate_code.include.html @@ -104,7 +104,6 @@ -

        {$var->description}


        @@ -232,6 +231,7 @@
        +

        {$var->description}

        diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index c3d39076e..12eeec60c 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -119,7 +119,7 @@ if(in_array($group_srl, $manager_group)) $is_admin = true; } } - if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_infoi->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); + if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_info->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); // Enter post $oDocumentModel = &getModel('document'); $oDocumentController = &getController('document'); @@ -171,7 +171,7 @@ if(in_array($group_srl, $manager_group)) $is_admin = true; } } - if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_infoi->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); + if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_info->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); $output = $oDocumentAdminController->copyDocumentModule(array($oDocument->get('document_srl')), $oDocument->get('module_srl'),0); if(!$output->toBool()) return $output; @@ -208,7 +208,7 @@ if(in_array($group_srl, $manager_group)) $is_admin = true; } } - if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_infoi->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); + if(!$is_admin && !$is_logged && $logged_info->is_admin != 'Y' && !$oModuleModel->isSiteAdmin($logged_info) && !(is_array($page_info->admin_id) && in_array($logged_info->user_id, $page_info->admin_id))) return new Object(-1,'msg_not_permitted'); $output = $oDocumentController->deleteDocument($oDocument->get('document_srl'), true); if(!$output->toBool()) return $output; diff --git a/tests/classes/db/config/config.inc.php b/tests/classes/db/config/config.inc.php index f2c8c8ee0..2c1a5106c 100644 --- a/tests/classes/db/config/config.inc.php +++ b/tests/classes/db/config/config.inc.php @@ -36,6 +36,7 @@ require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/ClickCountExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/table/Table.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/table/CubridTableWithHint.class.php'); diff --git a/tests/classes/db/db/DBTest.php b/tests/classes/db/db/DBTest.php index c8e1a6b2c..fe8f28ad6 100644 --- a/tests/classes/db/db/DBTest.php +++ b/tests/classes/db/db/DBTest.php @@ -20,8 +20,12 @@ class DBTest extends PHPUnit_Framework_TestCase { $querySql = $db->{$methodName}($output); // Remove whitespaces, tabs and all - $querySql = Helper::cleanString($querySql); - $expected = Helper::cleanString($expected); + if(is_a($querySql, 'Object')) + { + $querySql = $querySql->getMessage(); + } + $querySql = Helper::cleanString($querySql); + $expected = Helper::cleanString($expected); } $this->assertEquals($expected, $querySql); } diff --git a/tests/classes/db/db/xml_query/cubrid/CubridSelectTest.php b/tests/classes/db/db/xml_query/cubrid/CubridSelectTest.php index aef54a3dd..44c3c6bf2 100644 --- a/tests/classes/db/db/xml_query/cubrid/CubridSelectTest.php +++ b/tests/classes/db/db/xml_query/cubrid/CubridSelectTest.php @@ -439,6 +439,17 @@ $argsString = '$args->package_srl = 18325662;'; $expectedArgs = array(18325662); $this->_testPreparedQuery($xml_file, $argsString, $expected, 'getSelectSql', $expectedArgs); - } + } + + /** + * Issue 1431 - xml click count error + */ + function testClickCount() + { + $xml_file = _TEST_PATH_ . "db/xml_query/mysql/data/click_count.xml"; + $argsString = '$args->incr_expose_count = true;'; + $expected = 'select INCR("expose_count") from "xe_modules" as "modules"'; + $this->_test($xml_file, $argsString, $expected); + } } \ No newline at end of file diff --git a/tests/classes/db/db/xml_query/cubrid/data/click_count.xml b/tests/classes/db/db/xml_query/cubrid/data/click_count.xml new file mode 100644 index 000000000..3dd210b09 --- /dev/null +++ b/tests/classes/db/db/xml_query/cubrid/data/click_count.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php b/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php index 11741a2eb..28d2266fd 100644 --- a/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php +++ b/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php @@ -380,4 +380,37 @@ class MysqlSelectTest extends MysqlTest { limit 5"; $this->_test($xml_file, $argsString, $expected); } -} \ No newline at end of file + + /** + * Add support for CAST / CONVERT function + */ + function testCast() + { + $xml_file = _TEST_PATH_ . "db/xml_query/mysql/data/cast.xml"; + $argsString = ''; + $expected = "select cast(`document_srl` as unsigned integer) from `xe_documents` as `documents`"; + $this->_test($xml_file, $argsString, $expected); + } + + /** + * Add support for CAST / CONVERT function + */ + function testConvert() + { + $xml_file = _TEST_PATH_ . "db/xml_query/mysql/data/convert.xml"; + $argsString = ''; + $expected = "select convert(`document_srl`, unsigned integer) from `xe_documents` as `documents`"; + $this->_test($xml_file, $argsString, $expected); + } + + /** + * Issue 1431 - xml click count error + */ + function testClickCount() + { + $xml_file = _TEST_PATH_ . "db/xml_query/mysql/data/click_count.xml"; + $argsString = '$args->incr_expose_count = true;'; + $expected = "select `expose_count` from `xe_modules` as `modules`"; + $this->_test($xml_file, $argsString, $expected); + } +} diff --git a/tests/classes/db/db/xml_query/mysql/data/cast.xml b/tests/classes/db/db/xml_query/mysql/data/cast.xml new file mode 100644 index 000000000..9049dbe1b --- /dev/null +++ b/tests/classes/db/db/xml_query/mysql/data/cast.xml @@ -0,0 +1,8 @@ + + +
        + + + + + diff --git a/tests/classes/db/db/xml_query/mysql/data/click_count.xml b/tests/classes/db/db/xml_query/mysql/data/click_count.xml new file mode 100644 index 000000000..3dd210b09 --- /dev/null +++ b/tests/classes/db/db/xml_query/mysql/data/click_count.xml @@ -0,0 +1,8 @@ + + +
        + + + + + \ No newline at end of file diff --git a/tests/classes/db/db/xml_query/mysql/data/convert.xml b/tests/classes/db/db/xml_query/mysql/data/convert.xml new file mode 100644 index 000000000..96d982717 --- /dev/null +++ b/tests/classes/db/db/xml_query/mysql/data/convert.xml @@ -0,0 +1,8 @@ + + +
        + + + + + diff --git a/tests/classes/frontendfile/FrontEndFileHandlerTest.php b/tests/classes/frontendfile/FrontEndFileHandlerTest.php index 7b5fad97f..69852c667 100644 --- a/tests/classes/frontendfile/FrontEndFileHandlerTest.php +++ b/tests/classes/frontendfile/FrontEndFileHandlerTest.php @@ -4,6 +4,7 @@ if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; require_once _XE_PATH_.'classes/handler/Handler.class.php'; require_once _XE_PATH_.'classes/frontendfile/FrontEndFileHandler.class.php'; +require_once _XE_PATH_.'classes/file/FileHandler.class.php'; class FrontEndFileHandlerTest extends PHPUnit_Framework_TestCase @@ -16,12 +17,12 @@ class FrontEndFileHandlerTest extends PHPUnit_Framework_TestCase $handler = new FrontEndFileHandler(); // js(head) - $handler->loadFile(array('./common/js/jquery.js')); + $handler->loadFile(array('./common/js/jquery.min.js')); $handler->loadFile(array('./common/js/js_app.js')); $handler->loadFile(array('./common/js/common.js')); $handler->loadFile(array('./common/js/xml_handler.js')); $handler->loadFile(array('./common/js/xml_js_filter.js')); - + $expected[] = array('file' => '/xe/common/js/jquery.js', 'targetie' => ''); $expected[] = array('file' => '/xe/common/js/js_app.js', 'targetie' => ''); $expected[] = array('file' => '/xe/common/js/common.js', 'targetie' => ''); diff --git a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/css/style.css b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/css/style.css index 74a17ac40..090ea6337 100644 --- a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/css/style.css +++ b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/css/style.css @@ -14,7 +14,7 @@ img{border:none} #wrap .slide_banner{width:100%;height:446px;background:url(../images/slide_box_bg.gif) repeat-x top left;padding-top:15px} .container .search_box_layout{position:absolute;top:10px;right:0px} .search_box_layout .inputBox{width:218px;height:29px;background:url(../images/search_box_bg.gif) no-repeat top left} -.search_box_layout .inputBox .iText{width:175px;float:left;background:none;;outline:none;border:0 none;padding-left:10px;margin-top:3px} +.search_box_layout .inputBox .iText{width:175px;float:left;background:none;outline:none;border:0 none;padding-left:10px;margin-top:5px} .search_box_layout .inputBox .is_submit{width:15px;height:14px;float:right;margin-top:6px;margin-right:10px} /* GNB */ .header .gnb{position:absolute;top:36px;left:220px;z-index:300} diff --git a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/js/slides.min.jquery.js b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/js/slides.min.jquery.js index bf3da85c0..a617d4385 100644 --- a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/js/slides.min.jquery.js +++ b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/js/slides.min.jquery.js @@ -16,4 +16,4 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. -*/(function(A){A.fn.slides=function(B){B=A.extend({},A.fn.slides.option,B);return this.each(function(){A("."+B.container,A(this)).children().wrapAll('
        ');var V=A(this),J=A(".slides_control",V),Z=J.children().size(),Q=J.children().outerWidth(),M=J.children().outerHeight(),D=B.start-1,L=B.effect.indexOf(",")<0?B.effect:B.effect.replace(" ","").split(",")[0],S=B.effect.indexOf(",")<0?L:B.effect.replace(" ","").split(",")[1],O=0,N=0,C=0,P=0,U,H,I,X,W,T,K,F;function E(c,b,a){if(!H&&U){H=true;B.animationStart(P+1);switch(c){case"next":N=P;O=P+1;O=Z===O?0:O;X=Q*2;c=-Q*2;P=O;break;case"prev":N=P;O=P-1;O=O===-1?Z-1:O;X=0;c=0;P=O;break;case"pagination":O=parseInt(a,10);N=A("."+B.paginationClass+" li."+B.currentClass+" a",V).attr("href").match("[^#/]+$");if(O>N){X=Q*2;c=-Q*2;}else{X=0;c=0;}P=O;break;}if(b==="fade"){if(B.crossfade){J.children(":eq("+O+")",V).css({zIndex:10}).fadeIn(B.fadeSpeed,B.fadeEasing,function(){if(B.autoHeight){J.animate({height:J.children(":eq("+O+")",V).outerHeight()},B.autoHeightSpeed,function(){J.children(":eq("+N+")",V).css({display:"none",zIndex:0});J.children(":eq("+O+")",V).css({zIndex:0});B.animationComplete(O+1);H=false;});}else{J.children(":eq("+N+")",V).css({display:"none",zIndex:0});J.children(":eq("+O+")",V).css({zIndex:0});B.animationComplete(O+1);H=false;}});}else{J.children(":eq("+N+")",V).fadeOut(B.fadeSpeed,B.fadeEasing,function(){if(B.autoHeight){J.animate({height:J.children(":eq("+O+")",V).outerHeight()},B.autoHeightSpeed,function(){J.children(":eq("+O+")",V).fadeIn(B.fadeSpeed,B.fadeEasing);});}else{J.children(":eq("+O+")",V).fadeIn(B.fadeSpeed,B.fadeEasing,function(){if(A.browser.msie){A(this).get(0).style.removeAttribute("filter");}});}B.animationComplete(O+1);H=false;});}}else{J.children(":eq("+O+")").css({left:X,display:"block"});if(B.autoHeight){J.animate({left:c,height:J.children(":eq("+O+")").outerHeight()},B.slideSpeed,B.slideEasing,function(){J.css({left:-Q});J.children(":eq("+O+")").css({left:Q,zIndex:5});J.children(":eq("+N+")").css({left:Q,display:"none",zIndex:0});B.animationComplete(O+1);H=false;});}else{J.animate({left:c},B.slideSpeed,B.slideEasing,function(){J.css({left:-Q});J.children(":eq("+O+")").css({left:Q,zIndex:5});J.children(":eq("+N+")").css({left:Q,display:"none",zIndex:0});B.animationComplete(O+1);H=false;});}}if(B.pagination){A("."+B.paginationClass+" li."+B.currentClass,V).removeClass(B.currentClass);A("."+B.paginationClass+" li:eq("+O+")",V).addClass(B.currentClass);}}}function R(){clearInterval(V.data("interval"));}function G(){if(B.pause){clearTimeout(V.data("pause"));clearInterval(V.data("interval"));K=setTimeout(function(){clearTimeout(V.data("pause"));F=setInterval(function(){E("next",L);},B.play);V.data("interval",F);},B.pause);V.data("pause",K);}else{R();}}if(Z<2){return ;}if(D<0){D=0;}if(D>Z){D=Z-1;}if(B.start){P=D;}if(B.randomize){J.randomize();}A("."+B.container,V).css({overflow:"hidden",position:"relative"});J.children().css({position:"absolute",top:0,left:J.children().outerWidth(),zIndex:0,display:"none"});J.css({position:"relative",width:(Q*3),height:M,left:-Q});A("."+B.container,V).css({display:"block"});if(B.autoHeight){J.children().css({height:"auto"});J.animate({height:J.children(":eq("+D+")").outerHeight()},B.autoHeightSpeed);}if(B.preload&&J.find("img:eq("+D+")").length){A("."+B.container,V).css({background:"url("+B.preloadImage+") no-repeat 50% 50%"});var Y=J.find("img:eq("+D+")").attr("src")+"?"+(new Date()).getTime();if(A("img",V).parent().attr("class")!="slides_control"){T=J.children(":eq(0)")[0].tagName.toLowerCase();}else{T=J.find("img:eq("+D+")");}J.find("img:eq("+D+")").attr("src",Y).load(function(){J.find(T+":eq("+D+")").fadeIn(B.fadeSpeed,B.fadeEasing,function(){A(this).css({zIndex:5});A("."+B.container,V).css({background:""});U=true;B.slidesLoaded();});});}else{J.children(":eq("+D+")").fadeIn(B.fadeSpeed,B.fadeEasing,function(){U=true;B.slidesLoaded();});}if(B.bigTarget){J.children().css({cursor:"pointer"});J.children().click(function(){E("next",L);return false;});}if(B.hoverPause&&B.play){J.bind("mouseover",function(){R();});J.bind("mouseleave",function(){G();});}if(B.generateNextPrev){A("."+B.container,V).after('Prev');A("."+B.prev,V).after('Next');}A("."+B.next,V).click(function(a){a.preventDefault();if(B.play){G();}E("next",L);});A("."+B.prev,V).click(function(a){a.preventDefault();if(B.play){G();}E("prev",L);});if(B.generatePagination){if(B.prependPagination){V.prepend("
          ");}else{V.append("
            ");}J.children().each(function(){A("."+B.paginationClass,V).append('
          • '+(C+1)+"
          • ");C++;});}else{A("."+B.paginationClass+" li a",V).each(function(){A(this).attr("href","#"+C);C++;});}A("."+B.paginationClass+" li:eq("+D+")",V).addClass(B.currentClass);A("."+B.paginationClass+" li a",V).click(function(){if(B.play){G();}I=A(this).attr("href").match("[^#/]+$");if(P!=I){E("pagination",S,I);}return false;});A("a.link",V).click(function(){if(B.play){G();}I=A(this).attr("href").match("[^#/]+$")-1;if(P!=I){E("pagination",S,I);}return false;});if(B.play){F=setInterval(function(){E("next",L);},B.play);V.data("interval",F);}});};A.fn.slides.option={preload:false,preloadImage:"/common/img/loading.gif",container:"slides_container",generateNextPrev:false,next:"next",prev:"prev",pagination:true,generatePagination:true,prependPagination:false,paginationClass:"pagination",currentClass:"current",fadeSpeed:350,fadeEasing:"",slideSpeed:350,slideEasing:"",start:1,effect:"slide",crossfade:false,randomize:false,play:0,pause:0,hoverPause:false,autoHeight:false,autoHeightSpeed:350,bigTarget:false,animationStart:function(){},animationComplete:function(){},slidesLoaded:function(){}};A.fn.randomize=function(C){function B(){return(Math.round(Math.random())-0.5);}return(A(this).each(function(){var F=A(this);var E=F.children();var D=E.length;if(D>1){E.hide();var G=[];for(i=0;i');var V=A(this),J=A(".slides_control",V),Z=J.children().size(),Q=J.children().outerWidth(),M=J.children().outerHeight(),D=B.start-1,L=B.effect.indexOf(",")<0?B.effect:B.effect.replace(" ","").split(",")[0],S=B.effect.indexOf(",")<0?L:B.effect.replace(" ","").split(",")[1],O=0,N=0,C=0,P=0,U,H,I,X,W,T,K,F;function E(c,b,a){if(!H&&U){H=true;B.animationStart(P+1);switch(c){case"next":N=P;O=P+1;O=Z===O?0:O;X=Q*2;c=-Q*2;P=O;break;case"prev":N=P;O=P-1;O=O===-1?Z-1:O;X=0;c=0;P=O;break;case"pagination":O=parseInt(a,10);N=A("."+B.paginationClass+" li."+B.currentClass+" a",V).attr("href").match("[^#/]+$");if(O>N){X=Q*2;c=-Q*2;}else{X=0;c=0;}P=O;break;}if(b==="fade"){if(B.crossfade){J.children(":eq("+O+")",V).css({zIndex:10}).fadeIn(B.fadeSpeed,B.fadeEasing,function(){if(B.autoHeight){J.animate({height:J.children(":eq("+O+")",V).outerHeight()},B.autoHeightSpeed,function(){J.children(":eq("+N+")",V).css({display:"none",zIndex:0});J.children(":eq("+O+")",V).css({zIndex:0});B.animationComplete(O+1);H=false;});}else{J.children(":eq("+N+")",V).css({display:"none",zIndex:0});J.children(":eq("+O+")",V).css({zIndex:0});B.animationComplete(O+1);H=false;}});}else{J.children(":eq("+N+")",V).fadeOut(B.fadeSpeed,B.fadeEasing,function(){if(B.autoHeight){J.animate({height:J.children(":eq("+O+")",V).outerHeight()},B.autoHeightSpeed,function(){J.children(":eq("+O+")",V).fadeIn(B.fadeSpeed,B.fadeEasing);});}else{J.children(":eq("+O+")",V).fadeIn(B.fadeSpeed,B.fadeEasing,function(){if(A.browser.msie){A(this).get(0).style.removeAttribute("filter");}});}B.animationComplete(O+1);H=false;});}}else{J.children(":eq("+O+")").css({left:X,display:"block"});if(B.autoHeight){J.animate({left:c,height:J.children(":eq("+O+")").outerHeight()},B.slideSpeed,B.slideEasing,function(){J.css({left:-Q});J.children(":eq("+O+")").css({left:Q,zIndex:5});J.children(":eq("+N+")").css({left:Q,display:"none",zIndex:0});B.animationComplete(O+1);H=false;});}else{J.animate({left:c},B.slideSpeed,B.slideEasing,function(){J.css({left:-Q});J.children(":eq("+O+")").css({left:Q,zIndex:5});J.children(":eq("+N+")").css({left:Q,display:"none",zIndex:0});B.animationComplete(O+1);H=false;});}}if(B.pagination){A("."+B.paginationClass+" li."+B.currentClass,V).removeClass(B.currentClass);A("."+B.paginationClass+" li:eq("+O+")",V).addClass(B.currentClass);}}}function R(){clearInterval(V.data("interval"));}function G(){if(B.pause){clearTimeout(V.data("pause"));clearInterval(V.data("interval"));K=setTimeout(function(){clearTimeout(V.data("pause"));F=setInterval(function(){E("next",L);},B.play);V.data("interval",F);},B.pause);V.data("pause",K);}else{R();}}if(Z<2){return ;}if(D<0){D=0;}if(D>Z){D=Z-1;}if(B.start){P=D;}if(B.randomize){J.randomize();}A("."+B.container,V).css({overflow:"hidden",position:"relative"});J.children().css({position:"absolute",top:0,left:J.children().outerWidth(),zIndex:0,display:"none"});J.css({position:"relative",width:(Q*3),height:M,left:-Q});A("."+B.container,V).css({display:"block"});if(B.autoHeight){J.children().css({height:"auto"});J.animate({height:J.children(":eq("+D+")").outerHeight()},B.autoHeightSpeed);}if(B.preload&&J.find("img:eq("+D+")").length){A("."+B.container,V).css({background:"url("+B.preloadImage+") no-repeat 50% 50%"});var Y=J.find("img:eq("+D+")").attr("src")+"?"+(new Date()).getTime();if(A("img",V).parent().attr("class")!="slides_control"){T=J.children(":eq(0)")[0].tagName.toLowerCase();}else{T=J.find("img:eq("+D+")");}J.find("img:eq("+D+")").attr("src",Y).load(function(){J.find(T+":eq("+D+")").fadeIn(B.fadeSpeed,B.fadeEasing,function(){A(this).css({zIndex:5});A("."+B.container,V).css({background:""});U=true;B.slidesLoaded();});});}else{J.children(":eq("+D+")").fadeIn(B.fadeSpeed,B.fadeEasing,function(){U=true;B.slidesLoaded();});}if(B.bigTarget){J.children().css({cursor:"pointer"});J.children().click(function(){E("next",L);return false;});}if(B.hoverPause&&B.play){J.bind("mouseover",function(){R();});J.bind("mouseleave",function(){G();});}if(B.generateNextPrev){A("."+B.container,V).after('Prev');A("."+B.prev,V).after('Next');}A("."+B.next,V).click(function(a){a.preventDefault();if(B.play){G();}E("next",L);});A("."+B.prev,V).click(function(a){a.preventDefault();if(B.play){G();}E("prev",L);});if(B.generatePagination){if(B.prependPagination){V.prepend("
              ");}else{V.append("
                ");}J.children().each(function(){A("."+B.paginationClass,V).append('
              • '+(C+1)+"
              • ");C++;});}else{A("."+B.paginationClass+" li a",V).each(function(){A(this).attr("href","#"+C);C++;});}A("."+B.paginationClass+" li:eq("+D+")",V).addClass(B.currentClass);A("."+B.paginationClass+" li a",V).click(function(){if(B.play){G();}I=A(this).attr("href").match("[^#/]+$");if(P!=I){E("pagination",S,I);}return false;});A("a.link",V).click(function(){if(B.play){G();}I=A(this).attr("href").match("[^#/]+$")-1;if(P!=I){E("pagination",S,I);}return false;});if(B.play){F=setInterval(function(){E("next",L);},B.play);V.data("interval",F);}});};A.fn.slides.option={preload:false,preloadImage:"/common/img/msg.loading.gif",container:"slides_container",generateNextPrev:false,next:"next",prev:"prev",pagination:true,generatePagination:true,prependPagination:false,paginationClass:"pagination",currentClass:"current",fadeSpeed:350,fadeEasing:"",slideSpeed:350,slideEasing:"",start:1,effect:"slide",crossfade:false,randomize:false,play:0,pause:0,hoverPause:false,autoHeight:false,autoHeightSpeed:350,bigTarget:false,animationStart:function(){},animationComplete:function(){},slidesLoaded:function(){}};A.fn.randomize=function(C){function B(){return(Math.round(Math.random())-0.5);}return(A(this).each(function(){var F=A(this);var E=F.children();var D=E.length;if(D>1){E.hide();var G=[];for(i=0;i
                - +
                diff --git a/widgets/counter_status/counter_status.class.php b/widgets/counter_status/counter_status.class.php index 4792ff718..717c33fca 100644 --- a/widgets/counter_status/counter_status.class.php +++ b/widgets/counter_status/counter_status.class.php @@ -19,11 +19,15 @@ $site_module_info = Context::get('site_module_info'); $output = $oCounterModel->getStatus(array('00000000', date('Ymd', time()-60*60*24), date('Ymd')), $site_module_info->site_srl); - foreach($output as $key => $val) { - if(!$key) Context::set('total_counter', $val); - elseif($key == date("Ymd")) Context::set('today_counter', $val); - else Context::set('yesterday_counter', $val); - } + if(count($output)) + { + foreach($output as $key => $val) + { + if(!$key) Context::set('total_counter', $val); + elseif($key == date("Ymd")) Context::set('today_counter', $val); + else Context::set('yesterday_counter', $val); + } + } // Set a path of the template skin (values of skin, colorset settings) $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); Context::set('colorset', $args->colorset);