diff --git a/addons/point/conf/info.xml b/addons/point/conf/info.xml
new file mode 100644
index 000000000..7ccbcd3a4
--- /dev/null
+++ b/addons/point/conf/info.xml
@@ -0,0 +1,10 @@
+
+
+ 포인트 활성화 애드온
+
+ 제로
+
+ 포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다.
+
+
+
diff --git a/addons/point/point.addon.php b/addons/point/point.addon.php
new file mode 100644
index 000000000..0d66545f3
--- /dev/null
+++ b/addons/point/point.addon.php
@@ -0,0 +1,221 @@
+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) {
+ $document_srl = Context::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) $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) $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 = Context::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) $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) $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) $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) $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);
+ }
+
+ // 파일다운로드는 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) $point = $config->download_file;
+
+ // 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류
+ if($cur_point + $point < 0 && $config->disable_download == 'Y') {
+ $this->stop('msg_cannot_download');
+ }
+
+ // 포인트 차감
+ $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);
+ }
+ }
+?>
diff --git a/addons/point_level_icon/.point_level_icon.addon.php.swp b/addons/point_level_icon/.point_level_icon.addon.php.swp
new file mode 100644
index 000000000..0aac604b5
Binary files /dev/null and b/addons/point_level_icon/.point_level_icon.addon.php.swp differ
diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml
new file mode 100644
index 000000000..1a9260fd7
--- /dev/null
+++ b/addons/point_level_icon/conf/info.xml
@@ -0,0 +1,11 @@
+
+
+ 포인트 레벨 아이콘 표시 애드온
+
+ 제로
+
+ 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다.
+ 레벨 아이콘은 모듈 > 포인트시스템에서 선택 가능합니다.
+
+
+
diff --git a/addons/point_level_icon/point_level_icon.addon.php b/addons/point_level_icon/point_level_icon.addon.php
new file mode 100644
index 000000000..e50591b37
--- /dev/null
+++ b/addons/point_level_icon/point_level_icon.addon.php
@@ -0,0 +1,17 @@
+]*)member_([0-9\-]*)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oPointController, 'transLevelIcon'), $output);
+?>
diff --git a/modules/point/conf/info.xml b/modules/point/conf/info.xml
new file mode 100644
index 000000000..64235d2dd
--- /dev/null
+++ b/modules/point/conf/info.xml
@@ -0,0 +1,12 @@
+
+
+ 포인트 시스템
+
+ 제로
+
+ 글작성/삭제/댓글작성/삭제시에 포인트를 부여할 수 있습니다.
+ 포인트마다 레벨을 지정하여 사용자 이름 앞에 아이콘을 표시할 수도 있습니다.
+ 단 포인트 관련 애드온을 활성화 시키셔야 됩니다.
+
+
+
diff --git a/modules/point/conf/module.xml b/modules/point/conf/module.xml
new file mode 100644
index 000000000..3383cdf9f
--- /dev/null
+++ b/modules/point/conf/module.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/icons/default/0.gif b/modules/point/icons/default/0.gif
new file mode 100755
index 000000000..efaa21145
Binary files /dev/null and b/modules/point/icons/default/0.gif differ
diff --git a/modules/point/icons/default/1.gif b/modules/point/icons/default/1.gif
new file mode 100755
index 000000000..6ad33d739
Binary files /dev/null and b/modules/point/icons/default/1.gif differ
diff --git a/modules/point/icons/default/10.gif b/modules/point/icons/default/10.gif
new file mode 100755
index 000000000..0f9fb0271
Binary files /dev/null and b/modules/point/icons/default/10.gif differ
diff --git a/modules/point/icons/default/11.gif b/modules/point/icons/default/11.gif
new file mode 100755
index 000000000..007bf5872
Binary files /dev/null and b/modules/point/icons/default/11.gif differ
diff --git a/modules/point/icons/default/12.gif b/modules/point/icons/default/12.gif
new file mode 100755
index 000000000..182a42785
Binary files /dev/null and b/modules/point/icons/default/12.gif differ
diff --git a/modules/point/icons/default/13.gif b/modules/point/icons/default/13.gif
new file mode 100755
index 000000000..f0fe7f6d0
Binary files /dev/null and b/modules/point/icons/default/13.gif differ
diff --git a/modules/point/icons/default/14.gif b/modules/point/icons/default/14.gif
new file mode 100755
index 000000000..8e0061d2b
Binary files /dev/null and b/modules/point/icons/default/14.gif differ
diff --git a/modules/point/icons/default/15.gif b/modules/point/icons/default/15.gif
new file mode 100755
index 000000000..db8837344
Binary files /dev/null and b/modules/point/icons/default/15.gif differ
diff --git a/modules/point/icons/default/16.gif b/modules/point/icons/default/16.gif
new file mode 100755
index 000000000..e014dfd47
Binary files /dev/null and b/modules/point/icons/default/16.gif differ
diff --git a/modules/point/icons/default/17.gif b/modules/point/icons/default/17.gif
new file mode 100755
index 000000000..6492fd21c
Binary files /dev/null and b/modules/point/icons/default/17.gif differ
diff --git a/modules/point/icons/default/18.gif b/modules/point/icons/default/18.gif
new file mode 100755
index 000000000..a01cf8984
Binary files /dev/null and b/modules/point/icons/default/18.gif differ
diff --git a/modules/point/icons/default/19.gif b/modules/point/icons/default/19.gif
new file mode 100755
index 000000000..b8bcd4228
Binary files /dev/null and b/modules/point/icons/default/19.gif differ
diff --git a/modules/point/icons/default/2.gif b/modules/point/icons/default/2.gif
new file mode 100755
index 000000000..713e5b64b
Binary files /dev/null and b/modules/point/icons/default/2.gif differ
diff --git a/modules/point/icons/default/20.gif b/modules/point/icons/default/20.gif
new file mode 100755
index 000000000..c1efbb8d2
Binary files /dev/null and b/modules/point/icons/default/20.gif differ
diff --git a/modules/point/icons/default/21.gif b/modules/point/icons/default/21.gif
new file mode 100755
index 000000000..3a5828fba
Binary files /dev/null and b/modules/point/icons/default/21.gif differ
diff --git a/modules/point/icons/default/22.gif b/modules/point/icons/default/22.gif
new file mode 100755
index 000000000..e184dcc33
Binary files /dev/null and b/modules/point/icons/default/22.gif differ
diff --git a/modules/point/icons/default/23.gif b/modules/point/icons/default/23.gif
new file mode 100755
index 000000000..0787ca8b1
Binary files /dev/null and b/modules/point/icons/default/23.gif differ
diff --git a/modules/point/icons/default/24.gif b/modules/point/icons/default/24.gif
new file mode 100755
index 000000000..c61d5a3bc
Binary files /dev/null and b/modules/point/icons/default/24.gif differ
diff --git a/modules/point/icons/default/25.gif b/modules/point/icons/default/25.gif
new file mode 100755
index 000000000..9de0ffb8a
Binary files /dev/null and b/modules/point/icons/default/25.gif differ
diff --git a/modules/point/icons/default/26.gif b/modules/point/icons/default/26.gif
new file mode 100755
index 000000000..c188cf0c3
Binary files /dev/null and b/modules/point/icons/default/26.gif differ
diff --git a/modules/point/icons/default/27.gif b/modules/point/icons/default/27.gif
new file mode 100755
index 000000000..96947cee7
Binary files /dev/null and b/modules/point/icons/default/27.gif differ
diff --git a/modules/point/icons/default/28.gif b/modules/point/icons/default/28.gif
new file mode 100755
index 000000000..988588b5d
Binary files /dev/null and b/modules/point/icons/default/28.gif differ
diff --git a/modules/point/icons/default/29.gif b/modules/point/icons/default/29.gif
new file mode 100755
index 000000000..9ccb0ca18
Binary files /dev/null and b/modules/point/icons/default/29.gif differ
diff --git a/modules/point/icons/default/3.gif b/modules/point/icons/default/3.gif
new file mode 100755
index 000000000..82bc3171c
Binary files /dev/null and b/modules/point/icons/default/3.gif differ
diff --git a/modules/point/icons/default/30.gif b/modules/point/icons/default/30.gif
new file mode 100755
index 000000000..49695680e
Binary files /dev/null and b/modules/point/icons/default/30.gif differ
diff --git a/modules/point/icons/default/4.gif b/modules/point/icons/default/4.gif
new file mode 100755
index 000000000..554bef415
Binary files /dev/null and b/modules/point/icons/default/4.gif differ
diff --git a/modules/point/icons/default/5.gif b/modules/point/icons/default/5.gif
new file mode 100755
index 000000000..9df6ad65d
Binary files /dev/null and b/modules/point/icons/default/5.gif differ
diff --git a/modules/point/icons/default/6.gif b/modules/point/icons/default/6.gif
new file mode 100755
index 000000000..6970c7ae5
Binary files /dev/null and b/modules/point/icons/default/6.gif differ
diff --git a/modules/point/icons/default/7.gif b/modules/point/icons/default/7.gif
new file mode 100755
index 000000000..728943e9a
Binary files /dev/null and b/modules/point/icons/default/7.gif differ
diff --git a/modules/point/icons/default/8.gif b/modules/point/icons/default/8.gif
new file mode 100755
index 000000000..27a1db3e7
Binary files /dev/null and b/modules/point/icons/default/8.gif differ
diff --git a/modules/point/icons/default/9.gif b/modules/point/icons/default/9.gif
new file mode 100755
index 000000000..ed2d11574
Binary files /dev/null and b/modules/point/icons/default/9.gif differ
diff --git a/modules/point/lang/ko.lang.php b/modules/point/lang/ko.lang.php
new file mode 100644
index 000000000..e142c67ed
--- /dev/null
+++ b/modules/point/lang/ko.lang.php
@@ -0,0 +1,45 @@
+
+ * @brief 포인트 (point) 모듈의 기본 언어팩
+ **/
+
+ $lang->point = "포인트";
+ $lang->level = "레벨";
+
+ $lang->about_point_module = "포인트 모듈은 글작성/댓글작성/업로드/다운로드등의 행동을 할때 포인트를 부여할 수 있습니다.
단 포인트 모듈에서는 설정만 할 뿐이고 포인트 애드온을 활성화 시켜야 포인트가 누적이 됩니다";
+ $lang->about_act_config = "게시판,블로그등의 모듈마다 글작성/삭제/댓글작성/삭제등의 action이 있습니다.
게시판/블로그외의 모듈에 포인트 기능 연동을 하고 싶을때는 각 기능에 맞는 act값을 추가해주시면 됩니다.
연결은 ,(콤마)로 해주시면 됩니다.";
+
+ $lang->max_level = '최고 레벨';
+ $lang->about_max_level = '최고레벨을 지정하실 수 있습니다. 레벨 아이콘을 염두에 두셔야 하고 최고 레벨은 100이 한계입니다';
+
+ $lang->level_icon = '레벨 아이콘';
+ $lang->about_level_icon = '레벨아이콘은 ./modules/point/icons/레벨.gif 로 지정되며 최고레벨과 아이콘셋이 다를 수 있으니 주의해주세요';
+
+ $lang->point_name = '포인트 명칭';
+ $lang->about_point_name = '포인트의 이름이나 단위를 정하실 수 있습니다';
+
+ $lang->level_point = '레벨 포인트';
+ $lang->about_level_point = '아래 각 레벨별 포인트에 도달하거나 감소하게 되면 레벨이 조절됩니다';
+
+ $lang->disable_download = '다운로드 금지';
+ $lang->about_disable_download = '포인트가 없을 경우 다운로드를 금지하게 합니다. (이미지파일은 제외입니다)';
+
+ $lang->about_module_point = '모듈별로 포인트를 지정할 수 있으며 지정되지 않은 모듈은 기본 포인트를 이용하게 됩니다
모든 점수는 반대 행동을 하였을 경우 원상복귀 됩니다.';
+
+ $lang->point_insert_document = '글 작성';
+ $lang->point_delete_document = '글 삭제';
+ $lang->point_insert_comment = '댓글 작성';
+ $lang->point_delete_comment = '댓글 삭제';
+ $lang->point_upload_file = '파일 업로드';
+ $lang->point_delete_file = '파일 업로드';
+ $lang->point_download_file = '파일 다운로드 (이미지 제외)';
+
+
+ $lang->cmd_point_config = '기본 설정';
+ $lang->cmd_point_module_config = '모듈별 설정';
+ $lang->cmd_point_act_config = '기능별 act 설정';
+
+ $lang->msg_cannot_download = '포인트가 부족하여 다운로드를 하실 수 없습니다';
+?>
diff --git a/modules/point/point.admin.controller.php b/modules/point/point.admin.controller.php
new file mode 100644
index 000000000..51e82119d
--- /dev/null
+++ b/modules/point/point.admin.controller.php
@@ -0,0 +1,138 @@
+getModuleConfig('point');
+
+ // 변수 정리
+ $args = Context::getRequestVars();
+
+ $config->point_name = $args->point_name;
+ if(!$config->point_name) $config->point_name = 'point';
+
+ $config->max_level = $args->max_level;
+ if($config->max_level>100) $config->max_level = 100;
+ if($config->max_level<1) $config->max_level = 1;
+
+ $config->level_icon = $args->level_icon;
+ if($args->disable_download == 'Y') $config->disable_download = 'Y';
+ else $config->disable_download = 'N';
+
+ for($i=1;$i<=$config->max_level;$i++) {
+ $key = "level_step_".$i;
+ $config->level_step[$i] = (int)$args->{$key};
+ }
+
+ // 저장
+ $oModuleController = &getController('module');
+ $oModuleController->insertModuleConfig('point', $config);
+
+ $this->cacheActList();
+
+ $this->setMessage('success_updated');
+ }
+
+ /**
+ * @brief 모듈별 설정 저장
+ **/
+ function procPointAdminInsertModuleConfig() {
+ // 설정 정보 가져오기
+ $oModuleModel = &getModel('module');
+ $config = $oModuleModel->getModuleConfig('point');
+
+ // 변수 정리
+ $args = Context::getRequestVars();
+
+ $config->insert_document = $args->insert_document;
+ $config->insert_comment = $args->insert_comment;
+ $config->upload_file = $args->upload_file;
+ $config->download_file = $args->download_file;
+
+ foreach($args as $key => $val) {
+ preg_match("/^(insert_document|insert_comment|upload_file|download_file)_([0-9]+)$/", $key, $matches);
+ if(!$matches[1]) continue;
+ $name = $matches[1];
+ $module_srl = $matches[2];
+ if(strlen($val)==0) unset($config->module_point[$module_srl][$name]);
+ else $config->module_point[$module_srl][$name] = $val;
+ }
+
+ // 저장
+ $oModuleController = &getController('module');
+ $oModuleController->insertModuleConfig('point', $config);
+
+ $this->cacheActList();
+
+ $this->setMessage('success_updated');
+ }
+
+ /**
+ * @brief 기능별 act 저장
+ **/
+ function procPointAdminInsertActConfig() {
+ // 설정 정보 가져오기
+ $oModuleModel = &getModel('module');
+ $config = $oModuleModel->getModuleConfig('point');
+
+ // 변수 정리
+ $args = Context::getRequestVars();
+
+ $config->insert_document_act = $args->insert_document_act;
+ $config->delete_document_act = $args->delete_document_act;
+ $config->insert_comment_act = $args->insert_comment_act;
+ $config->delete_comment_act = $args->delete_comment_act;
+ $config->upload_file_act = $args->upload_file_act;
+ $config->delete_file_act = $args->delete_file_act;
+ $config->download_file_act = $args->download_file_act;
+
+ // 저장
+ $oModuleController = &getController('module');
+ $oModuleController->insertModuleConfig('point', $config);
+
+ $this->cacheActList();
+
+ $this->setMessage('success_updated');
+ }
+
+ /**
+ * @brief 캐시파일 저장
+ **/
+ function cacheActList() {
+ // 설정 정보 가져오기
+ $oModuleModel = &getModel('module');
+ $config = $oModuleModel->getModuleConfig('point');
+
+ // 각 act값을 정리
+ $act_list = sprintf("%s,%s,%s,%s,%s,%s,%s",
+ $config->insert_document_act,
+ $config->delete_document_act,
+ $config->insert_comment_act,
+ $config->delete_comment_act,
+ $config->upload_file_act,
+ $config->delete_file_act,
+ $config->download_file_act
+ );
+
+ $act_cache_file = "./files/cache/point.act.cache";
+ FileHandler::writeFile($act_cache_file, $act_list);
+ }
+
+ }
+?>
diff --git a/modules/point/point.admin.view.php b/modules/point/point.admin.view.php
new file mode 100644
index 000000000..2f8d8b1b2
--- /dev/null
+++ b/modules/point/point.admin.view.php
@@ -0,0 +1,59 @@
+getModuleConfig('point');
+ Context::set('config', $config);
+
+ // 설정 변수 지정
+ Context::set('config', $config);
+
+ // template path지정
+ $this->setTemplatePath($this->module_path.'tpl');
+ }
+
+ /**
+ * @brief 기본 설정
+ **/
+ function dispPointAdminConfig() {
+ // 레벨 아이콘 목록 구함
+ $level_icon_list = FileHandler::readDir("./modules/point/icons");
+ Context::set('level_icon_list', $level_icon_list);
+
+ // 템플릿 지정
+ $this->setTemplateFile('config');
+ }
+
+ /**
+ * @brief 모듈별 점수 지정
+ **/
+ function dispPointAdminModuleConfig() {
+ // mid 목록 가져오기
+ $oModuleModel = &getModel('module');
+ $mid_list = $oModuleModel->getMidList();
+ Context::set('mid_list', $mid_list);
+
+ // 템플릿 지정
+ $this->setTemplateFile('module_config');
+ }
+
+ /**
+ * @brief 기능별 act 설정
+ **/
+ function dispPointAdminActConfig() {
+ // 템플릿 지정
+ $this->setTemplateFile('action_config');
+ }
+ }
+?>
diff --git a/modules/point/point.class.php b/modules/point/point.class.php
new file mode 100644
index 000000000..33f282b40
--- /dev/null
+++ b/modules/point/point.class.php
@@ -0,0 +1,92 @@
+insertActionForward('point', 'view', 'dispPointAdminConfig');
+ $oModuleController->insertActionForward('point', 'view', 'dispPointAdminModuleConfig');
+ $oModuleController->insertActionForward('point', 'view', 'dispPointAdminActConfig');
+
+ // 포인트 정보를 기록할 디렉토리 생성
+ FileHandler::makeDir('./files/member_extra_info/point');
+
+ $oModuleController = &getController('module');
+
+ // 최고레벨
+ $config->max_level = 30;
+
+ // 레벨별 점수
+ for($i=1;$i<=30;$i++) {
+ $config->level_step[$i] = pow($i,2)*90;
+ }
+
+ // 포인트 호칭
+ $config->point_name = 'point';
+
+ // 레벨 아이콘 디렉토리
+ $config->level_icon = "default";
+
+ // 점수가 없을때 다운로드 금지 기능
+ $config->disable_download = false;
+
+ /**
+ * 모듈별 기본 점수 및 각 action 정의 (게시판,블로그외에 어떤 모듈이 생길지 모르니 act값을 명시한다
+ **/
+ // 글작성
+ $config->insert_document = 10;
+
+ $config->insert_document_act = 'procBoardInsertDocument';
+ $config->delete_document_act = 'procBoardDeleteDocument';
+
+ // 댓글작성
+ $config->insert_comment = 5;
+
+ $config->insert_comment_act = 'procBoardInsertComment,procBlogInsertComment';
+ $config->delete_comment_act = 'procBoardDeleteComment,procBlogDeleteComment';
+
+ // 업로드
+ $config->upload_file = 5;
+
+ $config->upload_file_act = 'procFileUpload';
+ $config->delete_file_act = 'procFileDelete';
+
+ // 다운로드
+ $config->download_file = -5;
+ $config->download_file_act = 'procFileDownload';
+
+ // 설정 저장
+ $oModuleController->insertModuleConfig('point', $config);
+
+ // 빠른 실행을 위해서 act list를 캐싱
+ $oPointController = &getAdminController('point');
+ $oPointController->cacheActList();
+
+ return new Object();
+ }
+
+ /**
+ * @brief 설치가 이상이 없는지 체크하는 method
+ **/
+ function checkUpdate() {
+ return false;
+ }
+
+ /**
+ * @brief 업데이트 실행
+ **/
+ function moduleUpdate() {
+ return new Object(0, 'success_updated');
+ }
+
+ }
+?>
diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php
new file mode 100644
index 000000000..c761c6a10
--- /dev/null
+++ b/modules/point/point.controller.php
@@ -0,0 +1,85 @@
+member_srl = $member_srl;
+ $args->point = $point;
+
+ // 포인트가 있는지 체크
+ $oPointModel = &getModel('point');
+ if($oPointModel->isExistsPoint($member_srl)) {
+ executeQuery("point.updatePoint", $args);
+ } else {
+ executeQuery("point.insertPoint", $args);
+ }
+
+ // 캐시 설정
+ $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl));
+ FileHandler::makedir($cache_path);
+
+ $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl);
+ FileHandler::writeFile($cache_filename, $point);
+
+ return $output;
+ }
+
+ /**
+ * @brief 포인트 레벨 아이콘 표시
+ **/
+ function transLevelIcon($matches) {
+ if(!$this->config) {
+ $oModuleModel = &getModel('module');
+ $this->config = $oModuleModel->getModuleConfig('point');
+ }
+
+ if(!$this->oPointModel) $this->oPointModel = &getModel('point');
+
+ $member_srl = $matches[3];
+ if($this->member_code[$member_srl]) return $this->member_code[$member_srl];
+
+ $point = $this->oPointModel->getPoint($member_srl);
+ $level = $this->oPointModel->getLevel($point, $this->config->level_step);
+
+ $src = sprintf("modules/point/icons/%s/%d.gif", $this->config->level_icon, $level);
+ if(!$this->icon_width) {
+ $info = getimagesize($src);
+ $this->icon_width = $info[0];
+ $this->icon_height = $info[1];
+ }
+
+ if($level < $this->config->max_level) {
+ $next_point = $this->config->level_step[$level+1];
+ if($next_point > 0) {
+ $per = (int)($point / $next_point*100);
+ }
+ }
+
+ $code = str_replace('<'.$matches[6], sprintf('<%s title="%s:%s%s, %s:%s/%s" style="cursor:pointer;background:url(%s) no-repeat left;padding-left:%dpx; height:%dpx" ', $matches[1], Context::getLang('point'), $point, $per?"(".$per."%)":"", Context::getLang('level'), $level, $this->config->max_level, Context::getRequestUri().$src, $this->icon_width+2, $this->icon_height), $matches[0] );
+ $this->member_code[$member_srl] = $code;
+
+ return $this->member_code[$member_srl];
+ }
+ }
+?>
diff --git a/modules/point/point.model.php b/modules/point/point.model.php
new file mode 100644
index 000000000..6a0a7f461
--- /dev/null
+++ b/modules/point/point.model.php
@@ -0,0 +1,54 @@
+member_srl = $member_srl;
+ $output = executeQuery('point.getPoint', $args);
+ if($output->data->member_srl == $member_srl) return true;
+ return false;
+ }
+
+ /**
+ * @brief 포인트를 구해옴
+ **/
+ function getPoint($member_srl, $from_db = false) {
+ $cache_filename = sprintf('./files/member_extra_info/point/%s%d.cache.txt', getNumberingPath($member_srl), $member_srl);
+
+ if(!$from_db && file_exists($target_filename)) return trim(FileHandler::readFile($cache_filename));
+
+ // DB에서 가져옴
+ $args->member_srl = $member_srl;
+ $output = executeQuery('point.getPoint', $args);
+ $point = (int)$output->data->point;
+
+ FileHandler::writeFile($cache_filename, $point);
+
+ return $point;
+ }
+
+ /**
+ * @brief 레벨을 구함
+ **/
+ function getLevel($point, $level_step) {
+ $level_count = count($level_step);
+ for($level=0;$level<=$level_count;$level++) if($point < $level_step[$level]) break;
+ $level --;
+ return $level;
+ }
+ }
+?>
diff --git a/modules/point/queries/getPoint.xml b/modules/point/queries/getPoint.xml
new file mode 100644
index 000000000..320fb585a
--- /dev/null
+++ b/modules/point/queries/getPoint.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/queries/insertPoint.xml b/modules/point/queries/insertPoint.xml
new file mode 100644
index 000000000..b8c08907f
--- /dev/null
+++ b/modules/point/queries/insertPoint.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/queries/updatePoint.xml b/modules/point/queries/updatePoint.xml
new file mode 100644
index 000000000..3955d0151
--- /dev/null
+++ b/modules/point/queries/updatePoint.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/schemas/point.xml b/modules/point/schemas/point.xml
new file mode 100644
index 000000000..b5ea15a56
--- /dev/null
+++ b/modules/point/schemas/point.xml
@@ -0,0 +1,4 @@
+
diff --git a/modules/point/skins/default/css/poll.css b/modules/point/skins/default/css/poll.css
new file mode 100644
index 000000000..ee5a1020e
--- /dev/null
+++ b/modules/point/skins/default/css/poll.css
@@ -0,0 +1,81 @@
+.poll_box {
+ border:3px solid #555555;
+ background-color:#EEEEEE;
+ margin:5px;
+ padding:8px 5px 8px 5px;
+}
+
+.poll_title_box {
+ border:2px solid #444444;
+ background-color:#888888;
+ color:#FFFFFF;
+ font-weight:bold;
+ margin:5px;
+ padding:5px;
+ height:13px;
+ clear:both;
+}
+
+.poll_stop_date {
+ float:left;
+}
+
+.poll_join_count {
+ float:right;
+}
+
+.poll_detail_box {
+ border:1px solid #444444;
+ background-color:#FFFFFF;
+ margin:5px;
+ padding-bottom:5px;
+}
+
+.poll_detail_box .title {
+ background-color:#555555;
+ color:#FFFFFF;
+ padding:5px;
+ font-weight:bold;
+}
+
+.poll_detail_box .item {
+ padding:5px;
+ border-bottom:1px solid #EEEEEE;
+}
+
+.poll_detail_box .checkcount {
+ background-color:#AAAAAA;
+ text-align:right;
+ color:#EEEEEE;
+ padding:5px;
+}
+
+.poll_detail_box .text {
+ margin:5px 0px 5px 20px;
+}
+
+.poll_detail_box .bar_box {
+ width:80%;
+ margin-bottom:10px;
+ border:1px solid #DDDDDD;
+ margin:0px 5px 5px 35px;
+ padding:1px;
+}
+
+.poll_detail_box .bar {
+ background-color:#444444;
+ border-bottom:1px solid #AAAAAA;
+ height:5px;
+}
+
+
+.poll_button_area {
+ text-align:center;
+}
+
+.poll_button {
+ border:1px solid #555555;
+ background-color:#FFFFFF;
+ font-weight:bold;
+ height:20px;
+}
diff --git a/modules/point/skins/default/filter/poll.xml b/modules/point/skins/default/filter/poll.xml
new file mode 100644
index 000000000..2639e3195
--- /dev/null
+++ b/modules/point/skins/default/filter/poll.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/skins/default/form.html b/modules/point/skins/default/form.html
new file mode 100644
index 000000000..f6ac6e6f1
--- /dev/null
+++ b/modules/point/skins/default/form.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
diff --git a/modules/point/skins/default/images/blank.gif b/modules/point/skins/default/images/blank.gif
new file mode 100644
index 000000000..35d42e808
Binary files /dev/null and b/modules/point/skins/default/images/blank.gif differ
diff --git a/modules/point/skins/default/js/poll.js b/modules/point/skins/default/js/poll.js
new file mode 100644
index 000000000..e497eee65
--- /dev/null
+++ b/modules/point/skins/default/js/poll.js
@@ -0,0 +1,51 @@
+/* 설문 참여 함수 */
+function doPoll(fo_obj) {
+
+ var checkcount = new Array();
+ var item = new Array();
+
+ for(var i=0;i-1) {
+ var t = name.split('_');
+ var poll_srl_index = parseInt(t[1],10);
+ checkcount[poll_srl_index] = obj.value;
+ item[poll_srl_index] = new Array();
+
+ } else if(name.indexOf('item_')>-1) {
+ var t = name.split('_');
+ var poll_srl = parseInt(t[1],10);
+ var poll_srl_index = parseInt(t[2],10);
+ if(obj.checked == true) item[poll_srl_index][item[poll_srl_index].length] = obj.value;
+ }
+ }
+
+ var poll_srl_indexes = "";
+ for(var poll_srl_index in checkcount) {
+ var count = checkcount[poll_srl_index];
+ var items = item[poll_srl_index];
+ if(count > items.length) {
+ alert(poll_alert_lang);
+ return false;
+ }
+
+ poll_srl_indexes += items.join(',')+',';
+ }
+ fo_obj.poll_srl_indexes.value = poll_srl_indexes;
+
+ procFilter(fo_obj, poll);
+ return false;
+}
+
+/* 설문 조사후 내용을 바꿀 함수 */
+function completePoll(ret_obj) {
+ alert(ret_obj['message']);
+ var poll_srl = ret_obj['poll_srl'];
+ var tpl = ret_obj['tpl'];
+ var width = xWidth("poll_"+poll_srl);
+ xInnerHtml("poll_"+poll_srl, tpl);
+ xWidth("poll_"+poll_srl, width);
+}
diff --git a/modules/point/skins/default/result.html b/modules/point/skins/default/result.html
new file mode 100644
index 000000000..eeb1636de
--- /dev/null
+++ b/modules/point/skins/default/result.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ {$lang->poll_join_count} : {number_format($poll->poll_count)}
+
+
+ {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")}
+
+
+
+
+
{$val->title} ({$val->poll_count})
+
+ {@$per = (int)(( $item->poll_count / $val->poll_count)*100) }
+
+
+ {$item_srl+1}. {$item->title} : {$item->poll_count} ({$per}%)
+
+
+
+
+
+
+
+
+
diff --git a/modules/point/skins/default/skin.xml b/modules/point/skins/default/skin.xml
new file mode 100644
index 000000000..b78f17f73
--- /dev/null
+++ b/modules/point/skins/default/skin.xml
@@ -0,0 +1,25 @@
+
+
+ 설문조사 기본 스킨
+ アンケート調査デフォルトスキン
+ 投票调查基本皮肤
+ Default Skin of Poll
+
+ 제로
+ Zero
+ zero
+ zero
+ 설문조사 기본 스킨
+ アンケート調査デフォルトスキン
+ 投票调查基本皮肤
+ Default Skin of Poll
+
+
+
+ 기본
+ デフォルト
+ 基本
+ Default
+
+
+
diff --git a/modules/point/tpl/.action_config.html.swp b/modules/point/tpl/.action_config.html.swp
new file mode 100644
index 000000000..156b9fe58
Binary files /dev/null and b/modules/point/tpl/.action_config.html.swp differ
diff --git a/modules/point/tpl/action_config.html b/modules/point/tpl/action_config.html
new file mode 100644
index 000000000..9d571c0db
--- /dev/null
+++ b/modules/point/tpl/action_config.html
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html
new file mode 100644
index 000000000..d471da3ca
--- /dev/null
+++ b/modules/point/tpl/config.html
@@ -0,0 +1,64 @@
+
+
+
+
diff --git a/modules/point/tpl/filter/insert_act_config.xml b/modules/point/tpl/filter/insert_act_config.xml
new file mode 100644
index 000000000..56e18df59
--- /dev/null
+++ b/modules/point/tpl/filter/insert_act_config.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/modules/point/tpl/filter/insert_config.xml b/modules/point/tpl/filter/insert_config.xml
new file mode 100644
index 000000000..20cec621b
--- /dev/null
+++ b/modules/point/tpl/filter/insert_config.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/modules/point/tpl/filter/insert_module_config.xml b/modules/point/tpl/filter/insert_module_config.xml
new file mode 100644
index 000000000..f479559e9
--- /dev/null
+++ b/modules/point/tpl/filter/insert_module_config.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/modules/point/tpl/header.html b/modules/point/tpl/header.html
new file mode 100644
index 000000000..8d58880e8
--- /dev/null
+++ b/modules/point/tpl/header.html
@@ -0,0 +1,12 @@
+
+{$lang->point} {$lang->cmd_management}
+
+
+
+
diff --git a/modules/point/tpl/js/point_admin.js b/modules/point/tpl/js/point_admin.js
new file mode 100644
index 000000000..62d4b2f6b
--- /dev/null
+++ b/modules/point/tpl/js/point_admin.js
@@ -0,0 +1,6 @@
+/**
+ * @file modules/point/js/point_admin.js
+ * @author zero (zero@nzeo.com)
+ * @brief point 모듈의 관리자용 javascript
+ **/
+
diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html
new file mode 100644
index 000000000..0741b5f70
--- /dev/null
+++ b/modules/point/tpl/module_config.html
@@ -0,0 +1,38 @@
+
+
+
+