diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php
index fc2bed4ae..17cb19680 100644
--- a/addons/counter/counter.addon.php
+++ b/addons/counter/counter.addon.php
@@ -12,9 +12,17 @@
* 파일내에서 이루어집니다.
**/
- // called_position가 before_module_init 이고 module이 admin이 아닐 경우
- if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__']) {
- if($this->module != 'admin') Context::addJsFile('./modules/counter/tpl/js/counter.js');
- $GLOBALS['__counter_addon_called__'] = true;
- }
+ // module이 admin이면 패스~ called_position가 before_display_content 이고 module이 admin이 아닐 경우
+ if(
+ Context::get('act')=='procFileDelete' ||
+ Context::get('module')=='admin' ||
+ $called_position != 'before_display_content' ||
+ Context::getRequestMethod()=='XMLRPC' ||
+ $GLOBALS['__counter_addon_called__']
+ ) return;
+
+ $GLOBALS['__counter_addon_called__'] = true;
+
+ $oCounterController = &getController('counter');
+ $oCounterController->procCounterExecute();
?>
diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php
index 55c0ebe50..372476e3e 100644
--- a/addons/member_extra_info/member_extra_info.addon.php
+++ b/addons/member_extra_info/member_extra_info.addon.php
@@ -65,7 +65,7 @@
// 로그인된 사용자 정보를 구함
$logged_info = Context::get('logged_info');
- $member_srl = Context::get('member_srl');
+ $member_srl = Context::get('target_srl');
// 템플릿에서 사용되기 전의 menu_list를 가져옴
$menu_list = $this->get('menu_list');
diff --git a/addons/point/point.addon.php b/addons/point/point.addon.php
index 1f5460140..fb42f882e 100644
--- a/addons/point/point.addon.php
+++ b/addons/point/point.addon.php
@@ -2,237 +2,7 @@
if(!defined("__ZBXE__")) exit();
/**
- * @file point.addon.php
- * @author zero (zero@nzeo.com)
- * @brief 포인트 애드온
- *
- * 포인트 시스템 모듈에 설정된 내용을 토대로 하여 포인트를 부여/차감하고,
- * 다운로드를 금지시키고,
- * 회원 이름 앞에 레벨 아이콘을 표시한다.
+ * @brief 포인트 애드온은 포인트 모듈의 trigger 기능으로 인하여 더 이상 사용하지 않음
**/
-
- // 관리자 모듈이면 패스~
- if(Context::get('module')=='admin') return;
-
- // 로그인 상태일때만 실행
- $logged_info = Context::get('logged_info');
- if(!$logged_info->member_srl) return;
-
- // point action cache file을 가져와서 현재 속한 캐시파일인지 확인
- $act_cache_file = "./files/cache/point.act.cache";
- $buff = FileHandler::readFile($act_cache_file);
- if(strpos($buff,$this->act)===false) return;
-
- // point 모듈 정보 가져옴
- $oModuleModel = &getModel('module');
- $config = $oModuleModel->getModuleConfig('point');
-
- // 현재 로그인 사용자의 포인트를 가져옴
- $member_srl = $logged_info->member_srl;
-
- $oPointModel = &getModel('point');
- $cur_point = $oPointModel->getPoint($member_srl, true);
-
- // 파일다운로드를 제외한 action은 called_position가 before_module_proc일때 실행
- if($called_position == 'after_module_proc') {
-
- // 게시글 작성
- if(strpos($config->insert_document_act,$this->act)!==false) {
- if(!$this->toBool()) return;
- $document_srl = $this->get('document_srl');
-
- $oDocumentModel = &getModel('document');
- $oDocument = $oDocumentModel->getDocument($document_srl);
-
- // 신규 글인지 체크
- if($oDocument->get('regdate')!=$oDocument->get('last_update')) return;
- $module_srl = $oDocument->get('module_srl');
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['insert_document'];
- if($point == null) $point = $config->insert_document;
-
- // 포인트 증감
- $cur_point += $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($member_srl,$cur_point);
-
- // 게시글 삭제
- } elseif(strpos($config->delete_document_act,$this->act)!==false) {
- if(!$this->toBool()) return;
- $target_member_srl = Context::get('_point_target_member_srl');
- if(!$target_member_srl) return;
-
- $module_srl = $this->module_srl;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['insert_document'];
- if($point == null) $point = $config->insert_document;
-
- // 포인트 차감
- $cur_point = $oPointModel->getPoint($target_member_srl, true);
- $cur_point -= $point;
-
- $oPointController = &getController('point');
- $oPointController->setPoint($target_member_srl,$cur_point);
-
- // 댓글 작성
- } elseif(strpos($config->insert_comment_act,$this->act)!==false) {
- $comment_srl = $this->get('comment_srl');
- $oCommentModel = &getModel('comment');
- $comment = $oCommentModel->getComment($comment_srl);
-
- // 이미 존재하는 댓글인지 체크
- if($comment->last_update) return;
-
- // 포인트를 구해옴
- $module_srl = $comment->module_srl;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['insert_comment'];
- if($point == null) $point = $config->insert_comment;
-
- // 포인트 증감
- $cur_point += $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($member_srl,$cur_point);
-
-
- // 댓글 삭제
- } elseif(strpos($config->delete_comment_act,$this->act)!==false) {
- if(!$this->toBool()) return;
- $target_member_srl = Context::get('_point_target_member_srl');
- if(!$target_member_srl) return;
-
- // 포인트를 구해옴
- $module_srl = $this->module_srl;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['insert_comment'];
- if($point == null) $point = $config->insert_comment;
-
- // 포인트 증감
- $cur_point = $oPointModel->getPoint($target_member_srl, true);
- $cur_point -= $point;
-
- $oPointController = &getController('point');
- $oPointController->setPoint($target_member_srl,$cur_point);
-
- // 파일업로드
- } elseif(strpos($config->upload_file_act,$this->act)!==false) {
- if(!$output->toBool()||!$output->get('file_srl')) return;
- $file_srl = $output->get('file_srl');
-
- $oFileModel = &getModel('file');
- $file_info = $oFileModel->getFile($file_srl);
-
- $module_srl = $this->module_srl;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['upload_file'];
- if($point == null) $point = $config->upload_file;
-
- // 포인트 증감
- $cur_point += $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($member_srl,$cur_point);
-
- // 파일삭제
- } elseif(strpos($config->delete_file_act,$this->act)!==false) {
- // 파일 정보를 구해옴
- $file_srl = Context::get('file_srl');
- if(!$file_srl) return;
- $target_member_srl = Context::get('_point_target_member_srl');
- if(!$target_member_srl) return;
-
- $module_srl = $this->module_srl;
-
- $target_member_srl = Context::get('_point_target_member_srl');
- if(!$target_member_srl) return;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['upload_file'];
- if($point == null) $point = $config->upload_file;
-
- // 포인트 차감
- $cur_point = $oPointModel->getPoint($target_member_srl, true);
- $cur_point -= $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($target_member_srl,$cur_point);
-
- // 회원 가입일 경우
- } elseif(strpos($config->signup_act,$this->act)!==false) {
- // 가입이 제대로 되었는지 체크
- if(!$this->toBool()||!$this->get('member_srl')) return;
- $member_srl = $this->get('member_srl');
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['signup'];
- if($point == null) $point = $config->signup;
-
- // 포인트 증감
- $cur_point += $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($member_srl,$cur_point);
- }
-
- // 파일다운로드는 before_module_proc 일때 체크
- } else if($called_position == "before_module_proc") {
-
- // 파일다운로드
- if(strpos($config->download_file_act,$this->act)!==false) {
- // 파일 정보를 구해옴
- $file_srl = Context::get('file_srl');
- if(!$file_srl) return;
-
- $oFileModel = &getModel('file');
- $file_info = $oFileModel->getFile($file_srl);
- if($file_info->file_srl != $file_srl) return;
-
- $module_srl = $file_info->module_srl;
-
- // 포인트를 구해옴
- $point = $config->module_point[$module_srl]['download_file'];
- if($point == null) $point = $config->download_file;
-
- // 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류
- if($cur_point + $point < 0 && $config->disable_download == 'Y') {
- $this->stop('msg_cannot_download');
- } else {
- // 포인트 차감
- $cur_point += $point;
- $oPointController = &getController('point');
- $oPointController->setPoint($member_srl,$cur_point);
- }
-
- // 글 삭제일 경우 대상 글의 사용자 번호 저장
- } elseif(strpos($config->delete_document_act,$this->act)!==false) {
- $document_srl = Context::get('document_srl');
- $oDocumentModel = &getModel('document');
- $oDocument = $oDocumentModel->getDocument($document_srl);
- $target_member_srl = $oDocument->get('member_srl');
- if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl);
-
- // 댓글 삭제일 경우 대상 댓글의 사용자 번호 저장
- } elseif(strpos($config->delete_comment_act,$this->act)!==false) {
- $comment_srl = Context::get('comment_srl');
- $oCommentModel = &getModel('comment');
- $comment = $oCommentModel->getComment($comment_srl);
- $target_member_srl = $comment->member_srl;
- if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl);
-
- // 파일삭제일 경우 대상 파일의 정보에서 사용자 번호 저장
- } elseif(strpos($config->delete_file_act,$this->act)!==false) {
- // 파일 정보를 구해옴
- $file_srl = Context::get('file_srl');
- if(!$file_srl) return;
-
- $oFileModel = &getModel('file');
- $file_info = $oFileModel->getFile($file_srl);
- if($file_info->file_srl != $file_srl) return;
-
- $target_member_srl = $file_info->member_srl;
- if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl);
- }
- }
+ return;
?>
diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php
index 5b9577b42..cbc33bf73 100644
--- a/classes/context/Context.class.php
+++ b/classes/context/Context.class.php
@@ -74,18 +74,18 @@
else $this->lang_type = $this->db_info->lang_type;
// 등록된 기본 언어파일 찾기
- $lang_files = FileHandler::readDir('./common/lang');
+ $langs = file('./common/lang/lang.info');
$accept_lang = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
- foreach($lang_files as $key => $val) {
- list($lang_prefix) = explode('.',$val);
- $lang_supported[] = $lang_prefix;
+ foreach($langs as $val) {
+ list($lang_prefix, $lang_text) = explode(',',$val);
+ $lang_supported[$lang_prefix] = $lang_text;
if(!$this->lang_type && ereg($lang_prefix, strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) {
$this->lang_type = $lang_prefix;
setcookie('lang_type', $this->lang_type, time()+60*60*24*365, '/');
}
}
- if(!in_array($this->lang_type, $lang_supported)) $this->lang_type = $this->db_info->lang_type;
+ if(!in_array($this->lang_type, array_keys($lang_supported))) $this->lang_type = $this->db_info->lang_type;
if(!$this->lang_type) $this->lang_type = "en";
Context::set('lang_supported', $lang_supported);
@@ -282,6 +282,7 @@
function setLangType($lang_type = 'ko') {
$oContext = &Context::getInstance();
$oContext->_setLangType($lang_type);
+ $_SESSION['lang_type'] = $lang_type;
}
/**
diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php
index 9624d0b70..13eec45ae 100644
--- a/classes/db/DBCubrid.class.php
+++ b/classes/db/DBCubrid.class.php
@@ -534,8 +534,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
- if($name == '*') {
- $column_list[] = '*';
+ if(substr($name,-1) == '*') {
+ $column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('"%s" as "%s"', $name, $alias);
else $column_list[] = sprintf('"%s"',$name);
diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php
index f70048522..ed1b4624a 100644
--- a/classes/db/DBMysql.class.php
+++ b/classes/db/DBMysql.class.php
@@ -484,8 +484,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
- if($name == '*') {
- $column_list[] = '*';
+ if(substr($name,-1) == '*') {
+ $column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias);
else $column_list[] = sprintf('`%s`',$name);
diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php
index a69773b7d..5521bca4c 100644
--- a/classes/db/DBMysql_innodb.class.php
+++ b/classes/db/DBMysql_innodb.class.php
@@ -493,8 +493,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
- if($name == '*') {
- $column_list[] = '*';
+ if(substr($name,-1) == '*') {
+ $column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias);
else $column_list[] = sprintf('`%s`',$name);
diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php
index 8ea701a61..2449b708f 100644
--- a/classes/db/DBSqlite2.class.php
+++ b/classes/db/DBSqlite2.class.php
@@ -505,8 +505,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
- if($name == '*') {
- $column_list[] = '*';
+ if(substr($name,-1) == '*') {
+ $column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php
index dea4dff7b..b7aa27051 100644
--- a/classes/db/DBSqlite3_pdo.class.php
+++ b/classes/db/DBSqlite3_pdo.class.php
@@ -546,8 +546,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
- if($name == '*') {
- $column_list[] = '*';
+ if(substr($name,-1) == '*') {
+ $column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php
index db6019f28..8a0946267 100644
--- a/classes/display/DisplayHandler.class.php
+++ b/classes/display/DisplayHandler.class.php
@@ -32,7 +32,7 @@
// 요청방식에 따라 출력을 별도로
if(Context::getResponseMethod()!="XMLRPC") {
-
+
Context::set('content', $content);
// 레이아웃을 컴파일
@@ -92,6 +92,10 @@
$content = preg_replace('!(href|src)=("|\'){0,1}(commons|modules|widgets|layouts|addons|files)!is', '\\1=\\2'.$path.'\\3', $content);
$content = preg_replace('!(href|src)=("|\'){0,1}\.\/([a-zA-Z0-9\_^\/]+)\/!is', '\\1=\\2'.$path.'\\3/', $content);
+ // 출력하기 전에 trigger 호출 (after)
+ ModuleHandler::triggerCall('display', 'after', $content);
+
+
if($this->gz_enabled) print ob_gzhandler($content, 5);
else print $content;
}
diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php
index 47e49e2ef..79e083e3d 100644
--- a/classes/file/FileHandler.class.php
+++ b/classes/file/FileHandler.class.php
@@ -209,6 +209,23 @@
break;
}
+ // 이미지 정보가 정해진 크기보다 크면 크기를 바꿈 (%를 구해서 처리)
+ if($resize_width > 0 && $width >= $resize_width) $width_per = $resize_width / $width;
+ else $width_per = $width / $resize_width;
+
+ if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height;
+ else $height_per = $height / $resize_height;
+
+ if($thumbnail_type == 'ratio') {
+ $per = $width_per;
+ $resize_height = $height * $per;
+ } else {
+ if($width_per < $height_per) $per = $height_per;
+ else $per = $width_per;
+ }
+
+ if(!$per) $per = 1;
+
// 타겟 파일의 type을 구함
if(!$target_type) $target_type = $type;
$target_type = strtolower($target_type);
@@ -220,24 +237,6 @@
$white = @imagecolorallocate($thumb, 255,255,255);
@imagefilledrectangle($thumb,0,0,$resize_width-1,$resize_height-1,$white);
- // 이미지 정보가 정해진 크기보다 크면 크기를 바꿈 (%를 구해서 처리)
- if($resize_width > 0 && $width >= $resize_width) $width_per = $resize_width / $width;
- else $width_per = $width / $resize_width;
-
- if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height;
- else $height_per = $height / $resize_height;
-
- if($thumbnail_type == 'ratio') {
- if($width_per > $height_per) $per = $height_per;
- else $per = $width_per;
- } else {
- if($width_per < $height_per) $per = $height_per;
- else $per = $width_per;
-
- }
-
- if(!$per) $per = 1;
-
// 원본 이미지의 타입으로 임시 이미지 생성
switch($type) {
case 'gif' :
@@ -269,8 +268,13 @@
$new_width = (int)($width * $per);
$new_height = (int)($height * $per);
- $x = (int)($resize_width/2 - $new_width/2);
- $y = (int)($resize_height/2 - $new_height/2);
+ if($thumbnail_type == 'crop') {
+ $x = (int)($resize_width/2 - $new_width/2);
+ $y = (int)($resize_height/2 - $new_height/2);
+ } else {
+ $x = 0;
+ $y = 0;
+ }
if($source) {
if(function_exists('imagecopyresampled')) @imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php
index 34a646126..1660ce888 100644
--- a/classes/module/ModuleHandler.class.php
+++ b/classes/module/ModuleHandler.class.php
@@ -107,6 +107,13 @@
// mid값이 있을 경우 mid값을 세팅
if($this->mid) Context::set('mid', $this->mid, true);
+
+ // 현재 모듈의 정보를 세팅
+ Context::set('current_module_info', $module_info);
+
+ // 실제 동작을 하기 전에 trigger 호출
+ $output = ModuleHandler::triggerCall('display', 'before', $content);
+ if(!$output->toBool()) die($output->getMessage());
}
/**
@@ -336,5 +343,45 @@
// 객체 리턴
return $GLOBALS['_loaded_module'][$module][$type][$kind];
}
+
+ /**
+ * @brief trigger_name, called_position을 주고 trigger 호출
+ **/
+ function triggerCall($trigger_name, $called_position, &$obj) {
+ // 설치가 안되어 있다면 trigger call을 하지 않고 바로 return
+ if(!Context::isInstalled()) return new Object();
+
+ $oModuleModel = &getModel('module');
+
+ $cache_dir = sprintf("./files/cache/triggers/");
+ if(!is_dir($cache_dir)) FileHandler::makeDir($cache_dir);
+
+ $cache_file = sprintf("%s%s.%s", $cache_dir, $trigger_name, $called_position);
+
+ if(!@file_exists($cache_file)) {
+ $triggers = $oModuleModel->getTriggers($trigger_name, $called_position);
+ FileHandler::writeFile($cache_file, serialize($triggers));
+ } else {
+ $buff = FileHandler::readFile($cache_file);
+ $triggers = unserialize($buff);
+ }
+
+ if(!$triggers || !count($triggers)) return new Object();
+
+ foreach($triggers as $item) {
+ $module = $item->module;
+ $type = $item->type;
+ $called_method = $item->called_method;
+
+ $oModule = null;
+ $oModule = &getModule($module, $type);
+ if(!$oModule || !method_exists($oModule, $called_method)) continue;
+
+ $output = $oModule->{$called_method}($obj);
+ if(!$output->toBool()) return $output;
+ }
+
+ return new Object();
+ }
}
?>
diff --git a/classes/optimizer/Optimizer.class.php b/classes/optimizer/Optimizer.class.php
index 2ff8ab3ca..5c8ffe41d 100644
--- a/classes/optimizer/Optimizer.class.php
+++ b/classes/optimizer/Optimizer.class.php
@@ -96,10 +96,13 @@
// css 일경우 background:url() 변경
if($type == "css") $str = $this->replaceCssPath($file, $str);
- $content_buff .= $str."\r\n";
+ $content_buff .= $str."\n";
}
+ if($type == "css") $content_buff = '@charset "utf-8";'."\n".$content_buff;
+
if($type!="css" && Context::isGzEnabled()) $content_buff = ob_gzhandler($content_buff, 5);
+
$content_file = eregi_replace("\.php$","",$filename);
$content_filename = str_replace($this->cache_path, '', $content_file);
@@ -142,6 +145,8 @@ EndOfBuff;
$str = preg_replace('!\/([^\/]*)\/\.\.\/!is','/', $str);
+ $str = preg_replace('!@charset([^;]*?);!is','',$str);
+
return $str;
}
diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php
index 005ee2398..00cb73109 100644
--- a/classes/widget/WidgetHandler.class.php
+++ b/classes/widget/WidgetHandler.class.php
@@ -41,6 +41,9 @@
if(!is_dir(sprintf('./widgets/%s/',$widget))) return;
+ $cache_path = './files/cache/widget_cache/';
+ if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
+
// $widget의 객체를 받음
$oWidget = WidgetHandler::getObject($widget);
diff --git a/common/css/button.css b/common/css/button.css
index a89a8fb93..fb4ae9dbb 100644
--- a/common/css/button.css
+++ b/common/css/button.css
@@ -1,167 +1,211 @@
-/*
- http://www.hedgerwow.com/360/dhtml/css-round-button/demo.php
-*/
-
-a.button, span.button, del.button {
- display:-moz-inline-box;
- display:inline-block;
- cursor:pointer;
- border:none;
+a.button, span.button, del.button{
+
+ display:-moz-inline-box;
+ display:inline-block;
+ cursor:pointer;
+ border:none;
font-size:0;
line-height:0;
-
- /*
- for Safari, read this first
- http://creativebits.org/webdev/safari_background_repeat_bug_fix
- */
- background-position:0 -3px;
- background-repeat:no-repeat;
- height:24px;
- text-decoration:none;
- color:#2e523b;
- font-style:normal;
- margin:0 6px 0px 0;
- padding:0 10px 0 0;
- vertical-align:middle;
-
+
+ /*
+ for Safari, read this first
+ http://creativebits.org/webdev/safari_background_repeat_bug_fix
+ */
+ background-position:0 0;
+ background-repeat:no-repeat;
+ height:30px;
+ text-decoration:none;
+ color:#2e523b;
+ font-style:normal;
+ margin:0 6px 0px 0;
+ padding:0 10px 0 0;
+ vertical-align:middle;
+
padding-top:-2px;
- position:relative;
- _width:10px;
- _overflow-y:hidden;
+ _position:relative;
+ _top:-4px;
+ _width:10px;
+ _overflow-y:hidden;
+}
+*:first-child+html a.button, *:first-child+html span.button,*:first-child+html del.button {
+ position:relative;
+ top:-4px;
}
-a.button, span.button, del.button, a.button span, span.button button, span.button input, del.button span {
+
+
+a.button, span.button, del.button,
+a.button span, span.button button, span.button input, del.button span{
background-image:url(../tpl/images/form_buttons.png);
_background-image:url(../tpl/images/form_buttons.gif);
}
-a.button span, span.button button, span.button input, del.button span {
- white-space:nowrap;
- cursor:pointer;
+a.button span, span.button button, span.button input, del.button span{
+
+ white-space:nowrap;
+ cursor:pointer;
color:#222;
- display:-moz-inline-box;
- display:inline-block;
- line-height:1;
+ display:-moz-inline-box;
+ display:inline-block;
+ line-height:1;
letter-spacing:0 !important;
+ font-family:"Arial" !important;
font-size:12px !important;
font-style:normal;
background-color:transparent;
- background-position:100% -3px;
- background-repeat:no-repeat;
- height:24px;
- padding:4px 11px 0 7px;
- margin:0 -18px 0 6px;
- border:none;
- vertical-align:text-top;
- zoom:1;
- _position:relative;
- _padding:3px 13px 0 4px;
- _margin:0 -10px 0 4px;
- _display:block;
- _top:0;
- _right:-5px;
+ background-position:100% 0;
+ background-repeat:no-repeat;
+ height:30px;
+ padding:8px 20px 0 10px;
+ margin:0 -16px 0 10px;
+ border:none;
+ zoom:1;
+ _position:relative;
+ _padding-left:0px;
+ _padding-right:12px;
+ _margin-right:-10px;
+ _display:block;
+ _right:-5px;
+
}
-*:first-child+html a.button span, span.button button, span.button input, del.button span { padding-top:6px; }
-
-
-span.button button {
- line-height:2.5;/*Opera need this*/
+span.button button{
+ line-height:2.5;/*Opera need this*/
}
-html.safari a.button span, html.safari del.button span {
- line-height:1.3;
+html.safari a.button span,
+html.safari del.button span{
+ line-height:1.3;
}
-html.safari span.button button {
- line-height:2.6;
+html.safari span.button button{
+ line-height:2.6;
}
-html.safari a.button:focus, html.safari span.button button:focus {
+html.safari a.button:focus,
+html.safari span.button button:focus{
outline:none;
}
+
+
del.button{
- /* cursor:not-allowed; */
- background-position:0 -123px;
-
+ /* cursor:not-allowed; */
+ background-position:0 -120px;
+
}
-del.button span {
- cursor:default;
+del.button span{
+ cursor:default;
color:#aaa !important;
- background-position:100% -123px;
+ background-position:100% -120px;
}
-a.button span {
- _padding-top:7px;
-}
-*:first-child+html a.button span { padding-top:7px; }
-span.button button, span.button input {
- padding:0 6px 0 0;
- line-height:2.5;/*Opera need this*/
+span.button button, span.button input{
+ padding-top:0px;
+ line-height:2.5;/*Opera need this*/
}
+
/** optional **/
/*
a.button:visited{
- color:#aaa;
+ color:#aaa;
}
*/
+
/*Hover Style*/
-a.button:hover, span.button:hover, a.button:focus, a.dom-button-focus, span.button-behavior-hover {
- background-position:0 -63px;
- color:#222;
- text-decoration:none;
-}
-a.button:hover span, span.button:hover input, span.button:hover button, a.button:focus span, span.button-behavior-hover button, span.button-behavior-hover input {
- background-position:100% -63px;
+a.button:hover,
+span.button:hover,
+a.button:focus,
+
+a.dom-button-focus,
+span.button-behavior-hover{
+ background-position:0 -60px;
+ color:#222;
+ text-decoration:none;
}
-a.button:active, a.button:focus span {
- color:#444;
+
+
+
+a.button:hover span,
+span.button:hover button,
+a.button:focus span,
+
+span.button-behavior-hover button,
+span.button-behavior-hover input{
+ background-position:100% -60px;
}
-del.button-behavior-hover, del.button:hover {
- background-position:0 -183px;
- /* cursor:not-allowed; */
+
+a.button:active, a.button:focus span{
+ color:#444;
}
-del.button-behavior-hover span, del.button:hover span {
- background-position:100% -183px;
- /* cursor:not-allowed; */
+
+
+
+del.button-behavior-hover, del.button:hover{
+ background-position:0 -180px;
+ /* cursor:not-allowed; */
}
+
+del.button-behavior-hover span, del.button:hover span{
+ background-position:100% -180px;
+ /* cursor:not-allowed; */
+
+}
+
+
+
+
/*Optional hack for IE6 to simulate :hover selector*/
-span.button button, del.button span, span.button input {
- _behavior:expression(
- (function(el){
- if( typeof( behavior_onMouseEnter) == 'undefined'){
- behavior_onMouseEnter = function(el) {
- var dEl = this.parentNode;
- var sClass = dEl.className ;
- dEl.__defaultClassName = sClass ;
- dEl.className = sClass + ' button-behavior-hover';
- this.setCapture();
- };
+span.button button, del.button span, span.button input{
+
+
+
+ _behavior:expression(
+ (function(el){
+
+ if( typeof( behavior_onMouseEnter) == 'undefined'){
+
+
+ behavior_onMouseEnter = function(el){
+
+ var dEl = this.parentNode;
+ var sClass = dEl.className ;
+ dEl.__defaultClassName = sClass ;
+ dEl.className = sClass + ' button-behavior-hover';
+ this.setCapture();
+ };
+
+ behavior_onMouseLeave = function(el) {
+ var dEl = this.parentNode;
+ dEl.className = dEl.__defaultClassName ;
+ dEl.__defaultClassName = undefined;
+ this.releaseCapture();
+ };
+
+
+ };
+
+
+ el.runtimeStyle.behavior = 'none';
+ el.onmouseenter = behavior_onMouseEnter;
+ el.onmouseleave = behavior_onMouseLeave;
+
+
+ })(this));
+
+
- behavior_onMouseLeave = function(el) {
- var dEl = this.parentNode;
- dEl.className = dEl.__defaultClassName ;
- dEl.__defaultClassName = undefined;
- this.releaseCapture();
- };
- };
- el.runtimeStyle.behavior = 'none';
- el.onmouseenter = behavior_onMouseEnter;
- el.onmouseleave = behavior_onMouseLeave;
- }
- )(this));
}
diff --git a/common/css/default.css b/common/css/default.css
index f526befd6..567e73539 100644
--- a/common/css/default.css
+++ b/common/css/default.css
@@ -27,7 +27,7 @@ IE7 & IE6 & Below
html { width:100%; }
body { margin:0; font-size:.75em; font-family:sans-serif;}
img { border:none; }
-label { cursor:pointer; position:relative; left:5px; }
+label { cursor:pointer; }
form { margin:0; padding:0; }
.iePngFix { behavior:url(./common/js/iePngFix.htc); }
@@ -66,15 +66,16 @@ a.bold { font-weight:bold; }
.folder_closer { display: none; }
.folder_area { display: none; }
-.zbxe_widget_output { background-image:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;}
-.member_signature { margin-top:10px; border:1px solid #DDDDDD; padding:10px; }
+.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;}
+.member_signature { margin-top:10px; border:1px solid #DDDDDD; padding:10px; overflow:hidden;}
+.member_profile_image { float:left; margin-right:10px; }
#waitingforserverresponse { display:inline; border:2px solid #444444; background-color:#FFFFFF; padding:15px 20px 13px 20px; font-weight:bold; color:#444444; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; }
#fororiginalimageareabg { z-index:1001; background-color:#FFFFFF; width:100%; height:100%; top:0px; left:0px; position:relative; padding:20px 10px 10px 10px; border:8px solid #DDDDDD; }
#fororiginalimagearea { visibility:hidden; padding:0px; margin:0px; width:100%; height:100%; top:0px; left:0px; position:absolute; z-index:1000; text-align:left; overflow:hidden; }
#fororiginalimage { z-index:1002; }
#closeOriginalImageBtn { position:absolute; right:8px; top:5px; cursor:pointer; width:50px; height:12px; z-index:1003; }
-#membermenuarea { position:absolute; left:0px; top:0px; z-index:1003; visibility:hidden; border:2px solid #D9D9D9; background-color:#FFFFFF; padding:0; }
-#membermenuarea .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; line-height:22px;}
-#membermenuarea .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 18px; white-space:nowrap; height:22px;}
-#membermenuarea .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 18px; height:22px; letter-spacing:-1px; white-space:nowrap;}
+#popup_menu_area { position:absolute; left:0px; top:0px; z-index:1003; visibility:hidden; border:2px solid #D9D9D9; background-color:#FFFFFF; padding:0; }
+#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; line-height:22px;}
+#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; height:22px;}
+#popup_menu_area .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 0; height:22px; letter-spacing:-1px; white-space:nowrap;}
diff --git a/common/js/common.js b/common/js/common.js
index b3a07e38b..770282b6e 100644
--- a/common/js/common.js
+++ b/common/js/common.js
@@ -456,68 +456,91 @@ function origImageDragMouseMove(evt) {
}
/**
- * @brief 이름을 클릭하였을 경우 메뉴를 보여주는 함수
- * 이름 클릭시 MemberModel::getMemberMenu 를 호출하여 그 결과를 보여줌 (사용자의 속성에 따라 메뉴가 달라지고 애드온의 연결을 하기 위해서임)
+ * @brief 이름, 게시글등을 클릭하였을 경우 팝업 메뉴를 보여주는 함수
**/
-xAddEventListener(document, 'click', chkMemberMenu);
-xAddEventListener(window, 'load', function() { setMemberMenuObjCursor(xGetElementsByTagName("div")); xGetElementsByTagName("span"); } );
-var loaded_member_menu_list = new Array();
+xAddEventListener(document, 'click', chkPopupMenu);
+var loaded_popup_menu_list = new Array();
-// className = "member_*" 일 경우의 object가 클릭되면 해당 회원의 메뉴를 출력함
-function chkMemberMenu(evt) {
- var area = xGetElementById("membermenuarea");
+// 클릭 이벤트 발생시 이벤트가 일어난 대상을 검사하여 적절한 규칙에 맞으면 처리
+function chkPopupMenu(evt) {
+ // 이전에 호출되었을지 모르는 팝업메뉴 숨김
+ var area = xGetElementById("popup_menu_area");
if(!area) return;
if(area.style.visibility!="hidden") area.style.visibility="hidden";
+ // 이벤트 대상이 없으면 무시
var e = new xEvent(evt);
if(!e) return;
+ // 대상의 객체 구함
var obj = e.target;
- while(obj) {
- if(obj && obj.className && obj.className.search("member_")!=-1) break;
+ if(!obj) return;
+
+ // obj의 nodeName이 div나 span이 아니면 나올대까지 상위를 찾음
+ if(obj && obj.nodeName != 'DIV' && obj.nodeName != 'SPAN') {
obj = obj.parentNode;
}
- if(!obj || !obj.className || obj.className.search("member_")==-1) {
- return;
+ if(!obj || (obj.nodeName != 'DIV' && obj.nodeName != 'SPAN')) return;
+
+ // 객체의 className값을 구함
+ var class_name = obj.className;
+ if(!class_name) return;
+
+ // className을 분리
+ var class_name_list = class_name.split(' ');
+ var menu_id = '';
+ var menu_id_regx = /^([a-zA-Z]+)_([0-9]+)$/ig;
+ for(var i in class_name_list) {
+ if(menu_id_regx.test(class_name_list[i])) {
+ menu_id = class_name_list[i];
+ break;
+ }
}
+ if(!menu_id) return;
- if(obj.className.indexOf('member_-1')>=0) return;
+ // module명과 대상 번호가 없으면 return
+ var tmp_arr = menu_id.split('_');
+ var module_name = tmp_arr[0];
+ var target_srl = tmp_arr[1];
+ if(!module_name || !target_srl || target_srl < 1) return;
- var member_srl = parseInt(obj.className.replace(/member_([0-9]+)/ig,'$1').replace(/([^0-9]*)/ig,''),10);
- if(!member_srl) return;
-
- // 현재 글의 mid, module를 구함
- var mid = current_mid;
+ // action이름을 규칙에 맞게 작성
+ var action_name = "get" + module_name.substr(0,1).toUpperCase() + module_name.substr(1,module_name.length-1) + "Menu";
// 서버에 메뉴를 요청
var params = new Array();
- params["member_srl"] = member_srl;
- params["cur_mid"] = mid;
+ params["target_srl"] = target_srl;
+ params["cur_mid"] = current_mid;
params["cur_act"] = current_url.getQuery('act');
+ params["menu_id"] = menu_id;
params["page_x"] = e.pageX;
params["page_y"] = e.pageY;
var response_tags = new Array("error","message","menu_list");
- if(loaded_member_menu_list[member_srl]) {
- params["menu_list"] = loaded_member_menu_list[member_srl];
- displayMemberMenu(params, response_tags, params);
+ if(loaded_popup_menu_list[menu_id]) {
+ params["menu_list"] = loaded_popup_menu_list[menu_id];
+ displayPopupMenu(params, response_tags, params);
return;
}
+
show_waiting_message = false;
- exec_xml("member", "getMemberMenu", params, displayMemberMenu, response_tags, params);
+ exec_xml(module_name, action_name, params, displayPopupMenu, response_tags, params);
show_waiting_message = true;
}
-function displayMemberMenu(ret_obj, response_tags, params) {
- var area = xGetElementById("membermenuarea");
+function displayPopupMenu(ret_obj, response_tags, params) {
+ var area = xGetElementById("popup_menu_area");
+
var menu_list = ret_obj['menu_list'];
- var member_srl = params["member_srl"];
+
+ var target_srl = params["target_srl"];
+ var menu_id = params["menu_id"];
var html = "";
- if(loaded_member_menu_list[member_srl]) {
- html = loaded_member_menu_list[member_srl];
+ if(loaded_popup_menu_list[menu_id]) {
+ html = loaded_popup_menu_list[menu_id];
} else {
var infos = menu_list.split("\n");
if(infos.length) {
@@ -532,19 +555,19 @@ function displayMemberMenu(ret_obj, response_tags, params) {
var func = info_str.substr(pos+1, info_str.length).trim();
var className = "item";
- //if(i==infos.length-1) className = "item";
if(!str || !func) continue;
- html += ""+str+"
";
+ if(icon) html += ""+str+"
";
+ else html += ""+str+"
";
}
}
- loaded_member_menu_list[member_srl] = html;
+ loaded_popup_menu_list[menu_id] = html;
}
if(html) {
// 레이어 출력
- xInnerHtml('membermenuarea', "